欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

VueSSR怎么實(shí)現(xiàn)即時(shí)編譯技術(shù)

這篇文章主要為大家展示了Vue SSR怎么實(shí)現(xiàn)即時(shí)編譯技術(shù),內(nèi)容簡(jiǎn)而易懂,希望大家可以學(xué)習(xí)一下,學(xué)習(xí)完之后肯定會(huì)有收獲的,下面讓小編帶大家一起來(lái)看看吧。

創(chuàng)新互聯(lián)公司是一家專業(yè)提供秀峰企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)HTML5、小程序制作等業(yè)務(wù)。10年已為秀峰眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。

當(dāng)我們?cè)诜?wù)端渲染 Vue 應(yīng)用時(shí),無(wú)論服務(wù)器執(zhí)行多少次渲染,大部分 VNode 渲染出的字符串是不變的,它們有一些來(lái)自于模板的靜態(tài) html,另一些則來(lái)自模板動(dòng)態(tài)渲染的節(jié)點(diǎn)(雖然在客戶端動(dòng)態(tài)節(jié)點(diǎn)有可能會(huì)變化,但是在服務(wù)端它們是不變的)。將這兩種類型的節(jié)點(diǎn)提取出來(lái),僅在服務(wù)端渲染真正動(dòng)態(tài)的節(jié)點(diǎn)(serverPrefetch 預(yù)取數(shù)據(jù)相關(guān)聯(lián)的節(jié)點(diǎn)),可以顯著的提升服務(wù)端的渲染性能。

提取模板中靜態(tài)的 html 只需在編譯期對(duì)模板結(jié)構(gòu)做解析,而判斷動(dòng)態(tài)節(jié)點(diǎn)在服務(wù)端渲染階段是否為靜態(tài),需在運(yùn)行時(shí)對(duì) VNode 做 Diff,將動(dòng)態(tài)節(jié)點(diǎn)轉(zhuǎn)化成靜態(tài) html 需要修改渲染函數(shù)的源代碼,我們將這種在運(yùn)行時(shí)優(yōu)化服務(wù)端渲染函數(shù)的技術(shù)稱作 SSR 即時(shí)編譯技術(shù)(JIT)。

GitHub:vue-ssr-jit

JIT Diff 算法

首要面對(duì)的問(wèn)題是如何 Diff,完成這項(xiàng)工作需要兩個(gè) VNode,其中一個(gè)通過(guò) serverPrefetch / asyncData 載入動(dòng)態(tài)數(shù)據(jù),我們稱之為 Dynamic VNode,另一個(gè)未載入任何數(shù)據(jù),我們稱之為 Static VNode。我們做了一個(gè)大膽的假設(shè),對(duì)任何用戶來(lái)說(shuō),Static VNode 渲染出的 html 是一致的,并且 Static VNode 是 Dynamic VNode 的子集,不同用戶的差異點(diǎn)在 Static VNode 相對(duì) Dynamic VNode 的補(bǔ)集當(dāng)中。

Vue SSR怎么實(shí)現(xiàn)即時(shí)編譯技術(shù)

以上假設(shè)對(duì)絕大部分的 Web 應(yīng)用都是成立的,某些意料之外的情況將在文末做討論

Diff 的核心在于從 Staitc VNode 中標(biāo)記 Dynamic VNode,下一次僅渲染被標(biāo)記的 Dynamic VNode,Diff 算法的技術(shù)示意圖如下所示

Vue SSR怎么實(shí)現(xiàn)即時(shí)編譯技術(shù)

優(yōu)化前的 Dynamic VNode 渲染流程圖如下

Vue SSR怎么實(shí)現(xiàn)即時(shí)編譯技術(shù)

優(yōu)化后的 Dynamic VNode 渲染流程圖如下

Vue SSR怎么實(shí)現(xiàn)即時(shí)編譯技術(shù)

如何修改渲染函數(shù)的源代碼

修改渲染函數(shù)的難點(diǎn)在于如何建立 VNode 與源代碼的對(duì)應(yīng)關(guān)系,否則我們無(wú)從得知需要優(yōu)化的節(jié)點(diǎn)是哪段代碼生成的,這看起來(lái)非常困難。幸運(yùn)的是 Vue 的模板語(yǔ)法提供了很不錯(cuò)的約束,內(nèi)置的編譯引擎也確保了渲染函數(shù)代碼結(jié)構(gòu)可預(yù)測(cè)。

如下模板代碼編譯生成的渲染函數(shù)結(jié)構(gòu)是有章可循的

<template>
 <div>
  <static-view/>
  <dynamic-view/>
 </div>
</template>
_c("div", [
 _c("static-view"),
 _c("dynamic-view")
], 1)

執(zhí)行 _c(xxx) 會(huì)生成一個(gè) VNode 節(jié)點(diǎn),解析 _c(xxx) 會(huì)生成一個(gè)固定結(jié)構(gòu)的 AST,將 AST 與 VNode 做綁定,如果當(dāng)前 VNode 為靜態(tài)節(jié)點(diǎn),則修改對(duì)應(yīng)的 AST,VNode 樹遍歷結(jié)束后再將 AST 轉(zhuǎn)化成可執(zhí)行的代碼,代碼里便有了我們對(duì) VNode 做的優(yōu)化。詳細(xì)的技術(shù)實(shí)現(xiàn)可參考項(xiàng)目中的 patch.js 和 patch-context.js 文件。

如下流程圖演示了修改渲染函數(shù)源代碼的過(guò)程

Vue SSR怎么實(shí)現(xiàn)即時(shí)編譯技術(shù)

一個(gè)簡(jiǎn)單的例子如下

<template>
 <div>
  <router-link to="/">{{name}}</router-link>
  <router-view></router-view>
 </div>
</template>

<script>
export default {
 data() {
  return {
   name: 'vue-ssr-jit'
  }
 }
}
</script>

官方編譯器生成的代碼:

_c("div", [
 _c("router-link", {attrs: { to: "/" }}, [
  _vm._v(_vm._s(_vm.name))
 ]),
 _c("router-view")
], 1)

使用 SSR 即時(shí)編譯生成的代碼:

_c("div", [
 _vm._ssrNode(
  "<a href=\"/\" class=\"router-link-active\">vue-ssr-jit</a>"
 ),
 _c("router-view")
], 1);

用法

npm install --save vue-ssr-jit
const { createBundleRenderer } = require('vue-ssr-jit')

createBundleRenderer 與官方同名函數(shù)接口一致,參考 vue ssr 指南

推薦使用 serverPrefetch 預(yù)取數(shù)據(jù),也支持使用 asyncData 預(yù)取數(shù)據(jù),參考 demo

哪些場(chǎng)景會(huì)導(dǎo)致優(yōu)化失敗

cookie

不要在服務(wù)端渲染周期內(nèi)使用 cookie,除非你確定此數(shù)據(jù)與用戶無(wú)關(guān)??梢栽?serverPrefetch / asyncData 方法內(nèi)使用 cookie,服務(wù)端渲染周期結(jié)束后也可以被使用,例如:mounted,updated 等等。

不推薦用法

data() {
 let cookie = cookie;
 try {
  cookie = document.cookie;
 } catch(e) {
  cookie = global.xxx.cookie;
 }
 return {
  cookie
 };
},

推薦用法

mounted() {
 this.cookie = document.cookie;
},

v-for

v-for 指令建議用 dom 元素單獨(dú)包裹,不建議和其他組件并排使用,由于 for 循環(huán)會(huì)擾亂抽象語(yǔ)法樹與 VNode 節(jié)點(diǎn)的對(duì)應(yīng)關(guān)系,除非 v-for 指令所在的整個(gè)節(jié)點(diǎn)層級(jí)全為靜態(tài),否則將不會(huì)對(duì)包含 v-for 指令的層級(jí)及子級(jí)做優(yōu)化。

不推薦用法

<template>
 <div>
  <div v-for="item in items" :key="item.id">{{item.value}}</div>
  <static-view></static-view>
 </div>
</template>

推薦用法

<template>
 <div>
  <div>
   <div v-for="item in items" :key="item.id">{{item.value}}</div>
  </div>
  <static-view></static-view>
 </div>
</template>

閉包

某些場(chǎng)景下,渲染函數(shù)引用了閉包變量,同時(shí)這個(gè)閉包變量又影響著一個(gè)動(dòng)態(tài)的節(jié)點(diǎn),通過(guò) ast 逆向生成的渲染函數(shù)暫時(shí)無(wú)法追蹤到之前的閉包引用,執(zhí)行時(shí)會(huì)因找不到變量而報(bào)錯(cuò),碰到這種情況,解析引擎將放棄當(dāng)前組件的 ast 優(yōu)化,轉(zhuǎn)而使用優(yōu)化前的渲染函數(shù)。

不推薦用法:

<template>
 <img :src="require(`@/assets/${img}`)" >
</template>

推薦用法:

<template>
 <img :src="getImgUrl(img)" >
</template>

以上就是關(guān)于Vue SSR怎么實(shí)現(xiàn)即時(shí)編譯技術(shù)的內(nèi)容,如果你們有學(xué)習(xí)到知識(shí)或者技能,可以把它分享出去讓更多的人看到。

分享名稱:VueSSR怎么實(shí)現(xiàn)即時(shí)編譯技術(shù)
網(wǎng)站鏈接:http://aaarwkj.com/article6/gdehig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)、App設(shè)計(jì)、品牌網(wǎng)站制作Google、網(wǎng)站收錄、響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司
欧美日韩免费r在线视频| 国产爆操美女在线观看| 亚洲家庭伦理在线观看| 97色伦97色伦国产在线| 日韩中文字幕一区二区不卡 | 粉嫩av一男战三女高潮| 手机免费在线观看国产精品| 国产精品又大又黑又长又粗| 国产午夜男人天堂手机| 日韩亚洲天堂视频免费观看| 少妇人妻系列中文在线| 亚洲精品小视频在线观看| 欧美日韩亚洲中文二区| 日本少妇三级网站大全| 日本精品一区二区不卡| 国产一区在线免费在线观看| 国产欧美日韩一区二区三区四区 | 女同亚洲一区二区三区| 日本东京热免费一二三区| 91国产自拍在线视频| 日本特黄特色高清免费大片| 国产精品人成在线观看不卡| 激情五月婷婷我有我色| 亚洲 欧美 日韩一区| 熟女人妻精品一二三四| 日韩视频免费看一区二区| 欧美老熟妇一区三区精品| 国产一区二区三区av| 欧美一级特黄大片做受另类| 国产一区二区毛多内射| 午夜激情视频福利在线观看| 大香蕉欧美日韩在线视频| 国产欧美日韩精品久久久久久| 日本东京热加勒比视频| 亚洲欧美日韩另类精品一区二区三区| 在线观看国产激情免费视频| 免费又色又爽无遮挡网站| 日韩毛片资源在线观看| 欧美日本国产高清不卡| 国产亚洲一区激情小说| 日韩在线国产亚洲精品|