这是我参加更文应战的第12天,活动概略查看: 更文应战。

前语

代码生成器是模板编译的毕竟一步,它的作用是将 AST 转化成烘托函数中的内容,这个内容能够称为代码字符串

<div id="el">Hevue.js是做什么的llo {{name}}</div>

上面的模板,毕竟生成的代码字符源码编辑器编程猫下载串相似这函数调用能够出现在表达式中吗样:

`with(telement滑板his){retuelementary schoolrn _c("div", {a源码网站ttrs: {"ielementsd": "el"}}, [_v函数调用语句("Hello " _s(name)函数调用后有必要带回返回值吗)])}`

代码字符串中的 _c 其实是 createElemjsonent 的别号。createElement 是虚拟Djson解析OelementsM中所供应的办法,它的作用是创立虚拟节点,有三个参数,分别是:函数调用能够出现在表达式中吗

  • 标签名
  • 一个包括模板相关element什么意思特征的数据对象
  • 子节点列表

调用 createElement 办法,咱们能够得到一个 VNode

经过AST生成代elements码字符串

生成代码字符串是elementui一个递归源码编辑器的进程,从顶向下依次处理每源码一个 AST 节点。

代码生成器的JSON原理

节点有不同的类型,函数调用时的实参和形参之间传递例如元素节点文本节JSON注释节点。不同element滑板类型节点的生成办法是不elementui相同的。

元素节点

生成元素节源码本钱点,element滑板json格局转化vuejs面试题就是生成一个eelement什么意思lement滑板 _c的函数调用字符串

function genElement(el, state){
constvuejs视频教程 data = el.plain ? undefined : genData(el, state);
con函数调用st children = genChildren(vue.js框架el, state);
codjson解析e = `_elements翻译c('${el.tag}'${
data ? `, ${dajsonp跨域原理ta}` : ''
}${
chil函数调用中的参数太少dren ? `,${children}`:''
})`
re源码本钱turn code;
}

文本节点

生成文本函数调用能够作为一个函数的形参节点很简单,咱们只需求json格局把文本放在 _v这个函数的参数中即可

function genText(text){
return `_v(${text.type === 2 ? text.expression : JSON.stringifyJSON(text.text)})`
}

为什么text需求运用JSON.stringify办法?

由于JSON.stringify能够给文本包装一层字符elementanimation串,例如:

JSON.st函数调用中的参数太少ringify('Hello') // "'Hello'"

注释节点

function genComment(coelementuimment){
retur源码交易网站源码n `_e(${JSON.strin源码本钱gify(comment.text)})`
}

总结

本文,咱们学习了代码生成器的作用及其内部原理,了解了代码生成器其实就是字符串elemen函数调用的一般格局t是什么牌子拼接的进程。经过递归 AST 来生成字符json格局转化串,最早生成根节点,然后在子节点字符串生成后,将其拼接在根节点的参数中,子节点的子节点拼接在子节点的参数中,这样一层一层地拼接json是什么意思,直到vuejs中文官网毕竟拼接成无缺的字符串。