vue3的compile分为四个部分:
compiler-core
compiler-dom // 浏览器
compiler-sfc // 单文件组件
compiler-ssr // 服务端渲染
其中,compiler-core是编译的核心模块,是平台无关的。packages/compiler-core/src/compile.ts文件中导出baseCompile方法,其他三个都是根据不同的平台和使用场景做了适配,传入各自的options扩展了baseCompile方法。
baseCompile
可以看到,baseCompile也遵循parse、transtrom、 codegen的过程。
-
先是一些环境的准备和判断:浏览器中,
prefixIdentifiers应为false,mode为function;cacheHandlers需要开启prefixIdentifiers;function模式不允许有scopeId; -
如果
模板是string类型,调用baseParse将模板转化为ast -
调用
getBaseTransformPreset得到nodeTransforms和directiveTransforms,里边包含了对v-if,v-for,v-on,v-bind,v-model等的处理方法 -
nodeTransforms和directiveTransforms合并用户自定义方法options.nodeTransforms和options.directiveTransforms后,将ast和合并后的参数传给transform方法,对ast进行转换,对不同的结点添加不同的选项参数,供generate使用
-
generate
Vue3 模板编译原理 这篇文章写的比较浅显易懂,结合具体的示例,没有太多复杂的源码。如果不想阅读冗长的源码,可以看一下~
如果想看源码的话,这几篇文章对每个部分做了解读,同时也欢迎留言纠错补充~