前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【每日一题】【vue2源码学习】VUE中模版编译原理

【每日一题】【vue2源码学习】VUE中模版编译原理

作者头像
xing.org1^
发布2020-09-29 10:07:40
4640
发布2020-09-29 10:07:40
举报
文章被收录于专栏:前端说吧

模版指的就是template属性。vue内部会将template字符串转化成render函数进行渲染。render函数返回虚拟节点,再将虚拟节点转化成真实DOM。(模版=>方法=>节点)

而编译过程就是template转换render函数的过程。

如何将template转换成render函数?

  1. 通过正则匹配字符串,将template模版转换成AST语法树 - parserHTML
  2. 对静态语法做静态标记 - markUP
  3. 重新生成代码 - codeGen

⚠️注意:开发时尽量不要使用template

因为将template转化成render方法需要在运行时进行编译操作,会有性能损耗。同时引用带有compiler包的vue体积也会变大。默认.vue文件中的template处理是通过vue-loader来进行处理的,并不是通过运行时的编译。(默认vue项目中引入的vue.js是不带有compiler模块的。)

vue-template-compiler包

vue-loader的作用就是可以把一个模版变成一个对象。内部用到一个NPM包:《vue-template-compiler》 (插槽、指令等也是用的这个包来处理的,可以自己安装包看下)

包内VueTemplateCompiler.compile就是用来将模版转化成AST语法树的。

代码语言:javascript
复制
let {ast, render, staticRenderFns} = VueTemplateCompiler.compile('<div>gjf</div>')

该方法返回结果是一个对象:

代码语言:javascript
复制
{
  ast: ast,
  render: code.render, // 将ast语法树格式化成with函数
  staticRenderFns: code.staticRenderFns
}

其中ast就是一颗由对象描述的AST语法树(见下图),该树用来描述template结构。

AST语法树:
image
image

image

render字符串:

由ast生成如下字符串

代码语言:javascript
复制
with(this){return _c('div',[_v("gjf")])} // _c是创建元素、_v是虚拟节点

最后,new Function + with语句后生成render方法。render方法执行完毕后生成的是虚拟dom。

模版引擎的实现原理:

new Function + with语句

流程:

template => ast => codegen得到上述字符串 => new Function(render) + with语句生成真正的render方法来执行

总结:

模版引擎的实现原理就是new Function + with语句来进行实现的。

原理mock:

模版编译原理

源码位置:

github:src/compiler/index.js:8

代码语言:javascript
复制
// `createCompilerCreator` allows creating compilers that use alternative
// parser/optimizer/codegen, e.g the SSR optimizing compiler.
// Here we just export a default compiler using the default parts.
var createCompiler = createCompilerCreator(function baseCompile (
  template,
  options
) {
  var ast = parse(template.trim(), options); // 将代码解析成ast语法树
  if (options.optimize !== false) {
    optimize(ast, options); // 优化代码,标记静态节点。核心就是标记树
  }
  var code = generate(ast, options); // 生成代码
  return {
    ast: ast,
    render: code.render, // 将ast语法树格式化成with函数
    staticRenderFns: code.staticRenderFns
  }
});
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何将template转换成render函数?
  • ⚠️注意:开发时尽量不要使用template
  • vue-template-compiler包
    • AST语法树:
      • render字符串:
      • 模版引擎的实现原理:
      • 流程:
      • 总结:
      • 原理mock:
      • 源码位置:
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档