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

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

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

前言

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

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

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

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

對(duì)于服務(wù)端渲染的頁(yè)面,服務(wù)端可以直接將帶數(shù)據(jù)的內(nèi)容通過 HTML 文本的形式返回,搜索引擎爬蟲可以輕易的獲取頁(yè)面內(nèi)容,而對(duì)于客戶端渲染的應(yīng)用,客戶端必須執(zhí)行服務(wù)器返回的 Javascript 才能得到正確的網(wǎng)頁(yè)內(nèi)容。目前,除 Google、Bing 支持 Javascript 外(也會(huì)有一些限制),其他的大部分搜索引擎都不支持 Javascript,也就無法獲取正確的網(wǎng)頁(yè)內(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ì),這里筆者就不再做過多介紹了,這里我們簡(jiǎn)單介紹一下第二種和第三種方案。

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,簡(jiǎn)單的實(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)頁(yè)內(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 {
        // 渲染正常的路由頁(yè)面
    }


    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',
}));


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

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

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

2022-10-08 00:01:00

ssrvuereact

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ù)端渲染

2025-10-03 00:00:03

React服務(wù)端渲染SSR

2024-11-05 18:18:48

2024-04-10 10:09:07

2021-12-27 08:31:42

Next.js SSRSSG

2022-02-05 08:20:25

DeepSpeech開源軟件開發(fā)

2023-05-09 07:16:06

2025-07-01 08:24:10

2025-02-26 08:39:25

2010-02-24 15:42:03

WCF服務(wù)端安全
點(diǎn)贊
收藏

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

欧美性受xxxx黑人xyx性爽| 精品久久久久久久人人人人传媒| 国产精品美女xx| 精品一区二区三| 高清欧美性猛交| 狂野欧美xxxx韩国少妇| 精品香蕉一区二区三区| 在线āv视频| 91精品国产91久久综合桃花| 污视频在线看操| 精品久久久久久久久中文字幕| 濑亚美莉vs黑人在线观看| 26uuu色噜噜精品一区二区| 欧美黄网在线观看| 成人短视频下载| 亚洲 欧美 日韩 国产综合 在线 | 日本视频一区二区在线观看| 亚洲天堂免费| 91综合免费在线| 成人情趣视频网站| 国产精品激情av电影在线观看 | 波多野结衣乳巨码无在线| 粉嫩aⅴ一区二区三区四区五区| 在线观看国产一区| 捆绑调教美女网站视频一区| 水蜜桃一区二区| 久久99精品网久久| 国产爆乳无码一区二区麻豆| 97se亚洲国产综合自在线不卡| 欧美成人高潮一二区在线看| 97精品国产露脸对白| 国产成人久久777777| 中国av一区二区三区| av天天av| 91黄色在线观看| 国产激情在线| 亚洲视频网站在线观看| 国产精品一区二区精品| 91成人在线播放| 亚洲91中文字幕无线码三区| 极品尤物一区二区三区| 久久99精品久久久久久动态图 | 另类图片亚洲色图| 精品久久久国产| 麻豆av在线导航| 亚洲精品国产成人| 国产美女亚洲精品7777| 欧美一区二粉嫩精品国产一线天| 香蕉av一区二区| 色综合久久av| 99久久综合狠狠综合久久| 国产一二三区av| 欧美视频免费在线| 黄色漫画在线免费看| 久久久久久久电影一区| 天天做天天爱综合| 成人短视频在线观看免费| 亚洲欧美视频在线观看| av毛片在线播放| 欧美巨乳美女视频| 午夜国产精品视频| 国产69精品久久久久999小说| 亚洲色图欧美偷拍| 快射av在线播放一区| 日韩中文字幕第一页| 久久亚洲专区| 欧美精品1区2区3区| 日韩国产高清影视| 国产精品一色哟哟| 永久免费网站在线| 日日狠狠久久偷偷四色综合免费| jvid福利在线一区二区| 亚洲自拍偷拍二区| 亚洲青青青在线视频| 成人三级网址| 国产精品大陆在线观看| 麻豆视频观看网址久久| 五十度飞在线播放| 要久久爱电视剧全集完整观看| 91精品视频专区| 成人久久视频在线观看| 毛片网站在线| 久久免费精品日本久久中文字幕| 免费精品视频| 美女胸又www又黄的网站| 精品国产一区二区三区四区四 | 欧美色另类天堂2015| 色猫猫成人app| 69堂成人精品视频免费| 久久色.com| 最新超碰在线| 国产乱人伦真实精品视频| 国产大片一区二区| 99视频在线观看地址| 国产成人精品免费久久久久| 激情偷乱视频一区二区三区| 欧美巨乳在线| 久久久噜噜噜久久中文字免| 国产乱理伦片在线观看夜一区| 欧美性孕妇孕交| 欧美一级淫片aaaaaaa视频| 成人一区二区三区| 黄色的视频在线观看| 99在线视频首页| 亚洲国产精品视频| 一区二区三区四区高清视频| 三上悠亚免费在线观看| 色诱亚洲精品久久久久久| 亚洲精品进入| 一插菊花综合| 欧美激情xxxxx| 99久久伊人精品| 日韩精品极品| 正在播放国产精品| 精品日韩欧美一区二区| 免费日韩精品中文字幕视频在线| 男男激情在线| 91亚洲精品久久久久久久久久久久| 最新高清无码专区| 日韩精品免费视频一区二区三区| 国产成人在线小视频| 精品国产一区二区三区四区四 | 国产精品爱久久久久久久| 久久亚洲综合色一区二区三区| 欧美电影免费观看| 特大黑人娇小亚洲女mp4| 欧美成人vr18sexvr| 久久精品首页| 欧美黑人xx片| 先锋影音日韩| 亚洲精品电影网站| 国产在线精品一区二区三区不卡 | swag国产精品一区二区| 97在线播放视频| 免费不卡在线观看av| 成人国产在线观看| 四虎视频在线精品免费网址| 91午夜在线观看| 精品国产一区二区三区久久狼5月| 国产精品123区| 日韩久久一区| 一级黄色特级片| 国产精品久久久久久久av大片| 一区二区三区中文字幕精品精品| 亚洲+变态+欧美+另类+精品| 天堂男人av| 国产精品自产拍在线观看中文| 一区二区三区四区高清精品免费观看 | 探花国产精品| 成人在线视频网| 欧美日韩午夜在线视频| 国产乱码精品| 香蕉视频亚洲一级| 欧美日韩亚洲自拍| 国产在线拍揄自揄视频不卡99 | 美女视频黄免费的久久 | 欧美日本视频在线观看| 欧美激情aaaa| 午夜欧美大尺度福利影院在线看| 欧美激情性爽国产精品17p| 黄色av免费在线| 99国产精品白浆在线观看免费| 久久91精品国产91久久跳| 亚洲精品乱码久久久久久 | 久久久久国产精品麻豆| 亚洲素人在线| 成人亚洲综合天堂| 欧美人与拘性视交免费看| 调教视频vk| 日韩一区二区三区电影| 五月天久久网站| 三级在线观看视频| 无遮挡的视频在线观看| 毛片在线网址播放| 男人天堂网在线观看| 国产资源在线观看| av在线导航| 日本伦理一区二区| 婷婷精品在线| 99精品视频在线| 西瓜成人精品人成网站| 国产一区观看| 欧美成人日本| 亚洲精品一品区二品区三品区| 欧美自拍丝袜亚洲| 亚洲黄色av| 波多一区二区| 各处沟厕大尺度偷拍女厕嘘嘘| 97久久伊人激情网| 一本色道a无线码一区v| 国产精品久久国产愉拍| 污污的视频在线观看| a级黄色小视频| 久久久精品国产亚洲| 国产精品久久亚洲| 91精品国产毛片武则天| 无码专区aaaaaa免费视频| 中文视频在线| 成人18视频在线观看| 精品一区二区三区中文字幕|