精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

快速在你的Vue/React應(yīng)用中實(shí)現(xiàn)Ssr(服務(wù)端渲染)

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

前言

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

圖片

使用客戶端渲染的優(yōu)勢(shì)在于節(jié)省后端資源、局部刷新、前后端分離等,但隨著應(yīng)用的日益復(fù)雜, 首屏渲染時(shí)間不斷變長, 并且存在嚴(yán)重的SEO問題。

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

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

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

圖片


圖片

ssr(服務(wù)端渲染)技術(shù)實(shí)現(xiàn)方案

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

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

以上是筆者之前實(shí)踐過的方案, 最后一種方案筆者將在下面一節(jié)詳細(xì)介紹, 因?yàn)閚ext/nuxt是已有的服務(wù)端渲染解決方案,文檔寫的比較詳細(xì),這里筆者就不再做過多介紹了,這里我們簡單介紹一下第二種和第三種方案。

1.使用node+vue-server-renderer實(shí)現(xiàn)vue項(xiàng)目的服務(wù)端渲染

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

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)

當(dāng)然實(shí)際情況比上面的案例要復(fù)雜很多, 我們可以專門寫一個(gè)template.html,然后通過模板差值的方式導(dǎo)入后端數(shù)據(jù),進(jìn)而實(shí)現(xiàn)服務(wù)端渲染. 在使用這種方式的時(shí)候我們?nèi)匀灰S護(hù)兩套代碼。

2.使用node+React renderToStaticMarkup實(shí)現(xiàn)react項(xiàng)目的服務(wù)端渲染

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

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提供了兩種服務(wù)端渲染函數(shù),如下:

renderToString:將 React Component 轉(zhuǎn)化為 HTML 字符串,生成的 HTML 的 DOM 會(huì)帶有額外屬性:各個(gè) DOM 會(huì)有data-react-id屬性,第一個(gè) DOM 會(huì)有data-checksum屬性。

renderToStaticMarkup:將 React Component 轉(zhuǎn)化為 HTML 字符串,但是生成 HTML 的 DOM 不會(huì)有額外屬性,從而節(jié)省 HTML 字符串的大小。

所以這里我們一般使用renderToStaticMarkup函數(shù). 同理在實(shí)際業(yè)務(wù)場(chǎng)景中我們也會(huì)寫2套代碼來實(shí)現(xiàn)ssr。

使用谷歌rendertron實(shí)現(xiàn)服務(wù)端渲染

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

我們通常會(huì)將 Rendertron 部署為一個(gè)獨(dú)立的 HTTP 服務(wù),然后為 Web 應(yīng)用框架配置 Google 官方提供的中間件或者在反向代理上添加相應(yīng)路由規(guī)則,使得能夠在檢測(cè)到搜索引擎爬蟲的 UA 時(shí),可以將請(qǐng)求代理給 Rendertron 服務(wù)。筆者總結(jié)了一下其基本實(shí)現(xiàn)原理圖,方便大家理解:

圖片

Rendertron 提供了兩個(gè)主要 API:

  • Render 用于渲染網(wǎng)站內(nèi)容
  • Screenshot 用于將網(wǎng)站內(nèi)容截圖

在 SEO 場(chǎng)景下我們使用的是 Render 接口。

比如當(dāng)客戶端請(qǐng)求我們的網(wǎng)站時(shí),我們服務(wù)端可以根據(jù)請(qǐng)求頭 User Agent 發(fā)現(xiàn)是否包含了 Baiduspider/2.0 關(guān)鍵字,如果是, 那么可以認(rèn)定為當(dāng)前的客戶端是一個(gè)百度爬蟲此時(shí)可以將這個(gè)請(qǐng)求代理 Rendertron 服務(wù)的 /render/客戶端請(qǐng)求地址 路由,讓 Rendertron 幫助執(zhí)行網(wǎng)頁內(nèi)的 Javascript,并將最終內(nèi)容返回給搜索引擎爬蟲。

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

具體實(shí)現(xiàn)

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

1.本地運(yùn)行

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

npm install -g rendertron

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

rendertron

之后控制臺(tái)會(huì)打印本地服務(wù)啟動(dòng)的地址,比如localhost:3000 這個(gè)時(shí)候我們只需要在地址后面輸入我們想渲染的網(wǎng)站即可:localhost:3000:render/你的網(wǎng)站地址, 如下圖所示:

圖片

此時(shí)我們的rendertron服務(wù)已經(jīng)搭建完成, 接下來我們可以在服務(wù)端來實(shí)現(xiàn)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']) {
// 是百度爬蟲,則轉(zhuǎn)發(fā)到rendertron服務(wù)中
ctx.redirect(`http://localhost:3000/render/${ctx.url}`)
}else {
// 渲染正常的路由頁面
}

await next();
})

app.listen('80');

當(dāng)然如果我們后端技術(shù)棧采用的是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);

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

圖片


后期展望

后期筆者將會(huì)繼續(xù)帶大家探索大前端相關(guān)內(nèi)容, 基本框架如下:

圖片


責(zé)任編輯:武曉燕 來源: 趣談前端
相關(guān)推薦

2024-01-16 08:05:53

2021-04-30 09:32:38

服務(wù)端渲染SSR

2025-07-04 03:00:00

2021-04-26 13:20:06

Vue服務(wù)端渲染前端

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服務(wù)端渲染前端

2024-01-25 09:04:25

2024-01-15 08:08:27

2021-08-04 08:33:25

React服務(wù)端渲染

2024-11-05 18:18:48

2025-10-03 00:00:03

React服務(wù)端渲染SSR

2024-04-10 10:09:07

2022-02-05 08:20:25

DeepSpeech開源軟件開發(fā)

2021-12-27 08:31:42

Next.js SSRSSG

2023-05-09 07:16:06

2025-07-01 08:24:10

2025-02-26 08:39:25

2025-10-10 05:11:00

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美日韩一区二区三区在线免费观看| 韩国精品免费视频| 亚洲男人天堂古典| 最新中文字幕2018| av大片在线| 91视频91自| 成人在线一区二区| 国产又黄又爽又色| 日韩精品电影| 精品国产人成亚洲区| 91传媒久久久| 91精品久久| 久久婷婷综合激情| 亚洲曰本av电影| 亚洲另类在线观看| 亚洲精品va| 国产丝袜一区二区三区免费视频 | 麻豆视频免费在线播放| 日韩中文一区二区| 欧美影院精品一区| 玩弄中年熟妇正在播放| av电影在线播放高清免费观看| 成人午夜电影小说| 成人免费看吃奶视频网站| 91看片在线播放| 综合天堂av久久久久久久| 国产丝袜一区二区三区| 白嫩情侣偷拍呻吟刺激| 青草综合视频| 91久久香蕉国产日韩欧美9色| 国产精品视频一二三四区| 成人网视频在线观看| av综合在线播放| 91成人在线看| 亚洲视频在线观看免费视频| 国产日韩一区| 一区二区三区色| 日韩在线电影一区| 成人免费毛片男人用品| 欧美福利视频| 日韩视频免费看| 丁香激情五月少妇| 亚洲宅男网av| 日韩电影免费观看在线观看| 性一交一黄一片| 天堂av中文在线| 国产不卡视频一区| 91久久久久久久一区二区| 99成人精品视频| 午夜精品视频一区二区三区在线看| 亚洲国产欧美久久| 欧美污在线观看| av日韩在线免费观看| 一区二区三区高清| 亚洲砖区区免费| 丰满人妻一区二区三区四区53| 日韩一级精品| 在线看片第一页欧美| www.久久av| 久久91麻豆精品一区| 亚洲女人初尝黑人巨大| 亚洲激情视频小说| 国产毛片一区二区三区| 在线观看国产成人av片| 亚洲色图 激情小说| 日韩三级在线| 久久大大胆人体| 无码成人精品区在线观看| 亚洲**毛片| 精品国产三级a在线观看| 黄色国产在线视频| 欧美重口另类| 在线观看国产成人av片| 男人天堂资源网| 欧美二区不卡| 性色av一区二区咪爱| 久久丫精品忘忧草西安产品| 欧美另类69xxxxx| 日韩中文在线视频| 免费一级肉体全黄毛片| 日韩午夜黄色| 国产精品美女999| 99精品免费观看| www.在线成人| 色噜噜色狠狠狠狠狠综合色一| 在线免费观看黄色av| 亚洲欧美激情插| 黄页网站在线观看视频| 国产伦精品一区二区三区视频金莲| 91福利视频久久久久| 欧美激情国内自拍| 成人午夜三级| 中文字幕日韩高清| 久久伊人成人网| 久久国产亚洲精品| 欧美二区乱c黑人| 男人晚上看的视频| 国产精品第十页| 日韩免费在线播放| 精品免费久久久| 国产亚洲欧洲一区高清在线观看| 最近日韩中文字幕| 亚洲黄色有码视频| 精品国产aaa| 国产精品va| 日韩免费在线视频| 亚洲av色香蕉一区二区三区| 久久久精品国产免费观看同学| 在线视频欧美一区| 中文字幕在线中文字幕在线中三区| 欧美日韩一区三区四区| 老子影院午夜伦不卡大全| 深夜福利视频一区二区| 在线播放一区二区三区| 欧美色图亚洲激情| 欧美黄色免费| 国产成人av网| 三级视频在线看| 亚洲日本va在线观看| 国产精品97在线| 性感女国产在线| 欧美一区二区三区视频免费播放 | 久久午夜视频| 欧美又大粗又爽又黄大片视频| 国产精品久久久久久久久毛片| 26uuu久久综合| 日韩久久久久久久久久久久| 2020国产在线视频| 欧美在线观看视频在线| 理论片大全免费理伦片| 欧美日韩1区| 91久久嫩草影院一区二区| 国产有码在线| 国产精品美女久久久久久2018 | 可以看av的网站久久看| 99国产超薄丝袜足j在线观看 | 亚洲欧美成人一区| 手机在线观看av网站| 精品日韩在线观看| 国产高清在线免费观看| 激情五月婷婷综合网| 亚洲一区美女| 久久久久久久性潮| 在线播放国产一区中文字幕剧情欧美 | 色国产精品一区在线观看| 中文字幕在线观看91| 欧美大片一区| av一本久道久久波多野结衣| 中文字幕在线播放网址| 日韩片之四级片| 69av.com| av影院午夜一区| 男人日女人视频网站| 久久精品色播| 欧美又大粗又爽又黄大片视频| 免费成人av电影| 在线观看网站黄不卡| 久久这里只精品| 日韩a一区二区| 国产原创欧美精品| 国产激情在线| 欧美精品一区男女天堂| 日本熟女一区二区| 久久只精品国产| 狠狠热免费视频| 日韩理论电影大全| 91亚洲国产成人久久精品网站| 国产激情小视频在线| 日韩一卡二卡三卡四卡| 国产午夜福利一区二区| 91日韩一区二区三区| 欧美日韩国产精品激情在线播放| 欧美女优在线视频| 国产精品视频男人的天堂| 77导航福利在线| 日韩欧美亚洲国产精品字幕久久久 | 亚洲精品免费在线| 中文字幕天堂av| 久久久久看片| 欧美爱爱视频网站| 极品束缚调教一区二区网站| 国产v综合ⅴ日韩v欧美大片| 日本最黄一级片免费在线| 日韩欧美中文一区二区| 九一国产在线观看| 国产精品久久久久久一区二区三区 | 亚洲欧洲日本专区| 91国内精品久久久| 亚洲午夜久久久久久久久电影网| 久久久午夜精品福利内容| 老司机午夜精品视频| 日韩精品一区二区三区电影| 国产欧美自拍一区| 国产成人精品视频在线| 伊人222成人综合网| 亚洲精品在线视频| 精品人妻午夜一区二区三区四区 | 毛片精品免费在线观看| 亚洲色图狠狠干| 欧美日韩电影一区| 四虎成人精品永久免费av| 国产嫩草影院久久久久| 亚洲精品无码一区二区| 麻豆精品国产传媒mv男同| 成年人看的毛片| 希岛爱理av一区二区三区| 久久精品99久久| 亚洲天堂中文字幕在线观看| 国产精品激情av在线播放| 超碰在线网站| 久久这里只有精品视频首页| 免费在线看v| 精品国产一区二区三区久久影院| 中文字幕精品一区二区精| 亚洲v中文字幕| 成人啪啪18免费游戏链接| 91精品国产91久久综合| 久久免费看av| japanese色系久久精品| 成人在线一区二区| 日韩欧美2区| 欧美在线观看视频| av成人福利| 欧美激情一级欧美精品| 国产高清一区二区三区视频 | 免费在线观看日韩欧美| 欧美日韩最好看的视频| 7777精品| 91精品国产综合久久久久久丝袜 | 黑人狂躁日本娇小| 久久人人97超碰com| 国产精久久久久| 国产一区二区三区免费播放| 天堂网在线免费观看| 午夜一区不卡| 男人揉女人奶房视频60分| 日韩亚洲精品在线| 亚洲熟妇国产熟妇肥婆| 妖精视频一区二区三区免费观看| 国产精品国产三级国产专区53 | 日韩一区二区在线免费观看| 一本一道人人妻人人妻αv | 精品国产999久久久免费| 欧美日韩国产不卡| 在线观看毛片网站| 欧美剧情电影在线观看完整版免费励志电影| 熟女少妇a性色生活片毛片| 国产亚洲自拍一区| 亚洲精品国产一区黑色丝袜 | 亚洲电影免费观看高清完整版在线| 国产美女精品视频国产| 91精品国产入口| a级片免费观看| 日韩精品一区国产麻豆| 精品人妻aV中文字幕乱码色欲| 精品欧美一区二区久久| 欧美在线 | 亚洲| 美女视频黄频大全不卡视频在线播放| 日本精品一区二区三区在线播放视频 | 亚洲肉体裸体xxxx137| 六月婷婷久久| 成人影视亚洲图片在线| 中文字幕av日韩精品| 婷婷综合社区| 国产免费一区二区| 国产精品白丝av嫩草影院| 国产无套精品一区二区| 蜜桃精品wwwmitaows| 亚洲精品欧美精品| 亚洲视频在线免费| 性欧美大战久久久久久久| 国产日本精品| 色噜噜狠狠永久免费| 国产伦精品一区二区三区视频青涩 | 一区不卡视频| 欧美aa国产视频| 久激情内射婷内射蜜桃| 青娱乐精品视频| 久久久久亚洲av无码麻豆| 波多野结衣在线一区| 在线观看国产精品一区| 亚洲视频一区二区免费在线观看| 久草视频免费在线| 欧美性xxxx在线播放| 一区二区三区精彩视频| 亚洲成人黄色在线观看| www.黄在线观看| 欧美国产日本高清在线| 欧美成人免费电影| 亚洲a一级视频| 亚洲+变态+欧美+另类+精品| 亚洲一卡二卡| 99精品免费| 五月天开心婷婷| www久久久久| 2025国产精品自拍| 欧美日韩精品在线观看| 亚洲一区二区激情| 亚洲电影免费观看| 国产一二三区在线观看| 欧美有码在线观看视频| 日韩精品三级| 亚洲人一区二区| 亚洲激情偷拍| 天堂网成人在线| 国产女人18水真多18精品一级做| www.av视频在线观看| 在线播放一区二区三区| 欧美视频综合| 久久人人爽人人| 国产一区一区| 日韩欧美在线电影| 国产日韩欧美三区| 台湾佬美性中文| 国产精品国产a级| 成人一级片免费看| 国产一区二区精品久| 日本精品一区二区三区在线| 亚洲欧美日本国产| 国产精品av免费| 人妖欧美一区二区| 中文字幕xxx| 亚洲图片欧美一区| 国产精品视频a| 深夜福利亚洲导航| 欧美大片免费高清观看| 国产精品有限公司| 亚洲视频综合| 91香蕉视频在线观看视频| 国产免费观看久久| 潘金莲一级淫片aaaaaa播放| 日韩精品有码在线观看| av不卡高清| 国产精品久久久久久久天堂第1集| 91精品高清| 香蕉视频999| 国产精品乱码妇女bbbb| 中文字幕观看视频| 深夜福利亚洲导航| 日本a人精品| 亚洲最新免费视频| 免费在线观看不卡| 国产真人真事毛片视频| 欧美在线视频不卡| 国产三级在线看| 国产精品美女主播| 日韩一区电影| 亚洲视频一二三四| **性色生活片久久毛片| 91午夜交换视频| 久久97精品久久久久久久不卡| 国产一区二区三区国产精品| 中文字幕中文字幕在线中心一区| 久久国产剧场电影| 疯狂撞击丝袜人妻| 日韩欧美专区在线| 99爱在线视频| 欧美精品七区| 蜜桃视频第一区免费观看| 亚洲综合图片一区| 欧美一区二区三区视频免费| 亚洲七七久久综合桃花剧情介绍| 亚洲xxx自由成熟| 亚洲高清久久| 免费看污片网站| 欧美亚洲愉拍一区二区| 欧美jizzhd69巨大| aa成人免费视频| 另类av一区二区| 殴美一级黄色片| 日韩一区二区精品在线观看| av午夜在线观看| 色姑娘综合网| 国产电影一区二区三区| 国产成人亚洲欧洲在线| 一区二区三区视频在线| 精品视频一二| 欧美,日韩,国产在线| 国产亚洲欧美日韩在线一区| 一级黄色片网站| 久久久久中文字幕2018| 欧美女王vk| 国产男女无遮挡猛进猛出| 精品二区三区线观看| 成人综合影院| 国产精品.com| 日韩二区三区在线观看| 青青草成人免费| 亚洲欧美日韩精品| 欧美久久一区二区三区| 亚洲午夜激情免费视频| h片在线观看视频免费免费| 欧洲在线视频一区| 国产精品 欧美精品| 日韩在线视频不卡| 欧美激情第三页| 日韩欧美精品一区| 国产精品无码专区| 欧美日韩www| 粉嫩一区二区|