# vue 编译
# 基本
把模版(template)编译成render函数的过程,这个过程就是编译
vue提供了两个版本
- Runtime+Compile:包含编译代码的,可以把编译放在运行时做
- Runtime only:不包含编译代码的,需要借助打包工具,例如webpack的vue-loader,来把模版编译成render函数
# 入口
todo 1.编译入口函数的位置 2.vue为什么要这样设计
位置: Runtime+Compile版src/platforms/web/entry-runtime-with-compiler.js
总结:
- vue在不同平台上都会有编译过程,只是编译过程依赖的
baseOptions不同 - 利用了函数柯里化实现了baseOptions的参数保留。
- 同理,vue利用函数柯里化把baseCompile函数抽离出来,把真正编译的过程和其它逻辑如对编译的配置处理,缓存处理等分离开来
# parse
作用:就是把template转换成ast树 原理:利用正则表达式
转换ast共有三种类型
- type === 1 普通元素
- type === 2 表达式
- type === 3 纯文本
转换结果和浏览器保持一致 例如:
<p>123<p>456</p></p>
<!-- 转换为 -->
<p>123</p><p>456</p><p></p>
# optimize
todo: 优化的目标/过程
目标:通过优化静态根的方式 ,优化重新渲染过程中对静态节点的处理逻辑
原理:深度遍历ast树,先标记静态节点(static),在标记静态根节点(staticRoot)
# codegen
todo: 编译的目标/编译的整体流程
目标:把ast树转换成代码字符串
原理: 深度遍历ast树根据不同条件生成不同代码