最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2020年05月06日 14:28:36   作者:張創(chuàng)  
這篇文章主要介紹了Vue SSR 即時編譯技術的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

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

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

GitHub:vue-ssr-jit

JIT Diff 算法

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

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

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

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

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

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

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

如下模板代碼編譯生成的渲染函數(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é)點,則修改對應的 AST,VNode 樹遍歷結(jié)束后再將 AST 轉(zhuǎn)化成可執(zhí)行的代碼,代碼里便有了我們對 VNode 做的優(yōu)化。詳細的技術實現(xiàn)可參考項目中的 patch.js 和 patch-context.js 文件。

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

一個簡單的例子如下

<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=\"/\" 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 預取數(shù)據(jù),也支持使用 asyncData 預取數(shù)據(jù),參考 demo

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

cookie

不要在服務端渲染周期內(nèi)使用 cookie,除非你確定此數(shù)據(jù)與用戶無關??梢栽?serverPrefetch / asyncData 方法內(nèi)使用 cookie,服務端渲染周期結(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é)點的對應關系,除非 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="require(`@/assets/${img}`)" >
</template>

推薦用法:

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

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

相關文章

  • vue-cli3+echarts實現(xiàn)漸變色儀表盤組件封裝

    vue-cli3+echarts實現(xiàn)漸變色儀表盤組件封裝

    這篇文章主要為大家詳細介紹了vue-cli3+echarts實現(xiàn)漸變色儀表盤組件封裝,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Vue使用el-input自動獲取焦點和二次獲取焦點問題及解決

    Vue使用el-input自動獲取焦點和二次獲取焦點問題及解決

    這篇文章主要介紹了Vue使用el-input自動獲取焦點和二次獲取焦點問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Vue組件庫發(fā)布到npm詳解

    Vue組件庫發(fā)布到npm詳解

    本片文章給大家詳細介紹了如何將Vue組件庫發(fā)布到npm的方法以及代碼示例分享,感興趣的朋友參考學習下。
    2018-02-02
  • bing Map 在vue項目中的使用詳解

    bing Map 在vue項目中的使用詳解

    這篇文章主要介紹了bing Map 在vue項目中的使用,需要的朋友可以參考下
    2018-04-04
  • 10分鐘快速上手VueRouter4.x教程

    10分鐘快速上手VueRouter4.x教程

    Vue Router目前最新版本是4.X,本文主要主要介紹了10分鐘快速上手VueRouter4.x教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • vue短信驗證性能優(yōu)化如何寫入localstorage中

    vue短信驗證性能優(yōu)化如何寫入localstorage中

    這篇文章主要介紹了vue短信驗證性能優(yōu)化寫入localstorage中的方法,解決這個問題需要把時間都寫到localstorage里面去,具體解決方法大家參考下本文
    2018-04-04
  • vue中?$forceUpdate的使用解析

    vue中?$forceUpdate的使用解析

    這篇文章主要介紹了vue中?$forceUpdate的使用解析,該方案是比較好的一種方式,比如說我們嘗試直接給某個??object??增加一個屬性,發(fā)現(xiàn)頁面上沒有效果;直接將length變成0來清空數(shù)組,下文詳細資料需要的小伙伴可以參考一下
    2022-04-04
  • 手拉手教你如何處理vue項目中的錯誤

    手拉手教你如何處理vue項目中的錯誤

    在項目開發(fā)中經(jīng)常遇到各種報錯,每次總是通過這樣或那樣的辦法解決掉,這篇文章主要給大家介紹了關于如何處理vue項目中錯誤的相關資料,需要的朋友可以參考下
    2022-06-06
  • 將 vue 生成的 js 上傳到七牛的實例

    將 vue 生成的 js 上傳到七牛的實例

    本篇文章主要介紹了將 vue 生成的 js 上傳到七牛的實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • vue3+TS reactive設定類型方式

    vue3+TS reactive設定類型方式

    這篇文章主要介紹了vue3+TS reactive設定類型方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04

最新評論

阿荣旗| 仙居县| 博白县| 徐闻县| 屏山县| 沙田区| 安达市| 阜平县| 泰来县| 绿春县| 禹州市| 潍坊市| 明溪县| 阜城县| 台中县| 酉阳| 佛学| 宜兰县| 车致| 五指山市| 长丰县| 西丰县| 昂仁县| 额济纳旗| 三亚市| 武宁县| 上蔡县| 沙田区| 信宜市| 清水县| 南开区| 海城市| 鲁山县| 光泽县| 微山县| 垫江县| 北流市| 烟台市| 什邡市| 钦州市| 方城县|