模版编译,Vue的有一大特点。我们在开发中常常会将看似html的代码都写在<template></template>标签中。说看似html代码,是因为在原生html中没有类似与v-if,v-for的一些指令。那么写在<template></template>中的代码片段为什么能被浏览器解析?说到底,还是要归功于Vue的模版编译。

什么是模版编译?

模版编译,就是把用户编写的类html代码将非原生代码和原生代码分离出来,经过一系列的逻辑处理,最终生成render函数的过程,就是Vue的模版编译。那这一些列的罗就处理是什么呢?且看下图:

具体来说就是将一堆模版字符串抽象成AST对象树,然后用AST树生成render函数。三个阶段:

  1. 模板解析阶段:将一堆模板字符串用正则等方式解析成抽象语法树AST
  2. 优化阶段:遍历AST,找出其中的静态节点,并打上标记;
  3. 代码生成阶段:将AST转换成渲染函数;
// 源码位置: /src/complier/index.jsexport const createCompiler = createCompilerCreator(function baseCompile (template: string,options: CompilerOptions
): CompiledResult {// 模板解析阶段:用正则等方式解析 template 模板中的指令、class、style等数据,形成ASTconst ast = parse(template.trim(), options)if (options.optimize !== false) {// 优化阶段:遍历AST,找出其中的静态节点,并打上标记;optimize(ast, options)}// 代码生成阶段:将AST转换成渲染函数;const code = generate(ast, options)return {ast,render: code.render,staticRenderFns: code.staticRenderFns}
})
  • const ast =parse(template.trim(), options):parse 会用正则等方式解析 template 模板中的指令、classstyle等数据,形成AST
  • optimize(ast, options)optimize 的主要作用是标记静态节点,这是 Vue 在编译过程中的一处优化,在进行patch 的过程中, DOM-Diff 算法会直接跳过静态节点,从而减少了比较的过程,优化了 patch 的性能。
  • const code =generate(ast, options): 将 AST 转化成 render函数字符串的过程,得到结果是 render函数 的字符串以及 staticRenderFns 字符串。

 模版编译的流程是什么呢?

我们知道<template></template>编写的类html中包含了真正的html,以及一些标签属性,vue指令等,所以解析的流程总的来说应该是:HTML解析器是主线,先用HTML解析器进行解析整个模板,在解析过程中如果碰到文本内容,那就调用文本解析器来解析文本,如果碰到文本中包含过滤器那就调用过滤器解析器来解析。

// 代码位置:/src/complier/parser/index.js/*** Convert HTML string to AST.*/
export function parse(template, options) {// ...parseHTML(template, {warn,expectHTML: options.expectHTML,isUnaryTag: options.isUnaryTag,canBeLeftOpenTag: options.canBeLeftOpenTag,shouldDecodeNewlines: options.shouldDecodeNewlines,shouldDecodeNewlinesForHref: options.shouldDecodeNewlinesForHref,shouldKeepComment: options.comments,start (tag, attrs, unary) {},end () {},chars (text: string) {},comment (text: string) {}})return root
}

这是vue实现的源码。parse 函数就是解析器的主函数,在parse 函数内调用了parseHTML 函数对模板字符串进行解析,在parseHTML 函数解析模板字符串的过程中,如果遇到文本信息,就会调用文本解析器parseText函数进行文本解析;如果遇到文本中包含过滤器,就会调用过滤器解析器parseFilters函数进行解析。

Vue整体的模版编译流程大致是这样,未完,待续。。。。

Vue源码解析:模版编译之来龙去脉(一)相关推荐

  1. [Vue源码解析] patching算法

    [Vue源码解析] patching算法 pathching算法:通过对比新旧VNode的不同,然后找出需要更新的节点进行更新 操作:1.创建新增节点 2.删除废弃节点 3.修改需要更新的节点 创建节 ...

  2. Vue源码解析(一)

    前言:接触vue已经有一段时间了,前面也写了几篇关于vue全家桶的内容,感兴趣的小伙伴可以去看看,刚接触的时候就想去膜拜一下源码~可每次鼓起勇气去看vue源码的时候,当看到几万行代码的时候就直接望而却 ...

  3. 【vuejs深入三】vue源码解析之二 htmlParse解析器的实现

    写在前面 一个好的架构需要经过血与火的历练,一个好的工程师需要经过无数项目的摧残. 昨天博主分析了一下在vue中,最为基础核心的api,parse函数,它的作用是将vue的模板字符串转换成ast,从而 ...

  4. Vue源码解析(尚硅谷)

    视频地址:Vue源码解析系列课程 一.Vue源码解析之mustache模板引擎 1. 什么是模板引擎 模板引擎是将数据要变为视图最优雅的解决方案 历史上曾经出现的数据变为视图的方法 2. mustac ...

  5. Vue源码解析(笔记)

    github vue源码分析 认识flow flow类型检查 安装flow sudo npm install -g flow-bin 初始化flow flow init 运行flow命令 命令: fl ...

  6. Vue源码解析:虚拟dom比较原理

    通过对 Vue2.0 源码阅读,想写一写自己的理解,能力有限故从尤大佬2016.4.11第一次提交开始读,准备陆续写: 模版字符串转AST语法树 AST语法树转render函数 Vue双向绑定原理 V ...

  7. Vue源码解析之Template转化为AST的实现方法

    什么是AST 在Vue的mount过程中,template会被编译成AST语法树,AST是指抽象语法树(abstract syntax tree或者缩写为AST),或者语法树(syntax tree) ...

  8. Vue源码解析-$mount

    前言 Vue实例是通过mount方法进行挂载的,上一篇说了new Vue这篇分析一下mount挂载方法.mount的定义在Vue源码中有多处,这是因为Vue需要适配不同的平台以及构建方式,本文这里主要 ...

  9. Vue源码解析之数组变异

    力有不逮的对象 众所周知,在 Vue 中,直接修改对象属性的值无法触发响应式.当你直接修改了对象属性的值,你会发现,只有数据改了,但是页面内容并没有改变. 这是什么原因? 原因在于: Vue 的响应式 ...

  10. Vue源码解析之函数入口

    从入口开始看起 写博客就是记录自己撸码的过程和问题,好了~废话就不多说了,直接源码撸起,通过上一篇博客咱们大致知道了Vue源码目录设计,下面我们要一步步找到vue的入口 通过查看package.jso ...

最新文章

  1. SpringBoot使用教程【1】Restful API设计 返回json,xml格式...
  2. 多DHCP服务器的作用域 及备用DHCP服务器(一)
  3. BLOCK层基本概念:bio,request,request_queue
  4. Yii-upload- 用AJAX上传图片
  5. SharePoint 2013 APP 开发示例 (三)使用远程的web资源
  6. SpringBoot使用thymeleaf
  7. 台湾大学林轩田机器学习基石课程学习笔记13 -- Hazard of Overfitting
  8. 二叉树的前、中、后、层序遍历整理(Java版本)
  9. 使用JDK 8流在包装对象的集合和包装对象的集合之间转换
  10. 除了修改WEBCONFIG会导致WEB服务重启外,还有其他的什么操作会导致重启?
  11. 简单的 XML、DTD 文件
  12. 实习转正述职报告PPT模板
  13. 阿里字体图标库iconfont的使用详解
  14. 嵌入式开发——物联网
  15. postgres mysql quora_DesktopReader for Quora
  16. 推荐14个可以展示你代码的网站
  17. 测试电池耗电快的软件,电池快速耗电急救软件
  18. 数据库上机实验一、二
  19. M1芯片下Fabric测试网络环境配置
  20. SG3525频率和占空比参数的选取

热门文章

  1. [LeetCode]动态规划求解博弈问题
  2. 无论你做什么爸爸妈妈都爱你java_各位叔叔阿姨啊,我不管做什么都会被自己的爸爸妈妈教育啊,如果你是? 爱问知识人...
  3. 好用的三维绘图软件CREO的样条曲线绘制
  4. Latex使用命令总结
  5. 我对《无为无不为》的感想
  6. IMO即时通讯软件测试,imo(企业即时通讯)
  7. 网页java挂挖矿_记一次服务器被植入挖矿脚本的解决过程
  8. phy基础知识总结 common register总结
  9. 笨办法学python3在线阅读知乎_Python第三课——笨办法学Python
  10. 怎么在电脑上玩口袋妖怪新世代 口袋妖怪新世代电脑版玩法攻略