电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

Vue SSR 即時編譯技術的實現

瀏覽:96日期: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://www.hdgsjgj.cn/' 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://www.hdgsjgj.cn/bcjs/require(`@/assets/${img}`)' ></template>

推薦用法:

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

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

標簽: Vue
相關文章:
主站蜘蛛池模板: 创富网-B2B网站|供求信息网|b2b平台|专业电子商务网站 | CNC机加工-数控加工-精密零件加工-ISO认证厂家-鑫创盟 | 工业胀紧套_万向节联轴器_链条-规格齐全-型号选购-非标订做-厂家批发价格-上海乙谛精密机械有限公司 | LHH药品稳定性试验箱-BPS系列恒温恒湿箱-意大利超低温冰箱-上海一恒科学仪器有限公司 | 红酒招商加盟-葡萄酒加盟-进口红酒代理-青岛枞木酒业有限公司 | 不锈钢拉手厂家|浴室门拉手厂家|江门市蓬江区金志翔五金制品有限公司 | Win10系统下载_32位/64位系统/专业版/纯净版下载 | 蜗轮丝杆升降机-螺旋升降机-丝杠升降机厂家-润驰传动 | 交联度测试仪-湿漏电流测试仪-双85恒温恒湿试验箱-常州市科迈实验仪器有限公司 | ETFE膜结构_PTFE膜结构_空间钢结构_膜结构_张拉膜_浙江萬豪空间结构集团有限公司 | 复盛空压机配件-空气压缩机-复盛空压机(华北)总代理 | 搅拌磨|搅拌球磨机|循环磨|循环球磨机-无锡市少宏粉体科技有限公司 | 浇钢砖,流钢砖_厂家价低-淄博恒森耐火材料有限公司 | sus630/303cu不锈钢棒,440C/430F/17-4ph不锈钢研磨棒-江苏德镍金属科技有限公司 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | 微信小程序定制,广州app公众号商城网站开发公司-广东锋火 | 色谱柱-淋洗液罐-巴罗克试剂槽-巴氏吸管-5ml样品瓶-SBS液氮冻存管-上海希言科学仪器有限公司 | 制氮设备_PSA制氮机_激光切割制氮机_氮气机生产厂家-苏州西斯气体设备有限公司 | 超声骨密度仪,双能X射线骨密度仪【起草单位】,骨密度检测仪厂家 - 品源医疗(江苏)有限公司 | 在线PH计-氧化锆分析仪-在线浊度仪-在线溶氧仪- 无锡朝达 | RO反渗透设备_厂家_价格_河南郑州江宇环保科技有限公司 | Duoguan 夺冠集团 | 车辆定位管理系统_汽车GPS系统_车载北斗系统 - 朗致物联 | 游动电流仪-流通式浊度分析仪-杰普仪器(上海)有限公司 | CE认证_产品欧盟ROHS-REACH检测机构-商通检测 | 无锡网站建设_小程序制作_网站设计公司_无锡网络公司_网站制作 | 考勤系统_考勤管理系统_网络考勤软件_政企|集团|工厂复杂考勤工时统计排班管理系统_天时考勤 | 预制围墙_工程预制围墙_天津市瑞通建筑材料有限公司 | 济南网站建设_济南网站制作_济南网站设计_济南网站建设公司_富库网络旗下模易宝_模板建站 | 湖南自考_湖南自学考试 | 层流手术室净化装修-检验科ICU改造施工-华锐净化工程-特殊科室建设厂家 | 工控机,嵌入式主板,工业主板,arm主板,图像采集卡,poe网卡,朗锐智科 | 学校用栓剂模,玻璃瓶轧盖钳,小型安瓿熔封机,实验室安瓿熔封机-长沙中亚制药设备有限公司 | 移动机器人产业联盟官网| 低压载波电能表-单相导轨式电能表-华邦电力科技股份有限公司-智能物联网综合管理平台 | 乐考网-银行从业_基金从业资格考试_初级/中级会计报名时间_中级经济师 | 小型气象站_车载气象站_便携气象站-山东风途物联网 | 东莞工厂厂房装修_无尘车间施工_钢结构工程安装-广东集景建筑装饰设计工程有限公司 | 合肥废气治理设备_安徽除尘设备_工业废气处理设备厂家-盈凯环保 合肥防火门窗/隔断_合肥防火卷帘门厂家_安徽耐火窗_良万消防设备有限公司 | 净化工程_无尘车间_无尘车间装修-广州科凌净化工程有限公司 | AGV叉车|无人叉车|AGV智能叉车|AGV搬运车-江西丹巴赫机器人股份有限公司 |