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

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

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

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

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

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

GitHub:vue-ssr-jit

JIT Diff 算法

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

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

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

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

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

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

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

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

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

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

修改渲染函數(shù)的難點在于如何建立 VNode 與源代碼的對應(yīng)關(guān)系,否則我們無從得知需要優(yōu)化的節(jié)點是哪段代碼生成的,這看起來非常困難。幸運的是 Vue 的模板語法提供了很不錯的約束,內(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) 會生成一個 VNode 節(jié)點,解析 _c(xxx) 會生成一個固定結(jié)構(gòu)的 AST,將 AST 與 VNode 做綁定,如果當前 VNode 為靜態(tài)節(jié)點,則修改對應(yīng)的 AST,VNode 樹遍歷結(jié)束后再將 AST 轉(zhuǎn)化成可執(zhí)行的代碼,代碼里便有了我們對 VNode 做的優(yōu)化。詳細的技術(shù)實現(xiàn)可參考項目中的 patch.js 和 patch-context.js 文件。

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

Vue SSR 即時編譯技術(shù)的實現(xià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 即時編譯生成的代碼:

_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 元素單獨包裹,不建議和其他組件并排使用,由于 for 循環(huán)會擾亂抽象語法樹與 VNode 節(jié)點的對應(yīng)關(guān)系,除非 v-for 指令所在的整個節(jié)點層級全為靜態(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ù)引用了閉包變量,同時這個閉包變量又影響著一個動態(tài)的節(jié)點,通過 ast 逆向生成的渲染函數(shù)暫時無法追蹤到之前的閉包引用,執(zhí)行時會因找不到變量而報錯,碰到這種情況,解析引擎將放棄當前組件的 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ù)的實現(xiàn)的文章就介紹到這了,更多相關(guān)Vue SSR 即時編譯 內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久不卡日韩美女| 精品一级视频| 亚洲www啪成人一区二区| 精品国产一区二区三区av片| 欧美精品影院| 国产精久久久| 日韩国产激情| 欧美精品成人| 久久亚洲人体| 99久精品视频在线观看视频| 激情婷婷欧美| 鲁大师成人一区二区三区| 婷婷五月色综合香五月| 日韩欧美高清一区二区三区| 久久国产精品色av免费看| 欧美激情日韩| 欧美色图一区| 日韩精品视频中文字幕| 成人在线视频免费| 久久久人人人| 日本中文字幕一区二区| 欧美xxxx中国| 成人精品中文字幕| 巨乳诱惑日韩免费av| 麻豆久久久久久| 久久人人88| 国产伦精品一区二区三区在线播放| 国产不卡精品| 亚洲三级精品| 日韩欧美少妇| 日韩精品久久久久久久软件91| 国产精品久久久一区二区| 视频福利一区| 欧美日韩一区二区国产| 99精品国产一区二区三区| 欧美日韩亚洲一区在线观看| 国产精品99免费看| 亚洲精品综合| 日韩黄色大片| 国产精品亲子伦av一区二区三区| 91精品1区| 日韩在线二区| 红杏一区二区三区| 91精品国产自产观看在线 | 国产白浆在线免费观看| 亚洲精品亚洲人成在线观看| 99精品电影| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 91成人在线精品视频| 鲁大师影院一区二区三区| 国产精品久久久久av电视剧| 精品三级av| 国产精品流白浆在线观看| 日韩精品视频网站| 亚洲人成在线影院| 美女精品在线| 婷婷中文字幕一区| 欧美福利专区| 精品国产免费人成网站| 美日韩一区二区三区| 中文一区一区三区免费在线观 | 国产精品xx| 国产高清不卡| 日韩久久精品| 亚洲91久久| 久久国产中文字幕| 六月婷婷综合| 波多野结衣久久精品| 精品亚洲自拍| 日韩精品免费一区二区在线观看| 欧美91在线| 电影91久久久| 超碰在线99| 欧美激情 亚洲a∨综合| 精品国产亚洲日本| 激情综合在线| 视频一区免费在线观看| 日韩中文字幕| 国产精品高清一区二区| av综合电影网站| 日韩中文欧美在线| 麻豆精品视频在线观看视频| 91精品国产调教在线观看| 免费看日韩精品| 国产精品白丝久久av网站| 成人自拍av| 亚洲+小说+欧美+激情+另类| 美女免费视频一区| 精品美女视频 | 国产精品高潮呻吟久久久久| 久久久久久久欧美精品| 99视频在线精品国自产拍免费观看| 日韩欧美美女在线观看| 高清av不卡| 亚洲成人一区| 日本va欧美va精品发布| 亚洲黄色免费看| 欧美日韩尤物久久| 亚洲啊v在线免费视频| 不卡福利视频| 国产欧美一区| 亚洲欧美视频一区二区三区| 国产精久久一区二区| 9国产精品视频| 国产aa精品| 久久国产精品免费精品3p| 99pao成人国产永久免费视频 | 一本综合精品| 欧美精品一区二区三区精品| 久久99影视| 亚洲18在线| 91久久亚洲| 久久国产欧美| 国产精品一区毛片| 国产99久久久国产精品成人免费| 亚洲在线国产日韩欧美| 电影亚洲精品噜噜在线观看| 美女视频网站久久| 91麻豆精品激情在线观看最新| 亚洲激情久久| 老司机免费视频一区二区三区| 中文字幕乱码亚洲无线精品一区| 自由日本语亚洲人高潮| 欧美搞黄网站| 免费精品国产的网站免费观看| 91亚洲国产成人久久精品| 国产精品99久久免费观看| 日韩av资源网| 国产精品九九| 精品国产一区二区三区性色av| 日本欧美在线看| 蜜桃视频免费观看一区| 丝袜美腿一区二区三区| 日韩一区二区三区精品| 日韩三区四区| 蜜桃久久久久久| 亚洲欧洲美洲国产香蕉| 亚洲精品美女91| 国产亚洲久久| 国产精品白浆| 在线人成日本视频| 欧美另类综合| 亚洲精品大全| 国产精品115| 久久激情婷婷| 伊人国产精品| 麻豆91精品视频| 欧美成a人免费观看久久| 免费不卡在线视频| 国产精品亚洲片在线播放| 97久久精品| av日韩中文| 最新国产精品| 日韩av自拍| 国产亚洲一区在线| 国产精品高清一区二区| 欧美日中文字幕| 亚洲精品乱码久久久久久蜜桃麻豆 | 性欧美长视频| 欧美一级二级视频| 国产成人精选| 美女精品在线| 国产成年精品| 亚洲人成高清| 日本国产精品| 美女国产一区二区三区| 午夜日韩在线| 成人日韩精品| 国产日韩欧美三级| 久久精品国产www456c0m| 欧美国产亚洲精品| 综合欧美精品| 久久久精品五月天| 精品国产一区二区三区性色av| 视频一区欧美精品| 国产精品久久亚洲不卡| 玖玖玖国产精品| 久久精品中文| 日韩av有码| 国产精品亚洲四区在线观看| 蜜桃一区二区三区在线观看| 99tv成人| 久久久夜夜夜| 日韩欧美网址| 狠狠久久伊人| 久久精品天堂| 国产精品一级| 国产欧美一区| 91成人精品在线| 欧美日韩一区自拍| 亚洲一区激情| 亚洲福利免费| 日韩一区二区三区在线免费观看| 高清不卡一区| 麻豆久久一区二区| 久久国产人妖系列| 国产精品片aa在线观看| 国产精品免费99久久久| 久久99视频| 日本一二区不卡|