欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

細(xì)說(shuō)Vue組件的服務(wù)器端渲染的過(guò)程

 更新時(shí)間:2019年05月30日 15:05:21   作者:senntyou  
這篇文章主要介紹了細(xì)說(shuō) Vue 組件的服務(wù)器端渲染,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
聲明:需要讀者對(duì) NodeJs、Vue 服務(wù)器端渲染有一定的了解

現(xiàn)在,前后端分離與客戶端渲染已經(jīng)成為前端開(kāi)發(fā)的主流模式,絕大部分的前端應(yīng)用都適合用這種方式來(lái)開(kāi)發(fā),又特別是 React、Vue 等組件技術(shù)的發(fā)展,更是使這種方式深入人心。

但有一些應(yīng)用,客戶端渲染就會(huì)遇到一些問(wèn)題了:

  • 需要做 SEO(搜索引擎優(yōu)化),但客戶端渲染的 html 中幾乎沒(méi)有可用的信息
  • 需要首屏快速加載,但客戶端渲染一般是長(zhǎng)時(shí)間的加載動(dòng)畫(huà)或者白屏

如果能把客戶端渲染的組件化技術(shù)(React、Vue 等)與傳統(tǒng)的后端渲染的方式有效的結(jié)合起來(lái),兩者兼具,那就太完美了。

所以,這次就來(lái)聊聊 Vue 組件的服務(wù)器端渲染。

根據(jù)社區(qū)現(xiàn)有的一些方案,結(jié)合自己的實(shí)踐,針對(duì)團(tuán)隊(duì)技術(shù)力量的不同,說(shuō)說(shuō)不同應(yīng)用場(chǎng)景選擇方案時(shí)的優(yōu)先級(jí)。

1. NodeJs 渲染中間層

一般前后端的工作流是 后端 -> 前端。

傳統(tǒng)的后端渲染模式是后端負(fù)責(zé)包括 url、接口、模板渲染等,前端與后端耦合在一起,當(dāng)然這種方式正在慢慢的退出歷史舞臺(tái)。

主流的客戶端渲染則是后端只提供接口(如有需要,可以提供必要的 url),前端與后端只通過(guò)接口交流數(shù)據(jù),路由與渲染都在前端完成。

而 NodeJs 渲染中間層的工作流則是 后端 -> NodeJs -> 前端(NodeJs 渲染中間層由前端開(kāi)發(fā)人員掌握)。

這種模式下,后端只提供接口,傳統(tǒng)的服務(wù)器端路由(url)、模板渲染則都有 NodeJs 層接管。這樣,前端開(kāi)發(fā)人員可以自由的決定哪些組件需要在服務(wù)器端渲染,哪些組件可以放在客戶端渲染,前后端完全解耦,但又保留了服務(wù)器端渲染的功能。

這種方案最成熟的是nuxt.js。

如果有需要,大家可以自己去 nuxt.js 官方文檔 看看具體的使用方法和詳細(xì)的功能。

應(yīng)該說(shuō),這種方式是目前最完美的一種方案,但也有一些隱患:

  • 增加了一個(gè) NodeJs 中間層,應(yīng)用性能會(huì)有所降低
  • 增加了架構(gòu)的復(fù)雜度、不穩(wěn)定性,也降低了應(yīng)用的安全性
  • 對(duì)于高并發(fā)應(yīng)用,NodeJs 層會(huì)很容易形成瓶頸
  • 對(duì)開(kāi)發(fā)人員要求高了很多

所以,這種方式適合對(duì)并發(fā)量、安全性、穩(wěn)定性等要求不高,但又需要做 SEO 或首屏快速加載的頁(yè)面。

當(dāng)然,如果你能夠自己改造相關(guān)的工具,就另當(dāng)別論了。

2. 保留后端模板渲染

當(dāng)不能使用 NodeJs 中間層時(shí),而又要達(dá)到 SEO 與首屏快速響應(yīng)的目的時(shí),在傳統(tǒng)的后端模板渲染的基礎(chǔ)上,就需要對(duì)前端的頁(yè)面加以適當(dāng)?shù)母脑臁?/p>

2.1 首屏快速響應(yīng)

首屏快速響應(yīng)就意味著首屏渲染所需的數(shù)據(jù)是跟 HTML 文件一起到達(dá)瀏覽器的,這些數(shù)據(jù)當(dāng)前是由后端模板引擎嵌入到 HTML 頁(yè)面中的。

以 Java 的 freemarker 模板引擎為例:

html 中以 script 的方式獲取模板的數(shù)據(jù),這樣就算是在本地調(diào)試、開(kāi)發(fā),也不會(huì)報(bào)錯(cuò))。

<script>
 window.globalData = {
  stringValue: '${stringValueTplName}',
  intValue: parseInt('${intValueTplName}', 10),
 };
</script>

如果是復(fù)雜的 Json 數(shù)據(jù)或者其他復(fù)雜的模板數(shù)據(jù)(比如列表數(shù)據(jù)),則可以像下面這樣接收:

<script type="text/tpl" id="tpl-script-json">
 window.tmpData = {
  jsonValue: ${jsonValueTplName},
 };
</script>

<script>
 try {
  eval(document.getElementById('tpl-script-json').innerText);
 } catch (e) {
  window.tmpData = { jsonValue: {} };
 }
 
 window.globalData = {
  jsonValue: window.tmpData.jsonValue,
 };
</script>

這樣,你就可以在組件里使用 window.globalData 的數(shù)據(jù)了,而不用另外用接口獲取數(shù)據(jù),達(dá)到加快首屏渲染的目的,而且本地開(kāi)發(fā)、調(diào)試也不會(huì)報(bào)錯(cuò)。

如果你使用了本地?cái)?shù)據(jù) Mock 功能,也可以很容易的與這種方式結(jié)合在一起,只要稍加改造:

  1. 在代碼中定義本地和服務(wù)器兩個(gè)環(huán)境,本地環(huán)境使用 Mock 數(shù)據(jù),服務(wù)器環(huán)境使用 window.globalData
  2. 可以使用see-ajax, see-fetch 來(lái)簡(jiǎn)化這種方式的開(kāi)發(fā)

此外,還有一些措施來(lái)進(jìn)一步加快首屏渲染:

  • 盡量減少首屏加載的腳本文件大小,其他腳本可以按需加載
  • 如果需要,可以將 CSS、JS 內(nèi)容注入到 HTML 中,這樣就只會(huì)發(fā)起一個(gè)請(qǐng)求,也可以加快加載速度

2.2 SEO 優(yōu)化

在上面加載首屏渲染的基礎(chǔ)上,對(duì)于 SEO 優(yōu)化也可以做相應(yīng)的改造。

其實(shí),在客戶端渲染已慢慢成為主流開(kāi)發(fā)模式的同時(shí),搜索引擎也在跟進(jìn)這種變化。

截至目前,Google 和 Bing 可以很好對(duì)同步 JavaScript 應(yīng)用程序進(jìn)行索引,也就是說(shuō),即使是客戶端渲染,但只要是同步數(shù)據(jù)渲染(非 Ajax 獲取數(shù)據(jù),比如模板數(shù)據(jù)),搜索引擎也能抓取到相應(yīng)的 HTML 片段。

(國(guó)內(nèi)的百度搜索與360搜索等暫時(shí)還沒(méi)有跟進(jìn)動(dòng)態(tài))

但為了兼容所有的搜索引擎,可以像下面改造:

先由后端模板引擎渲染一些 HTML 片段,僅給搜索引擎抓取,不作為給用戶展示的頁(yè)面

然后再由客戶端渲染同步或異步的數(shù)據(jù)給用戶展示真正的頁(yè)面

<div>
 <!-- 這里放置由后端模板引擎渲染的專給搜索引擎抓取的片段,用戶不可見(jiàn) -->
</div>

<script>
 // 接收同步數(shù)據(jù)
 window.globalData = {
  stringValue: '${stringValueTplName}',
  intValue: parseInt('${intValueTplName}', 10),
 };
</script>

3. 導(dǎo)出靜態(tài) html

如果頁(yè)面沒(méi)有動(dòng)態(tài)數(shù)據(jù),那就好辦了,直接把組件導(dǎo)出為靜態(tài) html,然后由客戶端激活。

具體過(guò)程可以參考 官方文檔。

這種方案比較好的是 nuxt.js generate 靜態(tài) HTML 文件。

目錄結(jié)構(gòu):

- pages/        # 頁(yè)面結(jié)構(gòu)目錄
 - index.vue 
 - second.vue
 - ... 
- nuxt.config.js    # 配置文件
- package.json

- dist         # 導(dǎo)出靜態(tài) HTML 文件的默認(rèn)目錄 

導(dǎo)出靜態(tài) HTML 文件

npx nuxt generate

如果一個(gè)項(xiàng)目里有多個(gè) pages,可以這樣構(gòu)建:

目錄結(jié)構(gòu):

- nuxt.config.js    # 配置文件
- package.json

- src/
 - home/        # home 頁(yè)面 
  - pages/      # 頁(yè)面結(jié)構(gòu)目錄
   - index.vue 
   - second.vue
   - ...
   
  - dist       # 導(dǎo)出靜態(tài) HTML 文件的默認(rèn)目錄
 - about/       # about 頁(yè)面 
  - pages/      # 頁(yè)面結(jié)構(gòu)目錄
   - index.vue 
   - second.vue
   - ...
   
  - dist       # 導(dǎo)出靜態(tài) HTML 文件的默認(rèn)目錄  

導(dǎo)出靜態(tài) HTML 文件

npx nuxt generate src/home -c ../../nuxt.config.js  # home 頁(yè)面
npx nuxt generate src/about -c ../../nuxt.config.js  # about 頁(yè)面

除了上面提到的這些方式外,當(dāng)然還有其他的方式,比如:

使用 Chrome Headless 模式獲取組件的靜態(tài) HTML,參考 react-snap, puppeteer

官方 vue-server-renderer 導(dǎo)出靜態(tài) HTML

4. 總結(jié)

因?yàn)槟J降母淖?,服?wù)器端渲染與傳統(tǒng)的后端模板渲染工作方式有很大的不同,所以在開(kāi)發(fā)時(shí)需要與后端開(kāi)發(fā)人員做好溝通,避免認(rèn)知上的不同導(dǎo)致協(xié)作不協(xié)調(diào)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue自定義指令實(shí)現(xiàn)元素滑動(dòng)移動(dòng)端適配及邊界處理

    vue自定義指令實(shí)現(xiàn)元素滑動(dòng)移動(dòng)端適配及邊界處理

    這篇文章主要為大家介紹了vue自定義指令實(shí)現(xiàn)元素滑動(dòng)移動(dòng)端適配及邊界處理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • vue-cli4.0如何配置CDN加速

    vue-cli4.0如何配置CDN加速

    這篇文章主要介紹了vue-cli4.0如何配置CDN加速問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • vuex進(jìn)階知識(shí)點(diǎn)鞏固

    vuex進(jìn)階知識(shí)點(diǎn)鞏固

    本片文章是小編在網(wǎng)上整理的關(guān)于VUEX進(jìn)階的相關(guān)知識(shí)點(diǎn)內(nèi)容,對(duì)此有興趣的朋友可以跟著學(xué)習(xí)參考下。
    2018-05-05
  • Vue3和Vue2的響應(yīng)式原理

    Vue3和Vue2的響應(yīng)式原理

    這篇文章我們將探討Vue3框架的優(yōu)秀特性、使用原理、周邊生態(tài)和實(shí)戰(zhàn)應(yīng)用,系統(tǒng)的學(xué)習(xí)Vue生態(tài)體系,希望和大家共同成長(zhǎng),我們一起探討下Vue3和Vue2的響應(yīng)式原理,那究竟什么是“響應(yīng)式”,接下來(lái)跟著小編一起來(lái)學(xué)習(xí)吧
    2023-05-05
  • 在Vue中使用Immutable.js的步驟

    在Vue中使用Immutable.js的步驟

    這篇文章主要介紹了在Vue中使用Immutable.js的步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • ElementUI中el-tree節(jié)點(diǎn)的操作的實(shí)現(xiàn)

    ElementUI中el-tree節(jié)點(diǎn)的操作的實(shí)現(xiàn)

    這篇文章主要介紹了ElementUI中el-tree節(jié)點(diǎn)的操作的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Element el-checkbox-group v-model不支持對(duì)象(object)解決方案

    Element el-checkbox-group v-model不支持對(duì)象(object)解決方案

    本文主要介紹了Element el-checkbox-group v-model不支持對(duì)象(object)解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • element-plus/element-ui走馬燈配置圖片及圖片自適應(yīng)的最簡(jiǎn)便方法

    element-plus/element-ui走馬燈配置圖片及圖片自適應(yīng)的最簡(jiǎn)便方法

    走馬燈功能在展示圖片時(shí)經(jīng)常用到,下面這篇文章主要給大家介紹了關(guān)于element-plus/element-ui走馬燈配置圖片及圖片自適應(yīng)的最簡(jiǎn)便方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • 詳解vue-router 2.0 常用基礎(chǔ)知識(shí)點(diǎn)之導(dǎo)航鉤子

    詳解vue-router 2.0 常用基礎(chǔ)知識(shí)點(diǎn)之導(dǎo)航鉤子

    本篇文章主要介紹了vue-router 2.0 常用基礎(chǔ)知識(shí)點(diǎn)之導(dǎo)航鉤子,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • vue 2.0 購(gòu)物車(chē)小球拋物線的示例代碼

    vue 2.0 購(gòu)物車(chē)小球拋物線的示例代碼

    本篇文章主要介紹了vue 2.0 購(gòu)物車(chē)小球拋物線的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02

最新評(píng)論