我们先使用 vue 的模板编译库 vue-template-compiler 验证一下输出结果。

const compiler = require('vue-template-compiler')
let str = `<div v-if="msg">999</div>`console.log(compiler.compile(str))

发现包含 ast 和 render 这两个属性。

{ast: {type: 1,tag: 'div',attrsList: [],attrsMap: { 'v-if': 'msg' },rawAttrsMap: {},parent: undefined,children: [ [Object] ],if: 'msg',ifConditions: [ [Object] ],plain: true,static: false,staticRoot: false,ifProcessed: true},render: `with(this){return (msg)?_c('div',[_v("999")]):_e()}`,staticRenderFns: [],errors: [],tips: []
}

render 属性的内容是根据 ast 属性生成的,之前我有文章已经讲解了 ast 是如何生成的,今天主要分析 render 函数的生成过程。

// <div v-if="msg">999</div>
with(this){return (msg)?_c('div',[_v("999")]):_e()}

每个指令的生成过程都不一样,if 指令会使用三元运算符,for 指令会生成一个新的函数,并且会使用一些辅助函数 _c 和 _v 等等。

// <div><span v-for="item in list">6</span></div>
with(this){return _c('div',_l((list),function(item){return _c('span',[_v("6")])}),0)}

开始了解如何生成 render 函数

function generate (ast,options
) {var code = ast ? (ast.tag === 'script' ? 'null' : genElement(ast, options)) : '_c("div")';return {render: ("with(this){return " + code + "}")}
}

我们暂时先了解 genElement 函数,看看如何生成元素的。

function genElement (el, state) {if (el.parent) {el.pre = el.pre || el.parent.pre;}if (el.staticRoot && !el.staticProcessed) {// return genStatic(el, state)} else if (el.once && !el.onceProcessed) {// return genOnce(el, state)} else if (el.for && !el.forProcessed) {// return genFor(el, state)} else if (el.if && !el.ifProcessed) {// return genIf(el, state)} else if (el.tag === 'template' && !el.slotTarget && !state.pre) {// return genChildren(el, state) || 'void 0'} else if (el.tag === 'slot') {// return genSlot(el, state)} else {// component or elementvar code;if (el.component) {// code = genComponent(el.component, el, state);} else {var data;var children = el.inlineTemplate ? null : genChildren(el, state, true);code = "_c('" + (el.tag) + "'" + (data ? ("," + data) : '') + (children ? ("," + children) : '') + ")";}// module transforms//for (var i = 0; i < state.transforms.length; i++) {//  code = state.transforms[i](el, code);//}return code}
}

在生成元素的过程中,会先判断元素上面的各种指令进行分别的处理,指令的生成我们暂时不讨论,我们先看看 genChildren 的处理。

function genChildren (el,state,checkSkip,altGenElement,altGenNode
) {var children = el.children;if (children.length) {var gen = altGenNode || genNode;return ("[" + (children.map(function (c) { return gen(c, state); }).join(',')) + "]")}
}// genNode 函数是根据不同的 type 生成不同的内容
function genNode (node, state) {if (node.type === 1) {// 如果子元素还是元素会递归的处理return genElement(node, state)} else if (node.type === 3 && node.isComment) {// return genComment(node)} else {// 生成文本return genText(node)}
}function genText (text) {return ("_v(" + (text.type === 2? text.expression // no need for () because already wrapped in _s(): JSON.stringify(text.text)) + ")")
}

最后执行我们的代码,验证是否会成功:

template: '<div><span>11</span></div>'
render: "with(this){return _c('div',[_c('span',[_v(11)])])}"

vue中ast生成render相关推荐

  1. 如何利用在vue中echart 生成全国、省、市地图

    生成中国地图比较简单,参照echarts文档就可以实现,可能就是稍微花一点点时间.下面记录通过cdn 引入echart 和npm安装echart来实现地图的方式 1.通过cdn方式 在 public/ ...

  2. Vue中链接生成二维码

    1.安装插件 npm install qrcodejs2 --save 2.导入组件 import QRCode from 'qrcodejs2' 3.页面中添加二维码 <div id=&quo ...

  3. vue中实现生成海报图片html2canvas详细教程

    该插件详细配置文档地址建议谷歌浏览器打开,因为翻译的比较准确 实现效果如图所示 1.安装插件 npm install --save html2canvas 2.将要生成图片的区域用大的元素包裹起来例如 ...

  4. Vue中Html2canvas生成网页局部截图

    Html2canvas文档地址 npm安装Html2canvas npm install --save html2canvas 项目文件引入Html2canvas(在哪使用就引入到哪) import ...

  5. vue render生成html,在vue中如何渲染函数render(详细教程)

    本篇文章主要介绍了vue渲染函数render的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 1.什么是render函数? vue通过 template 来创建你的 ...

  6. 什么是php的ast结构,什么是AST?Vue源码中AST语法树的解析

    这篇文章给大家介绍的内容是关于什么是AST?Vue源码中AST语法树的解析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 什么是AST AST是指抽象语法树(abstract syn ...

  7. vue中的render函数介绍

    render函数是什么 简单的说,在 vue 中我们使用模板HTML语法组建页面的,使用 render 函数我们可以用js语言来构建DOM. 因为vue是虚拟DOM,所以在拿到template模板时也 ...

  8. vue 项目中 自动生成 二维码

    vue 项目中 自动生成 二维码 ​ 最近在写一个vue项目,要求根据卡号可以自动生成一个二维码,并渲染在指定位置,因为第一次做类似业务,小编在网上找了找,发现了很多,具体起来主要用的就两种: QRc ...

  9. Vue中 渲染函数(render)的介绍和应用

    1. render函数的介绍 简单的说,在vue中我们使用模板HTML语法组建页面的,使用render函数我们可以用js语言来构建DOM. 因为vue是虚拟DOM,所以在拿到template模板时也要 ...

最新文章

  1. python实现获取文件列表中每个文件关键字
  2. python:BeautifulSoup 模块使用指南
  3. xshell上vim小键盘无法使用的解决方法
  4. Rumor CodeForces - 893C
  5. c++vector初始化的几种方法
  6. maven构建scala工程并最终运行的所有细节(scala maven helloworld)
  7. 深度学习之卷积神经网络(7)池化层
  8. 小议Python列表和元组中的元素地址连续性
  9. AngularJS中的方法参数的问题
  10. 机器数.原码 反码 补码比较理解
  11. 【redis】redis的bind配置
  12. java数据结构编程问题_Java语言程序设计与数据结构第十一版(基础篇)第一章编程练习题答案...
  13. de4dot 脱壳工具
  14. JavaScript 运算符优先级 - 汇总表
  15. 互联网热点自动获取工具的实现
  16. 工厂模式以及应用简单解释
  17. VINS-Mono 代码解析六、边缘化(2)理论和代码详解
  18. 信息安全技术 代码安全审计规范
  19. 【有利可图网】PS实战系列:用ps做出雨中油画的质感
  20. scrapy爬虫入门

热门文章

  1. Tomcat 又爆出高危漏洞!Tomcat 8.5~10 中招…
  2. 前方高能!IT 程序员、软件工程师值得考的证书原来有这么多! | 原力计划
  3. 从“朕已阅”到“翻牌子”,程序员的仪式感可以有多重?
  4. Google 发布开源库 TFQ,快速建立量子机器学习模型!
  5. 曾惨遭 Google、Tesla 淘汰,辗转 8 个月,他是如何成为一名顶尖的 AI 工程师?...
  6. Electron 遭封杀,Web 开发者在苹果平台上举步维艰!
  7. 阿里披露 AI 完整布局,飞天 AI 平台首次亮相!
  8. 群聊太多?三步教你用 Python 自动监听转发群消息
  9. 手机基带芯片激荡 30 年!
  10. 你为什么不敢重构代码?听高手亲授秘笈!