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

您的位置:首頁技術文章
文章詳情頁

Vue SSR 即時編譯技術的實現

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

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

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

GitHub:vue-ssr-jit

JIT Diff 算法

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

Vue SSR 即時編譯技術的實現

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

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

Vue SSR 即時編譯技術的實現

優化前的 Dynamic VNode 渲染流程圖如下

Vue SSR 即時編譯技術的實現

優化后的 Dynamic VNode 渲染流程圖如下

Vue SSR 即時編譯技術的實現

如何修改渲染函數的源代碼

修改渲染函數的難點在于如何建立 VNode 與源代碼的對應關系,否則我們無從得知需要優化的節點是哪段代碼生成的,這看起來非常困難。幸運的是 Vue 的模板語法提供了很不錯的約束,內置的編譯引擎也確保了渲染函數代碼結構可預測。

如下模板代碼編譯生成的渲染函數結構是有章可循的

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

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

執行 _c(xxx) 會生成一個 VNode 節點,解析 _c(xxx) 會生成一個固定結構的 AST,將 AST 與 VNode 做綁定,如果當前 VNode 為靜態節點,則修改對應的 AST,VNode 樹遍歷結束后再將 AST 轉化成可執行的代碼,代碼里便有了我們對 VNode 做的優化。詳細的技術實現可參考項目中的 patch.js 和 patch-context.js 文件。

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

Vue SSR 即時編譯技術的實現

一個簡單的例子如下

<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://m.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 與官方同名函數接口一致,參考 vue ssr 指南

推薦使用 serverPrefetch 預取數據,也支持使用 asyncData 預取數據,參考 demo

哪些場景會導致優化失敗

cookie

不要在服務端渲染周期內使用 cookie,除非你確定此數據與用戶無關。可以在 serverPrefetch / asyncData 方法內使用 cookie,服務端渲染周期結束后也可以被使用,例如: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 循環會擾亂抽象語法樹與 VNode 節點的對應關系,除非 v-for 指令所在的整個節點層級全為靜態,否則將不會對包含 v-for 指令的層級及子級做優化。

不推薦用法

<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>

閉包

某些場景下,渲染函數引用了閉包變量,同時這個閉包變量又影響著一個動態的節點,通過 ast 逆向生成的渲染函數暫時無法追蹤到之前的閉包引用,執行時會因找不到變量而報錯,碰到這種情況,解析引擎將放棄當前組件的 ast 優化,轉而使用優化前的渲染函數。

不推薦用法:

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

推薦用法:

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

到此這篇關于Vue SSR 即時編譯技術的實現的文章就介紹到這了,更多相關Vue SSR 即時編譯 內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
蜜桃tv一区二区三区| 美女精品在线| 日韩av电影一区| 亚洲免费网址| 美女国产一区| 日韩美女精品| 欧美专区一区| 国产精品毛片aⅴ一区二区三区| 日韩精品亚洲专区在线观看| 日韩国产在线观看| 国产精品视频3p| 久久伊人久久| 久久超级碰碰| 国产精品久久久久蜜臀| 亚洲最新无码中文字幕久久 | 蜜桃久久av一区| 国产农村妇女精品一二区| 日本 国产 欧美色综合| 日韩三级一区| 麻豆精品av| 中文字幕高清在线播放| 久久久9色精品国产一区二区三区| 欧美色图一区| 免费人成精品欧美精品| 日本亚洲欧洲无免费码在线| 日韩美女精品| 狠狠久久伊人| 久久香蕉国产| 一区二区精彩视频| 国产精品探花在线观看| 日韩在线看片| 日韩影院精彩在线| 国产精品久久久久久久久免费高清 | 久久99伊人| 国产日韩欧美三级| 国产精品久久777777毛茸茸| 日韩欧美不卡| 亚洲综合中文| 国产在线观看91一区二区三区 | 日韩激情视频网站| 国产自产自拍视频在线观看| 国产精品女主播一区二区三区| 久久狠狠久久| 久久久精品五月天| 中文在线日韩| 国产一区福利| 免费视频久久| 久久伊人久久| 在线亚洲国产精品网站| 国产伦理久久久久久妇女| 日韩中文在线电影| 日韩美女国产精品| 成人午夜国产| 欧美色综合网| 欧美91福利在线观看| 日本午夜精品| 99成人在线视频| 日本午夜精品一区二区三区电影| 国产粉嫩在线观看| 亚洲专区视频| 久久精品中文| 国产精品日本一区二区不卡视频| 日本在线精品| 国产亚洲人成a在线v网站 | 99久久亚洲精品蜜臀| 911亚洲精品| 五月婷婷亚洲| 国产中文欧美日韩在线| 天堂va在线高清一区| 成人自拍av| 国产精品亚洲片在线播放| av不卡免费看| 日韩在线观看一区| 国产精品巨作av| 视频一区二区三区在线| 亚洲黄色中文字幕| 欧美日韩一视频区二区| 婷婷亚洲五月| 日韩中文欧美| 久久精品国产精品亚洲毛片| 亚洲综合激情在线| 1000部精品久久久久久久久| 精品黄色一级片| 色综合视频一区二区三区日韩| 亚洲a一区二区三区| 精品中国亚洲| 日韩精选在线| 久久香蕉精品| 免费国产自久久久久三四区久久| 久久久亚洲欧洲日产| 日本一区二区三区中文字幕| 亚洲性色视频| 91亚洲一区| 国产激情久久| 欧美天堂在线| 日韩国产欧美视频| 日韩精品一二三四| 激情婷婷欧美| 久久人人97超碰国产公开结果| 久久一区国产| 老司机免费视频一区二区三区| 日本午夜精品久久久| 中文字幕av亚洲精品一部二部| 亚洲欧美日韩国产综合精品二区| 91精品亚洲| 久久只有精品| 美女精品久久| 鲁大师精品99久久久| 国产欧美精品久久| 日本欧美一区| 国产日韩欧美高清免费| 日本天堂一区| 欧美日韩一区自拍| 国产日韩视频| 美腿丝袜亚洲一区| 国产乱子精品一区二区在线观看| 日韩国产在线不卡视频| 日韩欧美中文字幕在线视频| 日韩国产在线一| 久久国产人妖系列| 国产精品亚洲成在人线| 国产日产一区| 欧美激情一区| 精品日本视频| 成人亚洲精品| 国产成人精品三级高清久久91 | 日韩av影院| 欧美日韩视频免费看| 偷拍亚洲精品| 国产调教一区二区三区| 国产精品久久乐| 欧美国产一级| 久久久影院免费| 亚洲欧美日韩视频二区| 亚洲人www| 日韩三区四区| 国产精品久久久久久模特| 精品亚洲自拍| 久久三级视频| 视频一区二区欧美| 国产探花在线精品| 国产96在线亚洲| 久久中文字幕av| 香蕉成人久久| 日本视频中文字幕一区二区三区| 欧美极品一区二区三区| yellow在线观看网址| 欧美成人国产| 亚洲2区在线| 久久精品国产一区二区| 在线天堂资源www在线污| 精品一区在线| 亚洲精品三级| 美女久久99| 成人免费电影网址| 天堂av在线一区| 欧美在线黄色| 亚洲精品88| 国产精品毛片| 国产精品一线| 欧美三级精品| 亚洲有吗中文字幕| 国产精品久久久久毛片大屁完整版| 国产夫妻在线| 久久福利精品| 久久国产精品免费一区二区三区| 麻豆视频一区二区| 不卡av一区二区| 日本视频一区二区| 日韩欧美在线中字| 中文字幕亚洲精品乱码| 精品一区二区三区在线观看视频 | 久久九九国产| 亚洲永久精品唐人导航网址| 精品国产18久久久久久二百| 91精品久久久久久久久久不卡| 国产亚洲精品v| 欧美在线91| 99国产精品免费视频观看| 日韩欧美中文字幕在线视频| 国内精品麻豆美女在线播放视频| 亚洲激情婷婷| 欧美极品一区二区三区| 一区二区视频欧美| 国产精久久一区二区| 午夜欧美视频| 欧美国产极品| 日本大胆欧美人术艺术动态| 国产一区二区三区亚洲| 一区二区三区网站| 亚洲性色av| 国产亚洲电影| 91精品99| 精品国产麻豆| 亚洲影院天堂中文av色| 群体交乱之放荡娇妻一区二区| 青草综合视频| 欧美日韩精品免费观看视频完整| 久久gogo国模啪啪裸体| 免费精品视频在线|