前言
render函数可以作为一道分割线,render函数的左边可以称之为编译期,将Vue的模板转换为渲染函数。render函数的右边是Vue的运行时,主要是基于渲染函数生成Virtual DOM树,Diff和Patch。
render渲染函数将结合数据生成Virtual DOM
有了虚拟的DOM树后,再交给Patch函数,负责把这些虚拟DOM真正施加到真实的DOM上。在这个过程中,Vue有自身的响应式系统来侦测在渲染过程中所依赖到的数据来源。在渲染过程中,侦测到数据来源之后就可以精确感知数据源的变动。
根据需要重新进行渲染。当重新进行渲染之后,会生成一个新的树,将新的树与旧的树进行diff对比,就可以最终落实到真实DOM上的改动。
一个简单的实例:

vue的渲染机制可以总结如下:

render前置操作
- 为何要用with(this){}包裹?
- 何时将render函数的字符串转成函数?
1. 为何要用with(this){}包裹
with通常被当做重复引用同一个对象中的多个属性的快捷方式,可以不需要重复引用对象本身。引自《你不知道的JavaScript》上2.2.2节with
2. 何时将render函数的字符串转成函数(vue2.6.11)
经过parse生成AST和optimize对AST树的优化,会生成render函数的字符串。在createCompilerCreator(在src\compiler\create-compiler.js)中,调用createCompileToFunctionFn将字符串转成函数。
1 | // src\compiler\index.js |
1 | // src\compiler\create-compiler.js |
createCompileToFunctionFn(在src\compiler\to-function.js)中,会优先读缓存信息,若没有才会执行编译方法,同时将render字符串通过createFunction调用New Function()的方法,创造render函数,然后缓存信息。
1 | /* @flow */ |
参考: