日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:157日期:2023-01-22 17:17:27

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

提取模板中靜態(tài)的 html 只需在編譯期對模板結(jié)構(gòu)做解析,而判斷動態(tài)節(jié)點(diǎn)在服務(wù)端渲染階段是否為靜態(tài),需在運(yùn)行時(shí)對 VNode 做 Diff,將動態(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 算法

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

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

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

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

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

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

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

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

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

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

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

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

<template> <div> <static-view/> <dynamic-view/> </div></template>

_c('div', [ _c('static-view'), _c('dynamic-view')], 1)

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

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

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

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

<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='http://www.b3g6.com/' 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

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

cookie

不要在服務(wù)端渲染周期內(nèi)使用 cookie,除非你確定此數(shù)據(jù)與用戶無關(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)會擾亂抽象語法樹與 VNode 節(jié)點(diǎn)的對應(yīng)關(guān)系,除非 v-for 指令所在的整個(gè)節(jié)點(diǎn)層級全為靜態(tài),否則將不會對包含 v-for 指令的層級及子級做優(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>

閉包

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

不推薦用法:

<template> <img :src='http://www.b3g6.com/bcjs/require(`@/assets/${img}`)' ></template>

推薦用法:

<template> <img :src='http://www.b3g6.com/bcjs/getImgUrl(img)' ></template>

到此這篇關(guān)于Vue SSR 即時(shí)編譯技術(shù)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Vue SSR 即時(shí)編譯 內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲国产成人二区| 高清久久一区| 亚洲精品观看| 另类亚洲自拍| 99热精品久久| 久久精品卡一| 成人在线免费观看91| 精品久久国产一区| 久久激情五月激情| 三级一区在线视频先锋| 黄色成人91| 国产精品videossex久久发布| 91精品日本| 久久一级电影| 水蜜桃久久夜色精品一区| 欧美激情福利| 老鸭窝一区二区久久精品| 伊人久久av| 国产一区亚洲| 99国产精品自拍| 天海翼精品一区二区三区| 日韩福利视频导航| 久久国产精品色av免费看| 国产精品亲子伦av一区二区三区| 美女毛片一区二区三区四区最新中文字幕亚洲| 国产欧美日韩精品一区二区三区| 欧美一区影院| 国产一区不卡| 婷婷成人综合| 日本欧美大码aⅴ在线播放| 国产精品1区在线| 97视频热人人精品免费| 日韩视频一区二区三区在线播放免费观看| 国产手机视频一区二区| 亚洲乱码视频| 国产乱码精品一区二区三区四区| 久久久久97| 国产伊人精品| 国产乱码精品一区二区三区亚洲人 | 久久中文在线| 国产不卡精品在线| 欧美日韩国产免费观看视频| 亚洲精品四区| 久久夜夜操妹子| 免费国产自线拍一欧美视频| 91大神在线观看线路一区| 国产91在线播放精品| 国精品一区二区三区| 久久亚洲欧美| 正在播放日韩精品| 日本成人精品| 日本va欧美va精品发布| 夜鲁夜鲁夜鲁视频在线播放| 黄色成人精品网站| 国产乱码精品一区二区三区亚洲人| 欧美黄色网页| 日韩动漫一区| 欧美jjzz| 国产视频网站一区二区三区| 精品欧美久久| 国产精品多人| 亚洲免费婷婷| 精品亚洲二区| 日韩在线网址| 日韩在线高清| 免费欧美在线视频| 久久免费视频66| 国产手机视频一区二区| 日韩va亚洲va欧美va久久| 成人在线视频免费看| 蜜臀久久99精品久久久久宅男| 精品午夜视频| 色狠狠一区二区三区| 99精品国产一区二区三区| 你懂的国产精品永久在线| 日本一二区不卡| 婷婷激情一区| 日本一区中文字幕| 久久久影院免费| 国产精品久久久久av蜜臀| 一区三区视频| 福利一区和二区| 久久av一区二区三区| 国产精品原创| 亚洲黄页一区| 精品国产91| 日韩精品1区2区3区| 欧美日韩激情在线一区二区三区| 欧美激情99| 亚洲精品日本| 国产精久久久| 模特精品在线| 欧美亚洲国产精品久久| 国产乱人伦精品一区| 在线观看一区| 老司机精品视频网| 老司机免费视频一区二区| 一本色道精品久久一区二区三区| 国产亚洲欧美日韩精品一区二区三区| 日本美女一区| 久久精品国产亚洲一区二区三区| 亚洲一卡久久| 欧美在线影院| 日韩久久精品| 福利精品在线| 国产精品人人爽人人做我的可爱| 日韩在线观看一区| 国产视频一区二| 国产毛片精品| 亚洲精品888| se01亚洲视频| 麻豆网站免费在线观看| 欧美久久亚洲| 国产亚洲精品精品国产亚洲综合| 久久久久伊人| 国产欧美日韩亚洲一区二区三区| 日韩在线一二三区| 香蕉久久夜色精品国产| 欧美.日韩.国产.一区.二区 | 久久中文字幕av一区二区不卡| 亚洲精品永久免费视频| 国产亚洲久久| 国产精品免费大片| 国产欧洲在线| 中文字幕在线视频网站| 老牛国产精品一区的观看方式| 婷婷亚洲五月| 激情久久婷婷| 美女国产一区| 亚洲欧美日本视频在线观看| 视频在线在亚洲| 蜜臀av一区二区三区| 亚洲精品乱码| 欧美亚洲自偷自偷| 久久99久久人婷婷精品综合| 免费久久99精品国产| 婷婷精品在线观看| 国产亚洲欧美日韩在线观看一区二区| 日本va欧美va欧美va精品| 国产欧美一区二区精品久久久| 午夜一区在线| 中文字幕亚洲精品乱码| 亚洲精品自拍| 国产福利一区二区精品秒拍| 日韩精品91亚洲二区在线观看| 欧美视频久久| 国产精品激情| 久久久天天操| 亚洲精品97| 涩涩涩久久久成人精品| 69堂精品视频在线播放| 国际精品欧美精品| 红杏一区二区三区| 亚洲韩日在线| 日本不卡高清视频| 日韩极品在线观看| 亚洲精品一级二级三级| 欧美国产精品| 欧美日韩免费看片| 免费看的黄色欧美网站| 自拍日韩欧美| 国产精品久久免费视频| 久久婷婷激情| 日韩中文字幕亚洲一区二区va在线| 欧美亚洲tv| 久久一区精品| 欧美特黄视频| 91综合久久爱com| 中文字幕成在线观看| 久久久噜噜噜| 日韩av电影一区| 国产调教精品| 怡红院精品视频在线观看极品| 国内精品福利| 91欧美极品| 91精品啪在线观看国产18 | 精品99在线| 丝瓜av网站精品一区二区| 国产亚洲精品美女久久| 亚洲视频综合| 欧美黄色精品| 欧美日韩调教| 伊人久久亚洲美女图片| 国产日韩高清一区二区三区在线| 久久麻豆精品| 98精品久久久久久久| 亚洲精品福利| 男女激情视频一区| 精品视频在线你懂得| 91国内精品| 日韩欧美中文字幕电影| 亚洲国产专区校园欧美| 激情黄产视频在线免费观看| 亚洲毛片在线免费| 国产亚洲毛片在线| 麻豆视频久久| 久久亚洲欧美| 精品久久国产一区| av免费不卡国产观看| 天堂精品久久久久|