示例代码托管在: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 技术揭秘】。