作用: 将vue模板通过一系列过程处理,变成可以生成返回vnode的渲染函数。从而通过vnode渲染页面
大体可以分为三部分:
AST: 其实就是用js中的对象表示一个个的节点,一个对象代表一个节点。
解析器内部有很多子解析器,比如html解析器、文本解析器、过滤器解析器。最主要的是html解析器
html解析器在遍历模板字符串的过程中,会不断触发钩子函数。html节点类型分为:元素节点、文本节点、注释节点
// 模板字符串
var template = `<div class="pack">
<!-- 我是注释 -->
<h2>这是标题</h2>
<p>我是段落内容</p>
</div>`
// parseHtml没解析出一个一块内容,就会从模板字符串中去掉该部分
parseHtml (template, {
start(tag, attrs, unary) {
// 当解析到开始标签位置时触发
},
end (){
// 当解析到结束标签位置时触发
},
chars (){
// 当解析到文本节点时触发
},
comment (){
// 当解析到注释节点时触发
}
})
怎样表示节点之间的层级关系:栈。每当解析出一个开始标签,触发狗子start钩子函数的同时,将这个标签推入栈中,作为后面解析出来的标签对象的父节点对象;每当解析出一个结束标签时,就将栈中最右边的标签对象弹出来;始终以栈中最右边的标签作为下面解析出来的额标签的父节点对象
补充:栈还可以用来检测html标签是否正确闭合。当当前解析出的结束标签和栈中最右边的标签不一致,则在控制台打印警告提示