知識要點:
概覽
在實例化Vue時,首先經過選項合並和數據初始化,最後進入掛載階段。此階段分為編譯階段和更新階段。編譯階段將template編譯為生成Vnode的render函數,核心是compile過程。更新階段則將生成的虛擬Dom映射至真實Dom。接下來重點解析編譯階段。
編譯原理
了解Vue編譯過程前,先學習編譯原理。編譯器結構通常包含詞法分析、語法分析、語義分析、中間代碼生成、代碼優化和目標代碼生成。這些步驟對Vue的編譯過程至關重要,如頁面渲染、代碼轉換、Vue代碼編譯等。
編譯過程
Vue編譯過程由parse、optimize和generate三個階段組成。parse生成抽象語法樹(ast),optimize進行語法樹優化,generate將語法樹轉化為生成Vnode的代碼。實際操作以解析簡單模板為例,通過ast表示模板字元串,便於後續操作。
編譯入口
編譯入口在$mount函數中,其定義在多個文件中。$mount進行不同處理以適應template的多種寫法。編譯模板的核心方法compileToFunctions在platforms文件夾下的src/compiler/index.js中。
函數科里化
Vue通過函數科里化將代碼復用,將baseCompile和baseOptions分離傳入,實現不同平台或端的代碼封裝。這樣無需更改內部內容,便於平台間代碼適應。
細節解析
baseOptions在platforms/web/compiler/options.js文件中定義,包含平台相關方法和屬性。baseCompile是編譯流程核心實現,compile函數在src/complier/create-compiler.js最內層完成。
創建編譯函數
createCompileToFunctionFn將編譯後的代碼緩存,用於下次使用,同時將代碼字元串轉換為函數形式,生成render函數和靜態渲染函數集合。
總結
本章從整體上介紹了Vue掛載過程和編譯原理,解析了多次回調處理編譯函數的原因。下章將結合源碼深入學習Vue內部編譯過程,了解template如何轉換為生成Vnode的render函數。欲了解更多解析,點擊這里查看。