# 总结
- 模板编译会生成render 函数
- 执行render 函数会返回vnode
- 基于vnode 执行 patch 和 地方放
const compiler = require('vue-template-compiler')
// 插值
const template = `<p>{{message}}</p>`
const res = compiler.compile(template)
console.log(res.render)
// with(this){return createElement('p',[createTextVNode(toString(message))])}
// h -> vnode
// createElement -> vnode
Vue的模板编译器底层原理是将Vue模板转换为渲染函数,主要包括以下几个步骤:
const baseCompile = (template, options) => {
// 解析 html,转化为 ast
const ast = parse(template.trim(), options)
// 优化 ast,标记静态节点
optimize(ast, options)
// 将 ast 转化为可执行代码
const code = generate(ast, options)
return {
ast,
render: code.render,
staticRenderFns: code.staticRenderFns
}
}
- 解析模板:模板编译器会将模板解析为一个抽象语法树(AST),这个AST可以表示模板中的每一个节点、属性、指令等。
- 优化AST:模板编译器会对AST进行优化,包括静态节点提升、静态属性提升、条件语句优化等,以便减少渲染函数的创建和执行时间。
- 生成渲染函数:模板编译器会根据优化后的AST生成一个渲染函数,这个渲染函数可以接收一个数据对象作为参数,并返回一个VNode节点树。
render函数其实就是一个带有with语法的字符串:
with(this){
return _c('div',{attrs:{"id":"app"}},
[_c('p',{staticClass:"test",staticStyle:{"background":"red"}},
[_v("是"+_s(msg)+_s(msg))]),_v(" "),_c('div',[_v("ss")])])
}
- 生成虚拟dom
有了render函数,调用就可以生成虚拟dom(vnode),生成的时间就是在mount。Vue.prototype.mount。
Vue.prototype.mount。Vue.prototype.mount里面调用了mountComponent。
通过使用模板编译器,Vue可以将模板转换为渲染函数,并通过执行渲染函数生成VNode节点树。这个过程是Vue的核心之一,使Vue可以在浏览器中高效地渲染页面。
← 总结 computed和watch区别 →