Vue 中模板编译的过程。

编译过程

入口: src/platforms/web/entry-runtime-with-compile.js
如果有render函数,进行render调用,没有render,进行模板转换render函数
调用createCompile函数,接收baseCompile函数

将模板转换为ast语法树,描述代码结构,使用optimize(ast,options)优化抽象语法树,将语法树转换为字符串形式的 js 代码最后会返回createCompileToFunction函数,是整个模板编译的入口函数createCompileToFunction函数执行,首先定义一个cache对象,用来通过闭包缓存执行的结构
返回了compileToFunctions函数,判断是否有缓存的结构,如果有直接返回,进行编译,调用compile函数,编译对象,字符串形式的 js 代码,调用createFunction,将字符串形式转换为函数形式将结果缓存并返回生成的res对象

compile的执行过程
1.compile接收template模板和options选项作为参数
2.定义了合并options和存储编译错误和信息的数组
3.如果options存在,进行options的合并
4.核心:调用baseCompile,将模板编译成render函数,将错误信息放置到之前定义的数组
5.返回compiled对象,compiled就是编译好的对象
最核心就是合并选项,调用baseCompile进行编译,记录错误,返回编译好的对象

baseCompile 是 模板编译的核心函数
1.调用parse函数,将模板字符串转换成 抽象语法树 ast
2.调用optimize优化抽象语法树
3. 利用generate函数将抽象语法树转为 字符串形式的js代码
4. 返回ast,渲染函数render,静态渲染函数staticRenderFns

parse函数执行过程,parse在作用是将模板字符串转换成ast对象
1.解析options中的成员,定义了变量和函数
2.利用parseHTML函数对模板解析,内部具有start,end,chars,comment,是解析开始标签,文本标签,注释标签的时候执行
parseHTML是借鉴了simplehtmlparse.js,内部定义了很多正则,是用来匹配摸板中的内容
parseHTML遍历html,html就是模板字符串,会将处理完的文本截取掉,继续处理剩余部分
内部通过正则匹配处理对应开始标签,结束标签,只是标签,文本内容
生成ast之后,会处理指令相关内容,利用processPre函数,处理v-pre执行,processIf处理v-if指令,处理v-else等
3.返回root变量,存储的就是ast对象

optimize 优化抽象语法树

判断是否传入root:ast对象,没有直接返回
标记所有的静态节点 markStatic函数,
isStatic内部一些处理函数,不是内置逐渐,不是组件,不是v-for下子节点
标记ast对象所有的子节点,递归调用markStatice
处理条件渲染的ast对象
处理所有的静态根节点 markStaticRoots
节点是不是静态的,是不是子节点,是不是文本子节点
遍历所有的子节点,递归调用markStaticeRoots
generate 的执行过程,作用是将ast转换为字符串形式js代码

生成一个CodegenState对象,存储更代码生成相关的属性和方法
如果ast存在,调用genElement生成代码,否则返回_c(div),
genElement处理once,for,if等指令,处理标签的template模板的,是否是slot插槽
如果都不是,处理组件和内置标签
返回一个对象,内部包含render和,staticeRenderFns:存储
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值