查看Vue3 模板編譯後的 AST 和渲染函數

2020-12-14 素燕前端

Vue 在開始工作之前,需要對 HTML 模板進行一次編譯,轉換成 AST。一說到 AST 有人可能就害怕了,其實不必,你把它看做是一個 JS 對象,使用了樹這種數據結構,它在這裡的作用就是把 HTML 中每個節點轉換成一個 JS 對象,後面會通過這個 JS 對象來做更多的工作。

那如何才能查看 Vue 編譯後的 AST 呢?

在 Vue3 源碼中,有一個 package(compiler-core),它負責把 HTML 模板轉換成 AST,並生成渲染函數。它可以被單獨作為一個 npm 包來使用,通過使用這個 npm 包即可查看 AST 和渲染函數。我們通過在前面創建的項目 parcel 可做到零配置寫前端項目中添加這個 npm 包。

yarnadd @vue/compiler-core

執行完後,創建一個 JS 文件來使用它:

/** * @file day3-compiler-core.js * @author 素燕 * @description vue3 模板編譯,來自公眾號素燕 */import { baseCompile} from'@vue/compiler-core';let app = document.getElementById('suyan-app');let ret = baseCompile(app.innerHTML);console.log(ret);

suyan-app 這個 ID 選擇器對於的 HTML 模板為:

<divid="suyan-app"><pclass="wrap"><h1>和素燕一起學前端{{ des }}</h1><ahref="http://lefex.gitee.io/">前端小課</a></p></div>

在瀏覽器裡打開我們創建的頁面,可以看看 AST:

通過 ast,我們看下其中某個節點:

生成的渲染函數:

const _Vue = Vuereturnfunctionrender(_ctx, _cache) {with (_ctx) {const {createVNode: _createVNode,toDisplayString: _toDisplayString,Fragment: _Fragment,openBlock: _openBlock,createBlock: _createBlock } = _Vuereturn (_openBlock(), _createBlock(_Fragment, null, [ _createVNode("p", { class: "wrap" }), _createVNode("h1", null, "和素燕一起學前端" + _toDisplayString(des), 1/* TEXT */), _createVNode("a", { href: "http://lefex.gitee.io/" }, "前端小課"), _createVNode("p") ], 64/* STABLE_FRAGMENT */)) }}

通過最終的渲染函數,可以看出 Vue 下一步該創建 VDOM 了。其實整個編譯過程用到了編譯原理的思想。

本文的重點是希望能夠給大家普及一下如何查看 AST 和 渲染函數,以幫助想要學習 Vue3 源碼的朋友提供一個思路。如果你也在學習 Vue 核心編程思想,可以加我微信 wsy9871 共同交流。

大家加油!

素燕《前端小課》

幫助 10W 人入門並進階前端

官網:https://lefex.gitee.io/

相關焦點

  • v-html vue 模板替換 - CSDN
    插槽的使用 - 作用域插槽作用域插槽的概念和使用比較難於理解,通過查看多方資料,做了以下的總結:描述:作用域插槽其實就是帶數據的插槽,即帶參數的插槽,簡單的來說就是子組件提供給父組件的參數,該參數僅限於插槽中使用,父組件可根據子組件傳過來的插槽數據來進行不同的方式展現和填充插槽內容。
  • 如何在uni-app雲開發項目查看雲函數context
    uni-appJavaScript在uni-app項目雲開發時,創建了雲函數,默認有兩個參數event和context。下面利用實例說明:操作步驟:1、新建uni-app項目,選擇uniCloud模板;然後在cloudfunctions-tcb文件夾,新建雲函數querySys
  • 快速在你的vue/react應用中實現ssr(服務端渲染)
    >使用node+vue-server-renderer實現vue項目的服務端渲染使用node+React renderToStaticMarkup實現react項目的服務端渲染傳統網站通過模板引擎來實現ssr(比如ejs, jade, pug等)
  • 經典面試題:2020Vue經典面試題總結(含答案)
    Vue模板渲染的原理是什麼?vue中的模板template無法被瀏覽器解析並渲染,因為這不屬於瀏覽器的標準,不是正確的HTML語法,所有需要將template轉化成一個JavaScript函數,這樣瀏覽器就可以執行這一個函數並渲染出對應的HTML元素,就可以讓視圖跑起來了,這一個轉化的過程,就成為模板編譯。
  • slot vue 用法專題及常見問題 - CSDN
    代碼部署後可能存在的BUG沒法實時知道,事後為了解決這些BUG,花了大量的時間進行log 調試,這邊順便給大家推薦一個好用的BUG監控工具 Fundebug。復用函數Vue組件並不完全是關於HTML和CSS的。它們是用JavaScript構建的,所以也是關於函數的。插槽對於一次性創建函數並在多個地方使用功能非常有用。
  • Vue 3.0 已經正式發布!你想知道的這裡都有!
    隨著時間的流逝,它演變成了 "漸進式框架":一個可以逐步學習和採用的框架,同時為用戶提供持續支持,以應對越來越多的苛刻場景。 時至今日,我們在全球擁有 130 多萬的用戶,我們看到 Vue 被應用於各種不同的場景中的可能,從在傳統的服務端渲染頁面之上添加交互,到擁有數百個組件的完整單頁應用。Vue 3.0 將這種靈活性進一步提升。
  • 如何在uni-app項目創建雲函數資料庫插入記錄
    打開pages.json文件,配置頁面路徑和ta3、接著,在雲函數文件夾上,滑鼠右鍵新建雲函數,輸入名稱,然後點擊創建選中雲函數,滑鼠右鍵上傳部署6、進入到雲服務管理平臺,查看雲函數是否上傳查看雲函數是否上傳7、在對應的vue頁面中,添加一個按鈕,命名為新建資料庫
  • vue的插槽用法 - CSDN
    slot也是同樣地作用,留下一定的空間,每個人使用的時候單獨定義自己的功能模塊(3) 值得注意的是:在 Vue 2.6.0 中,為具名插槽和作用域插槽引入了一個新的統一的語法 (即 v-slot 指令)。它取代了 slot 和 slot-scope 這兩個目前已被廢棄但未被移除且仍在文檔中的 attribute。1.
  • 《前端會客廳》對話winter和尤雨溪,深度探尋Vue3設計思想(上)
    >vue create 01-vue3-clicd 01-vue3-clivue add vue-nextnpm run serve# webpackgit clone https://github.com/vuejs/
  • 不來看看這些 VUE 的生命周期鉤子函數?|原力計劃 - CSDN
    Created該函數在組件創建完成後被立即調用,在這一步,實例已完成以下的配置:數據觀測 (data observer),屬性和方法的運算,watch/event 事件回調。但是還未渲染成HTML模板,組件中的data對象已經存在,可以對data進行操作了,即可以訪問數據,發請求,ref依舊是undefined,掛載階段還沒開始,$el 屬性目前尚不可用。一般我們可以將對數據的初始化和初始化頁面的請求放到裡面,結束loading。
  • 高級前端進階,vue如何實現$nextTick
    本文要弄明白下面兩件事:$nextTick什麼時候執行vue中nextTick與$nextTick區別1.查看源碼中的$nextTick方法Vue.prototype.== 'undefined')如果沒有回調方法,並且當前環境支持Promise,那麼nextTick返回的是一個Promise對象3.查看timerFunc方法if (typeof Promise !
  • vue3 宇宙之 update(看得見的思考)
    更新邏輯著可是核心中的核心,這個搞懂之後,在去給 vue 提 pr 那可就輕鬆多了。好了, 廢話不多說了 先看源碼。什麼時候會觸發 update 的邏輯?我們是在 effect 裡面調用的 render 函數,而當我們調用 render 函數的話,肯定會觸發響應式對象的 get ,這其實是關於 reactivity 的核心邏輯,如何收集依賴和如何觸發依賴的。
  • Vue-router路由系統詳細介紹
    路由原理傳統開發方式 url改變後 立刻發起請求,響應整個頁面,渲染整個頁面SPA 錨點值改變後 不會發起請求,發起ajax請求,局部改變頁面數據頁面不跳轉 用戶體驗更好其是vue的核心插件1:下載 npm i vue-router -S1.5(重要):安裝插件Vue.use(VueRouter);2:在main.js中引入vue-router對象 import
  • 如何在vue項目中使用sass並設置元素樣式
    elementJavaScriptsassCSS3 在創建vue框架項目時,可以使用CSS3定義元素樣式;還可以使用sass動態變量定義元素樣式下面利用實例說明:1、打開HBuilderX開發工具,新建項目,選擇普通項目;然後輸入項目名稱wmk,選擇vue模板,接著點擊創建按鈕
  • Vue.js布局
    動態Vue.js布局組件前言vue.js是漸進增強的視圖庫,可以作為.html頁面部分使用,也可以結合vue-router、vuex、axios用來構建單頁面或多頁面應用。
  • qt5.12下繼承於Qdialog的類調用slot函數編譯錯誤匯總
    1 其他機器上編譯通過,換個機器編譯失敗很多時候,我們發現代碼的語法是正確的,而在這個機器上編譯也是通過的,但是換一臺機器後,我們發現,編譯竟然沒有通過,這個原因是未知的。如果還是一堆堆的錯誤,那麼繼續把報錯的h文件和cpp文件,採用相同的保存方式。經過修改,這個是可以達到解決編譯錯誤的修改的。但是如果代碼本身的格式就是代籤名的,還是出錯的話,我們只能在這個機器上重新新建工程,複製粘貼進行實現了。
  • Vue的異步更新實現原理
    而任務分為兩類:宏任務(macro task)和微任務(micro task)。它們之間的執行規則就是每個宏任務結束後都要將所有微任務清空。常見的宏任務有setTimeout/MessageChannel/postMessage/setImmediate,微任務有MutationObsever/Promise.then。
  • 一張圖教你快速玩轉vue-cli3
    定製自己的webpackvue項目部署思維導圖接下來,我們根據思維導圖,一步步來解釋和實現我們的目標。1.安裝項目插件vue add @vue/cli-plugin-eslint# 或vue add xjFilevue add 的設計意圖是為了安裝和調用 Vue CLI
  • 前端工程化(ES6模塊化和webpack打包css,less,scss,圖片,字體...
    因為當我們訪問默認的 http://localhost:8080/的時候,看到的是一些文件和文件夾,想要查看我們的頁面 還需要點擊文件夾點擊文件才能查看,那麼我們希望默認就能看到一個頁面,而不是看到文件夾或者目錄。
  • Vue 3全新的Web開發構建工具——Vite介紹
    >Vite是在推出Vue 3的時候開發的,目前僅支持Vue 3.x,這意味著與Vue 3不兼容的庫也不能與Vite一起使用。": "^3.0.2"},"devDependencies": {"vite": "^1.0.0-rc.8","@vue/compiler-sfc": "^3.0.2"}