Vue源码之compile入口

834 阅读1分钟

入口

在src/platforms/web/entry-runtime-withcompiler执行$mount时,有这么一段逻辑

关于编译的⼊⼝就是在这里,compileToFunctions⽅法就是把模板template编译⽣成render以及staticRenderFns ,它的定义在 src/platforms/web/compiler/index.js

compileToFunctions

compileToFunctions⽅法实际上是 createCompiler ⽅法的返回值,该⽅法接收⼀个编译配置参数baseOptions

createCompiler

createCompiler ⽅法实际上是通过调⽤createCompilerCreator⽅法返回的,该⽅法传⼊的参数是⼀个函数,真正的编译过程都在这个 baseCompile 函数⾥执⾏。

createCompilerCreator

该⽅法返回了⼀个 createCompiler 的函数,它接收⼀个 baseOptions 的参数,返回的是⼀个对象,包括 compile ⽅法属性和 compileToFunctions 属性,这个 compileToFunctions对应的就是 $mount 函数调⽤的 compileToFunctions ⽅法,它是调⽤createCompileToFunctionFn ⽅法的返回值。

createCompileToFunctionFn

⾄此我们总算找到了 compileToFunctions 的最终定义,它接收 3 个参数、编译模板 template ,编译配置 options 和 Vue 实例 vm 。核⼼的编译过程就⼀⾏代码const compiled = compile(template, options)

compile

compile 函数在执⾏ createCompileToFunctionFn 的时候作为参数传⼊,它是 createCompiler函数中定义的 compile 函数,compile 函数执⾏的逻辑是先处理配置参数,真正执⾏编译过程就⼀⾏代码const compiled = baseCompile(template.trim(), finalOptions)

baseCompile

baseCompile 在执⾏ createCompilerCreator ⽅法时作为参数传⼊,所以编译的⼊⼝我们终于找到了,它主要就是执⾏了上面三个逻辑。

总结

编译⼊⼝逻辑之所以这么绕,是因为 Vue.js 在不同的平台下都会有编译的过程,因此编译过程中的依赖的配置 baseOptions 会有所不同。⽽编译过程会多次执⾏,但这同⼀个平台下每⼀次的编译过程配置⼜是相同的,为了不让这些配置在每次编译过程都通过参数传⼊,Vue.js 利⽤了函数柯⾥化的技巧很好的实现了 baseOptions 的参数保留。同样,Vue.js 也是利⽤函数柯⾥化技巧把基础的编译过程函数抽出来,通过 createCompilerCreator(baseCompile) 的⽅式把真正编译的过程和其它逻辑如对编译配置处理。