日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

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

來源: 責(zé)編: 時(shí)間:2024-01-16 10:16:17 329觀看
導(dǎo)讀前言我們都知道, Vue和React是構(gòu)建客戶端應(yīng)用程序的框架。默認(rèn)情況下,可以在瀏覽器中輸出自定義組件,進(jìn)行生成 DOM 和操作 DOM, 也就是我們常說的客戶端渲染, 并且我們大部分主流的場景都是SPA(單頁面)應(yīng)用, 而隨著 SPA

AtO28資訊網(wǎng)——每日最新資訊28at.com

前言

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

AtO28資訊網(wǎng)——每日最新資訊28at.com

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

所以為了解決SPA應(yīng)用遇到的這些問題, 我們必須考慮SSR:AtO28資訊網(wǎng)——每日最新資訊28at.com

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

對于服務(wù)端渲染的頁面,服務(wù)端可以直接將帶數(shù)據(jù)的內(nèi)容通過 HTML 文本的形式返回,搜索引擎爬蟲可以輕易的獲取頁面內(nèi)容,而對于客戶端渲染的應(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)方案。AtO28資訊網(wǎng)——每日最新資訊28at.com

AtO28資訊網(wǎng)——每日最新資訊28at.com

摘要

AtO28資訊網(wǎng)——每日最新資訊28at.com

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

接下來筆者將列舉幾個(gè)常用的基于vue/react的服務(wù)端渲染方案,如下:AtO28資訊網(wǎng)——每日最新資訊28at.com

  • 使用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ì),這里筆者就不再做過多介紹了,這里我們簡單介紹一下第二種和第三種方案。AtO28資訊網(wǎng)——每日最新資訊28at.com

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

首先vue-server-renderer依賴node的api,所以只能運(yùn)行在node環(huán)境, 我們需要先安裝它:AtO28資訊網(wǎng)——每日最新資訊28at.com

npm install vue vue-server-renderer --save

在node中使用,代碼如下:AtO28資訊網(wǎng)——每日最新資訊28at.com

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ù)兩套代碼.AtO28資訊網(wǎng)——每日最新資訊28at.com

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

使用這種方案和vue的方案類似, 只不過這里我們用了react自帶的api來實(shí)現(xiàn)ssr,簡單的實(shí)現(xiàn)代碼如下:AtO28資訊網(wǎng)——每日最新資訊28at.com

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ù),如下:AtO28資訊網(wǎng)——每日最新資訊28at.com

  • 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ù)場景中我們也會(huì)寫2套代碼來實(shí)現(xiàn)ssr。AtO28資訊網(wǎng)——每日最新資訊28at.com

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

Google 推出的 Rendertron 使得 SPA 也能夠被不支持執(zhí)行 Javascript 的搜索引擎爬取渲染后的內(nèi)容。其原理主要是通過使用 Headless Chrome 在內(nèi)存中執(zhí)行 Javascript,并在得到完整內(nèi)容后,將內(nèi)容返回給客戶端。AtO28資訊網(wǎng)——每日最新資訊28at.com

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

AtO28資訊網(wǎng)——每日最新資訊28at.com

Rendertron 提供了兩個(gè)主要 API:AtO28資訊網(wǎng)——每日最新資訊28at.com

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

在 SEO 場景下我們使用的是 Render 接口。AtO28資訊網(wǎng)——每日最新資訊28at.com

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

使用Rendertron的好處在于我們可以不用考慮服務(wù)端渲染的部分,完全按照SPA的模式開發(fā)項(xiàng)目,也不用為了兼容服務(wù)端渲染而寫多余的兼容代碼。AtO28資訊網(wǎng)——每日最新資訊28at.com

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

首先我們需要安裝Rendertron, 可以在github中找到其安裝和使用方法,在安裝前最好先安裝docker, 目前docker的最新版本以支持傻瓜式安裝,所以安裝啟動(dòng)都非常方便。AtO28資訊網(wǎng)——每日最新資訊28at.com

1、本地運(yùn)行

在安裝好docker之后, 我們先全局安裝rendertron:AtO28資訊網(wǎng)——每日最新資訊28at.com

npm install -g rendertron

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

rendertron

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

AtO28資訊網(wǎng)——每日最新資訊28at.com

此時(shí)我們的rendertron服務(wù)已經(jīng)搭建完成, 接下來我們可以在服務(wù)端來實(shí)現(xiàn)ssr了,代碼如下:AtO28資訊網(wǎng)——每日最新資訊28at.com

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有專門的中間件可以使用, 不僅僅可以攔截百度的爬蟲,具體用法如下:AtO28資訊網(wǎng)——每日最新資訊28at.com

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ù)。AtO28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-62360-0.html快速在你的Vue/React應(yīng)用中實(shí)現(xiàn)SSR(服務(wù)端渲染)

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 白話 Pulsar Bookkeeper 的存儲(chǔ)模型

下一篇: IT降本50%還賊穩(wěn)!百萬訂單規(guī)模系統(tǒng)的技術(shù)治理實(shí)踐

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美一级艳片视频免费观看| 亚洲一区二区三区免费视频| 狠狠色综合日日| 国产亚洲精品久久久久婷婷瑜伽| 狠狠色噜噜狠狠狠狠色吗综合| 亚洲黄色免费网站| 中日韩在线视频| 久久aⅴ国产紧身牛仔裤| 免费看成人av| 国产精品久久| 一区二区三区在线高清| 99国内精品久久久久久久软件| 午夜在线不卡| 欧美激情麻豆| 国产视频观看一区| 亚洲精品一二| 欧美伊人久久久久久久久影院| 欧美国产精品中文字幕| 国产精品亚洲综合天堂夜夜 | 亚洲精品中文字| 欧美主播一区二区三区美女 久久精品人| 老色鬼久久亚洲一区二区| 欧美午夜视频网站| 亚洲电影毛片| 欧美在线欧美在线| 欧美日韩伦理在线免费| 国内精品久久久久久久果冻传媒| 99ri日韩精品视频| 久久五月激情| 国产伦精品一区二区| 亚洲精品四区| 久久久久久久久久久一区| 欧美午夜www高清视频| …久久精品99久久香蕉国产| 亚洲欧美大片| 欧美日韩激情小视频| 一区二区在线观看视频在线观看| 亚洲一区二区三区高清| 欧美国产极速在线| 永久免费视频成人| 欧美一站二站| 国产精品久久久亚洲一区| 亚洲精品国产无天堂网2021| 久久婷婷影院| 国产亚洲一区二区三区| 亚洲砖区区免费| 欧美日韩在线不卡| 亚洲日本电影| 免费视频久久| 在线观看国产日韩| 久久国产精品久久久久久电车| 国产精品va在线播放我和闺蜜| 亚洲人在线视频| 巨乳诱惑日韩免费av| 国产一区二区三区的电影| 亚洲主播在线| 欧美午夜在线视频| 9i看片成人免费高清| 欧美精品在线观看| 亚洲日本黄色| 欧美国产激情| 亚洲欧洲日产国产网站| 嫩草成人www欧美| 1024亚洲| 噜噜噜在线观看免费视频日韩| 黑人巨大精品欧美一区二区| 欧美在线免费播放| 国产午夜精品福利 | 欧美日本在线| 亚洲精选成人| 欧美激情一二三区| 亚洲黄色在线看| 欧美ab在线视频| 亚洲国产一二三| 欧美大胆成人| 亚洲精品专区| 欧美日韩视频专区在线播放| 99视频精品免费观看| 欧美激情亚洲自拍| 亚洲精品在线一区二区| 欧美日韩国产成人在线观看| 日韩视频专区| 欧美色偷偷大香| 亚洲一区欧美一区| 国产精品一页| 久久成人免费日本黄色| 国产真实乱偷精品视频免| 久久精品视频免费观看| 狠狠色噜噜狠狠狠狠色吗综合| 久久全球大尺度高清视频| 黄色日韩在线| 欧美成人a视频| 999亚洲国产精| 国产精品爱久久久久久久| 亚洲欧美日韩国产一区二区三区| 国产伦精品一区二区三区视频孕妇| 久久成人免费电影| 亚洲国产91色在线| 欧美日韩国产a| 亚洲午夜久久久久久久久电影院 | 亚洲国产一区二区三区a毛片 | 欧美日韩亚洲天堂| 亚洲综合社区| 国产在线播放一区二区三区| 久久影院午夜片一区| 亚洲精品国精品久久99热一| 欧美日韩综合在线免费观看| 亚洲欧美中日韩| 黄色成人小视频| 欧美精品一区二区三区久久久竹菊 | 一本色道久久综合亚洲二区三区| 国产精品国产三级欧美二区| 欧美在线1区| 亚洲国产成人tv| 欧美三区在线| 欧美在线高清视频| 最新日韩av| 国产精品毛片va一区二区三区 | 亚洲国产成人久久综合| 欧美日韩一区在线观看| 欧美中文字幕第一页| 亚洲肉体裸体xxxx137| 国产精品理论片在线观看| 久久精品中文字幕一区二区三区| 亚洲日本一区二区| 国产精品午夜国产小视频| 美女网站久久| 亚洲一区二区三区欧美 | 亚洲香蕉在线观看| 影音先锋久久精品| 国产精品白丝av嫩草影院| 久久精视频免费在线久久完整在线看| 最新亚洲电影| 国产一区激情| 欧美日韩亚洲精品内裤| 久久精品91| 一区二区三区欧美在线| 好吊一区二区三区| 国产精品sm| 欧美激情导航| 久久精品99国产精品酒店日本| 日韩亚洲国产欧美| 狠狠爱www人成狠狠爱综合网| 欧美三级视频在线播放| 久久夜色精品国产噜噜av| 亚洲一区二区在线播放| 亚洲韩国日本中文字幕| 国产日本欧美视频| 欧美日韩高清在线一区| 久久一区激情| 亚洲欧美日本日韩| 日韩一级在线观看| 在线精品亚洲一区二区| 国产精品一区2区| 欧美日韩一区二区三区在线看| 久久婷婷亚洲| 欧美在线视频导航| 亚洲一区二区三区视频播放| 亚洲欧洲日韩在线| 韩国久久久久| 国产欧美日韩中文字幕在线| 欧美日韩国产成人在线| 麻豆成人在线播放| 欧美在线视频观看免费网站| 中文高清一区| 日韩亚洲欧美成人| 最新国产精品拍自在线播放| 红桃视频国产一区| 国产欧美一二三区| 国产精品久久久久婷婷| 欧美久久久久久久久久| 老鸭窝91久久精品色噜噜导演| 欧美在线影院| 午夜在线一区| 亚洲综合日韩中文字幕v在线| 99精品久久久| 亚洲精选视频免费看| 亚洲国产小视频| 在线 亚洲欧美在线综合一区| 国产三区精品| 国产精自产拍久久久久久| 国产精品激情偷乱一区二区∴| 欧美日韩国产在线观看| 欧美精品在线视频| 欧美激情按摩在线| 欧美激情一区二区三区| 欧美二区在线看| 欧美 日韩 国产精品免费观看| 狂野欧美性猛交xxxx巴西| 久久久久综合| 久久视频在线免费观看| 久久久水蜜桃av免费网站| 久久精品国产免费观看| 欧美中文字幕第一页| 欧美在现视频| 久久久精品国产免费观看同学 | 国产精品乱码妇女bbbb| 国产精品成人一区二区三区夜夜夜 | 久久狠狠亚洲综合| 久久久久欧美精品| 久久婷婷人人澡人人喊人人爽| 久久免费视频观看| 麻豆精品在线视频| 欧美顶级艳妇交换群宴|