1,模彼DSL的编译器,一种将语言A翻译成另一种语言B其中语言A通常叫作源代码,在VUE源码编译中通过编译器将源码编译成AST代码,在这过程中通过一种状态机的管理将所有标签及文本编译成JSON对,其中状态机分别有六种状态分别为初始状态,标签开始状态,标签名称状态,文本状态,结束标签状态,结束标签名状态,在一个While循环中每碰到一种状态将其对应的值在字符串中将其删减,然后将对应的装 态存入一个JSON中,例 :
text
会转换成 JSON [{type: 'tag',name: 'p'},{type: 'text',content: 'text'},{type: 'tagEnd',name: 'p'}], 2,构造AST,主要将AST代码编译成树结构,通过一个方法将获取到的JSON做while循环,将栈指针指向一个数组中的最后一个元素,每次碰到tag类型时将其元素名称及类型存下,然后在数组中PUSH当前元素,这样栈指针就能指向当前元素,如果碰到文本节点就在在指针中PUSH元素文本,如果遇到结束tagEnd则弹出最后一个栈,使其指向上一级元素 3,AST的转换与插件化架构,通过一个方法每,碰到一层DOM使递归对象 + 1 并传入参数 然后在循两次 - 打印LOG,之后通过转换法递归循环所有的转换方法,每次到到一个Children循环递归,并传秒当前层级的树指向,这样在递归环境中就能够实现对元素及文本的转换,例如将元素节点p转换成span,将文本切点重复两次,在转换中可以传入一个上下文对象,其保存着当前节点及当前节点在children中的索引,以及parent与转换方法,在转换方法进入时可以将上下文对象与当前节点转入转换方法中,如果方法有返回方法那么将返回的方法在归并中执行,并保持上下文的引入,然后在递与归中中执行AST的转换 4,将模板AST转换为JavaScript AST 其实就是通过方法将 转换后的代码生成VUE3 中的渲染函数,其渲染函数分别有五个 可以将其构建为JSON 第一个JSON 函数名称为render 参数为一个数组,函数体为一个数组对象,每一个对象有一个反回值,第二为函数名称为h这个只有参数没有回反值为带参执行,第三个为创建标签字符串的标记对象,第四个为创建元素列表的标记对象,在将DOM转换成渲染函数时需要将对上的每一个JSON封装成一个方法,然后通过一个转换文本方法text转换成jsNode 其值为字符串标记对象, 再通过一个转换元素方法将元素转换成函数名为h并传入参数为创建标签组使用方法的创建字符串文本,然后将返回值传入参数中 5,代码生成,调用方法生成字符串,当其为render时生成 render (参数){函数体之类的代码},就是对递归循环的运用