国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

快速在你的Vue/React應用中實現Ssr(服務端渲染)

開發 前端
對于服務端渲染的頁面,服務端可以直接將帶數據的內容通過 HTML 文本的形式返回,搜索引擎爬蟲可以輕易的獲取頁面內容,而對于客戶端渲染的應用,客戶端必須執行服務器返回的 Javascript 才能得到正確的網頁內容。目前,除 Google、Bing 支持 Javascript 外(也會有一些限制),其他的大部分搜索引擎都不支持 Javascript,也就無法獲取正確的網頁內容。而本文要講的技術方案

前言

我們都知道, Vue和React是構建客戶端應用程序的框架。默認情況下,可以在瀏覽器中輸出自定義組件,進行生成 DOM 和操作 DOM, 也就是我們常說的客戶端渲染, 并且我們大部分主流的場景都是SPA(單頁面)應用, 而隨著 SPA尤其是 React、Vue、Angular 為代表的前端框架的流行,越來越多的 Web App 使用的是客戶端渲染。

圖片

使用客戶端渲染的優勢在于節省后端資源、局部刷新、前后端分離等,但隨著應用的日益復雜, 首屏渲染時間不斷變長, 并且存在嚴重的SEO問題。

所以為了解決SPA應用遇到的這些問題, 我們必須考慮SSR:

服務端渲染(ssr),是指由服務器端完成頁面的HTML 結構拼接,并且直接將拼接好的HTML發送到瀏覽器,然后為其綁定狀態與事件,成為完全可交互頁面的處理技術。

對于服務端渲染的頁面,服務端可以直接將帶數據的內容通過 HTML 文本的形式返回,搜索引擎爬蟲可以輕易的獲取頁面內容,而對于客戶端渲染的應用,客戶端必須執行服務器返回的 Javascript 才能得到正確的網頁內容。目前,除 Google、Bing 支持 Javascript 外(也會有一些限制),其他的大部分搜索引擎都不支持 Javascript,也就無法獲取正確的網頁內容。而本文要講的技術方案,正是為了解決SPA下的SSR技術困境.接下來我們看看常用的ssr技術實現方案。

圖片


圖片

ssr(服務端渲染)技術實現方案

接下來筆者將列舉幾個常用的基于vue/react的服務端渲染方案,如下:

  • 使用next.js/nuxt.js的服務端渲染方案
  • 使用node+vue-server-renderer實現vue項目的服務端渲染
  • 使用node+React renderToStaticMarkup實現react項目的服務端渲染
  • 傳統網站通過模板引擎來實現ssr(比如ejs, jade, pug等)
  • 使用rendertron實現SPA項目的服務端渲染

以上是筆者之前實踐過的方案, 最后一種方案筆者將在下面一節詳細介紹, 因為next/nuxt是已有的服務端渲染解決方案,文檔寫的比較詳細,這里筆者就不再做過多介紹了,這里我們簡單介紹一下第二種和第三種方案。

1.使用node+vue-server-renderer實現vue項目的服務端渲染

首先vue-server-renderer依賴node的api,所以只能運行在node環境, 我們需要先安裝它:

npm install vue vue-server-renderer --save

在node中使用,代碼如下:

const Vue = require('vue')
const server = require('express')()
const renderer = require('vue-server-renderer').createRenderer()


server.get('*', (req, res) => {
const app = new Vue({
data: {
url: req.url
},
template: `<div>趣談前端:{{ url }}</div>`
})


renderer.renderToString(app, (err, html) => {
if (err) {
res.status(500).end('Internal Server Error')
return
}
res.end(`
<!DOCTYPE html>
<html lang="en">
<head><title>Hello</title></head>
<body>${html}</body>
</html>
`)
})
})


server.listen(8080)

當然實際情況比上面的案例要復雜很多, 我們可以專門寫一個template.html,然后通過模板差值的方式導入后端數據,進而實現服務端渲染. 在使用這種方式的時候我們仍然要維護兩套代碼。

2.使用node+React renderToStaticMarkup實現react項目的服務端渲染

使用這種方案和vue的方案類似, 只不過這里我們用了react自帶的api來實現ssr,簡單的實現代碼如下:

var express = require('express');
var app = express();
var React = require('react'),
ReactDOMServer = require('react-dom/server');
var App = React.createFactory(require('./App'));
app.get('/', function(req, res) {
var html = ReactDOMServer.renderToStaticMarkup(
React.DOM.body(
null,
React.DOM.div({id: 'root',
dangerouslySetInnerHTML: {
__html: ReactDOMServer.renderToStaticMarkup(App())
}
})
)
);
res.end(html);
});
app.listen(80, function() {
console.log('running on port ' + 80);
});

以上使用了renderToStaticMarkup, 我們都知道react-dom提供了兩種服務端渲染函數,如下:

renderToString:將 React Component 轉化為 HTML 字符串,生成的 HTML 的 DOM 會帶有額外屬性:各個 DOM 會有data-react-id屬性,第一個 DOM 會有data-checksum屬性。

renderToStaticMarkup:將 React Component 轉化為 HTML 字符串,但是生成 HTML 的 DOM 不會有額外屬性,從而節省 HTML 字符串的大小。

所以這里我們一般使用renderToStaticMarkup函數. 同理在實際業務場景中我們也會寫2套代碼來實現ssr。

使用谷歌rendertron實現服務端渲染

Google 推出的 Rendertron 使得 SPA 也能夠被不支持執行 Javascript 的搜索引擎爬取渲染后的內容。其原理主要是通過使用 Headless Chrome 在內存中執行 Javascript,并在得到完整內容后,將內容返回給客戶端。

我們通常會將 Rendertron 部署為一個獨立的 HTTP 服務,然后為 Web 應用框架配置 Google 官方提供的中間件或者在反向代理上添加相應路由規則,使得能夠在檢測到搜索引擎爬蟲的 UA 時,可以將請求代理給 Rendertron 服務。筆者總結了一下其基本實現原理圖,方便大家理解:

圖片

Rendertron 提供了兩個主要 API:

  • Render 用于渲染網站內容
  • Screenshot 用于將網站內容截圖

在 SEO 場景下我們使用的是 Render 接口。

比如當客戶端請求我們的網站時,我們服務端可以根據請求頭 User Agent 發現是否包含了 Baiduspider/2.0 關鍵字,如果是, 那么可以認定為當前的客戶端是一個百度爬蟲此時可以將這個請求代理 Rendertron 服務的 /render/客戶端請求地址 路由,讓 Rendertron 幫助執行網頁內的 Javascript,并將最終內容返回給搜索引擎爬蟲。

使用Rendertron的好處在于我們可以不用考慮服務端渲染的部分,完全按照SPA的模式開發項目,也不用為了兼容服務端渲染而寫多余的兼容代碼。

具體實現

首先我們需要安裝Rendertron, 可以在github中找到其安裝和使用方法,在安裝前最好先安裝docker, 目前docker的最新版本以支持傻瓜式安裝,所以安裝啟動都非常方便。

1.本地運行

在安裝好docker之后, 我們先全局安裝rendertron:

npm install -g rendertron

然后我們需要安裝谷歌瀏覽器(作為合格的開發都應該有谷歌瀏覽器~),然后就可以用它的cli來啟動服務了,我們只需要在命令行執行如下命令:

rendertron

之后控制臺會打印本地服務啟動的地址,比如localhost:3000 這個時候我們只需要在地址后面輸入我們想渲染的網站即可:localhost:3000:render/你的網站地址, 如下圖所示:

圖片

此時我們的rendertron服務已經搭建完成, 接下來我們可以在服務端來實現ssr了,代碼如下:

const koa = require('koa');
const app = new koa();
app.use(async (ctx, next) => {
ctx.type = "html";
if(/Baiduspider\/2\.0/g.ctx.header['user-agent']) {
// 是百度爬蟲,則轉發到rendertron服務中
ctx.redirect(`http://localhost:3000/render/${ctx.url}`)
}else {
// 渲染正常的路由頁面
}

await next();
})

app.listen('80');

當然如果我們后端技術棧采用的是express, rendertron有專門的中間件可以使用, 不僅僅可以攔截百度的爬蟲,具體用法如下:

const express = require('express');
const rendertron = require('rendertron-middleware');

const app = express();

app.use(rendertron.makeMiddleware({
proxyUrl: 'http://your-rendertron-instance/render',
}));

// 正常的路由和頁面渲染邏輯
app.use(...);
app.listen(81);

所以為了降低開發成本筆者建議可以采用rendertron的方案, 單獨部署一套服務器用來實現ssr. 但是我們需要考慮當網站流量增加時的擴容問題,以及配置搭建反向代理或負載均衡等配套服務。

圖片


后期展望

后期筆者將會繼續帶大家探索大前端相關內容, 基本框架如下:

圖片


責任編輯:武曉燕 來源: 趣談前端
相關推薦

2024-01-16 08:05:53

2021-04-30 09:32:38

服務端渲染SSR

2025-07-04 03:00:00

2021-04-26 13:20:06

Vue服務端渲染前端

2017-07-25 14:07:14

前端Vue模板渲染

2024-02-22 13:47:40

2019-03-20 11:20:31

VueWeb 前端

2020-11-03 14:10:29

Vue服務端渲染前端

2024-01-25 09:04:25

2024-01-15 08:08:27

2021-08-04 08:33:25

React服務端渲染

2024-11-05 18:18:48

2025-10-03 00:00:03

React服務端渲染SSR

2024-04-10 10:09:07

2021-12-27 08:31:42

Next.js SSRSSG

2022-02-05 08:20:25

DeepSpeech開源軟件開發

2023-05-09 07:16:06

2025-07-01 08:24:10

2025-02-26 08:39:25

2025-10-10 05:11:00

點贊
收藏

51CTO技術棧公眾號

中文在线三区| 在线观看视频一区二区三区| 国产精品xvideos88| 亚洲精品高清在线| 亚洲小视频在线观看| 国产主播色在线| 1024精品久久久久久久久| 超碰免费在线观看| 波多野结衣av在线| 成人高清免费| 国产精品亚洲a| 午夜欧美一区二区三区免费观看| 51成人做爰www免费看网站| 国产欧美日韩最新| 国产精品久久久久久超碰| 欧美日韩电影在线观看| 手机看片福利盒子久久| 精品国产免费久久| 日本韩国视频一区二区| 天天操天天综合网| 樱花草国产18久久久久| 亚洲久草在线视频| 国产精品久久久久久久久图文区| 国产精品免费aⅴ片在线观看| 97久久超碰国产精品| 正在播放日韩精品| gogogo高清在线观看一区二区| 成人免费电影视频| 欧美变态口味重另类| 成人欧美在线观看| 一区二区三区欧美在线| 伦理一区二区| 免费av在线| 国产午夜精品一区二区三区四区| 欧美成人精品在线观看| av网站在线免费观看| 欧美一区二区三级| 国产精品18久久久久久首页狼| 成人午夜在线| 99久久国产综合色|国产精品| 777奇米四色成人影色区| 日本大臀精品| 中文字幕亚洲影视| 不卡av电影在线观看| aaa大片在线观看| av中文一区| 777午夜精品福利在线观看| 亚洲搞黄视频| 日本在线不卡视频一二三区| 少妇免费毛片久久久久久久久| 中文字幕在线视频免费观看| 中文字幕+乱码+中文字幕一区| 日本一区二区三区电影免费观看| 欧美另类z0zxhd电影| 日韩片电影在线免费观看| 2022国产精品视频| 欧美黄色片视频| 伊人久久一区| 777久久精品一区二区三区无码| 亚洲欧美色图| 亚洲妇女屁股眼交7| 5g影院天天爽成人免费下载| 免费a在线看| 日日欢夜夜爽一区| 在线日韩日本国产亚洲| 久草热视频在线观看| 久久中文字幕导航| 欧美午夜久久久| 欧美日本亚洲| 福利在线免费视频| 一区二区三区中文字幕| 成人自拍性视频| 精品麻豆一区二区三区| 丝袜脚交一区二区| 日韩中文字幕网| 369你懂的电影天堂| 欧美日韩理论| 中文字幕在线中文| 欧美牲交a欧美牲交| 50路60路老熟妇啪啪| 国产精品正在播放| 国产成人无码av在线播放dvd| 国产一区二区三区电影在线观看| 少妇免费毛片久久久久久久久| 国产欧美日韩综合| 黄色网址入口| 麻豆精品视频在线观看视频| 亚洲精品美女久久7777777| 久久99国产精品麻豆| 欧美最顶级丰满的aⅴ艳星| 亚洲三级电影| 久久精品2019中文字幕| 成人淫片免费视频95视频| 欧美日韩亚洲国产综合| 国产区视频在线| 国产欧美一区二区精品性| 初尝黑人巨炮波多野结衣电影| 亚洲综合成人在线视频| 日韩精品视频在线观看视频| 1024国产精品| 国产a级一级片| 亚洲色图.com| 国产一级二级在线| 欧美一区二区视频在线观看| 成人影院大全| 亚洲午夜精品17c| 国产三线在线| 日韩精品视频免费| 国产va免费精品观看精品视频| 精品亚洲一区二区三区| 国产毛片一区二区三区| 欧美在线视频一二三| 国精品产品一区| 色婷婷综合视频在线观看| 亚洲区欧洲区| 欧美午夜片在线看| 六十路在线观看| 欧美国产日韩在线观看| 亚洲一区二区精品在线观看| 永久亚洲成a人片777777| 尤物tv国产一区| 免费在线一级视频| 久久亚洲精品视频| 欧美成人aaa| 色婷婷精品久久二区二区蜜臀av| 国产主播自拍av| 麻豆视频一区二区| 无遮挡亚洲一区| 中文字幕亚洲精品乱码| 成人免费午夜电影| 欧美调教网站| 欧美激情精品久久久久久免费印度 | 丝袜国产在线| 欧美激情网址| 毛片在线视频播放| 欧美日韩在线第一页| 91社区在线| 欧美精品一区二区三区一线天视频 | 免费无遮挡无码永久视频| 老司机午夜精品| 免费男女羞羞的视频网站主页在线观看 | 亚洲第一页在线| 中文视频一区| 懂色一区二区三区av片| 欧美日韩国产一区二区| 人妖一区二区三区| 日韩欧美你懂的| 午夜av一区| 亚洲成人a**址| 精品视频在线免费| 麻豆视频在线观看免费网站| 热草久综合在线| 久久综合亚州| www.久草| 亚洲一区二区三区国产| 中文字幕精品影院| 日本xxxxx18| 亚洲最新视频在线观看| 天堂在线免费av| 色噜噜色狠狠狠狠狠综合色一 | 91精品动漫在线观看| 成人免费视频一区| 欧美性感一类影片在线播放| 欧美专区中文字幕| 国产精品啪啪啪视频| av影片在线看| 亚洲男人都懂第一日本| 国产99久久久精品| 欧美精品123区| 99porn视频在线| 永久免费的av网站| 国产精品视频一区视频二区| 亚洲三级视频网站| 一区二区三区www| 国内一区二区在线视频观看| 加勒比日本影视| 日韩精品一级| 国产一区二区三区日韩| 精品国产乱码久久久久久蜜臀| 亚洲综合国产精品| 日本一级在线观看| 欧洲grand老妇人| 亚洲欧美激情插| 欧美日韩国产va另类| 91丝袜美腿美女视频网站| 国产欧美日韩激情| 97电影在线观看| 欧美另类在线播放| 久久国产福利| 成人亚洲一区二区三区| 欧美男女性生活在线直播观看| av在线播放一区二区| www.在线视频.com| 成人国产精品一区| 福利一区二区在线| 一本到av在线| 亚洲欧美自偷自拍另类| 97伦理在线四区| 日韩经典第一页| 免费在线看成人av|