示例代碼託管在:http://www.github.com/dashnowords/blogs前端
博客園地址:《大史住在大前端》原創博文目錄vue
華爲雲社區地址:【你要的前端打怪升級指南】node
compiler
模塊Vue框架中用於模板編譯的,它的做用就是將Vue中的組件模板轉換成render
函數,render
函數在運行時能夠生成虛擬節點vnode
,它是Vue中虛擬DOM樹的基本實現流程。完整版的Vue是包含runtime
和compiler
的,也就是說模板的編譯過程能夠在運行時進行,這無疑是一種性能負擔。Vue官方也提供了獨立的runtime
版本,其中只包含運行時環境,把從template
到render
函數的生成部分放在構建時完成(利用vue-templete-compiler
模塊),以提升運行時的效率。git
因爲跨平臺需求,compiler
模塊的實現過程步驟稍多,不斷地利用高階函數來拆分總體邏輯,不是很容易閱讀,本篇對該模塊的基本流程進行一個梳理,再參考文末彩蛋推薦的電子書,就比較容易看懂了。github
相關入口在實例掛載函數$mount
的實現中:框架
Vue.prototype.$mount = function(){ const options = this.$options //.... const { render, staticRenderFns } = compileToFunctions(template, { shouldDecodeNewlines, shouldDecodeNewlinesForHref, delimiters: options.delimiters, comments: options.comments }, this) options.render = render options.staticRenderFns = staticRenderFns //.... return mount.call(this, el, hydrating) }
能夠看到實例掛載方法$mount
的邏輯就是在調用mount
方法前在實例的$options
添加了額外的信息。此處調用的compileToFunctions
方法經歷的邏輯跳轉了多層高階函數,涉及文件也比較多,直接上圖比較清楚:函數
筆者將涉及函數簡化爲輸入輸出的形式:性能
核心邏輯步驟以下所示:this
梳理完流程,整個編譯流程的宏觀流程也就相對清晰了,這裏爲了兼顧不一樣平臺的方法差別,將有差別的部分提取爲獨立的模塊,而後做爲函數參數注入執行函數,這種經過高階函數來組織代碼的方式能提升核心邏輯的聚合程度,若是是普通的業務邏輯,極可能會是以扁平化串聯調用的形式來編寫方法的,筆者我的認爲兩種模式沒有絕對的優劣對比,雖然高階函數看起來更高級。
分享一本很是詳細的講述Vue核心原理的開源電子書【Vue.js 技術揭祕】。