Vue源码解析:模版编译之来龙去脉(一)
模版编译,Vue的有一大特点。我们在开发中常常会将看似html的代码都写在<template></template>标签中。说看似html代码,是因为在原生html中没有类似与v-if,v-for的一些指令。那么写在<template></template>中的代码片段为什么能被浏览器解析?说到底,还是要归功于Vue的模版编译。
什么是模版编译?
模版编译,就是把用户编写的类html代码将非原生代码和原生代码分离出来,经过一系列的逻辑处理,最终生成render函数的过程,就是Vue的模版编译。那这一些列的罗就处理是什么呢?且看下图:
具体来说就是将一堆模版字符串抽象成AST对象树,然后用AST树生成render函数。三个阶段:
- 模板解析阶段:将一堆模板字符串用正则等方式解析成抽象语法树
AST
; - 优化阶段:遍历
AST
,找出其中的静态节点,并打上标记; - 代码生成阶段:将
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
模板中的指令、class
、style
等数据,形成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源码解析:模版编译之来龙去脉(一)相关推荐
- [Vue源码解析] patching算法
[Vue源码解析] patching算法 pathching算法:通过对比新旧VNode的不同,然后找出需要更新的节点进行更新 操作:1.创建新增节点 2.删除废弃节点 3.修改需要更新的节点 创建节 ...
- Vue源码解析(一)
前言:接触vue已经有一段时间了,前面也写了几篇关于vue全家桶的内容,感兴趣的小伙伴可以去看看,刚接触的时候就想去膜拜一下源码~可每次鼓起勇气去看vue源码的时候,当看到几万行代码的时候就直接望而却 ...
- 【vuejs深入三】vue源码解析之二 htmlParse解析器的实现
写在前面 一个好的架构需要经过血与火的历练,一个好的工程师需要经过无数项目的摧残. 昨天博主分析了一下在vue中,最为基础核心的api,parse函数,它的作用是将vue的模板字符串转换成ast,从而 ...
- Vue源码解析(尚硅谷)
视频地址:Vue源码解析系列课程 一.Vue源码解析之mustache模板引擎 1. 什么是模板引擎 模板引擎是将数据要变为视图最优雅的解决方案 历史上曾经出现的数据变为视图的方法 2. mustac ...
- Vue源码解析(笔记)
github vue源码分析 认识flow flow类型检查 安装flow sudo npm install -g flow-bin 初始化flow flow init 运行flow命令 命令: fl ...
- Vue源码解析:虚拟dom比较原理
通过对 Vue2.0 源码阅读,想写一写自己的理解,能力有限故从尤大佬2016.4.11第一次提交开始读,准备陆续写: 模版字符串转AST语法树 AST语法树转render函数 Vue双向绑定原理 V ...
- Vue源码解析之Template转化为AST的实现方法
什么是AST 在Vue的mount过程中,template会被编译成AST语法树,AST是指抽象语法树(abstract syntax tree或者缩写为AST),或者语法树(syntax tree) ...
- Vue源码解析-$mount
前言 Vue实例是通过mount方法进行挂载的,上一篇说了new Vue这篇分析一下mount挂载方法.mount的定义在Vue源码中有多处,这是因为Vue需要适配不同的平台以及构建方式,本文这里主要 ...
- Vue源码解析之数组变异
力有不逮的对象 众所周知,在 Vue 中,直接修改对象属性的值无法触发响应式.当你直接修改了对象属性的值,你会发现,只有数据改了,但是页面内容并没有改变. 这是什么原因? 原因在于: Vue 的响应式 ...
- Vue源码解析之函数入口
从入口开始看起 写博客就是记录自己撸码的过程和问题,好了~废话就不多说了,直接源码撸起,通过上一篇博客咱们大致知道了Vue源码目录设计,下面我们要一步步找到vue的入口 通过查看package.jso ...
最新文章
- SpringBoot使用教程【1】Restful API设计 返回json,xml格式...
- 多DHCP服务器的作用域 及备用DHCP服务器(一)
- BLOCK层基本概念:bio,request,request_queue
- Yii-upload- 用AJAX上传图片
- SharePoint 2013 APP 开发示例 (三)使用远程的web资源
- SpringBoot使用thymeleaf
- 台湾大学林轩田机器学习基石课程学习笔记13 -- Hazard of Overfitting
- 二叉树的前、中、后、层序遍历整理(Java版本)
- 使用JDK 8流在包装对象的集合和包装对象的集合之间转换
- 除了修改WEBCONFIG会导致WEB服务重启外,还有其他的什么操作会导致重启?
- 简单的 XML、DTD 文件
- 实习转正述职报告PPT模板
- 阿里字体图标库iconfont的使用详解
- 嵌入式开发——物联网
- postgres mysql quora_DesktopReader for Quora
- 推荐14个可以展示你代码的网站
- 测试电池耗电快的软件,电池快速耗电急救软件
- 数据库上机实验一、二
- M1芯片下Fabric测试网络环境配置
- SG3525频率和占空比参数的选取
热门文章
- [LeetCode]动态规划求解博弈问题
- 无论你做什么爸爸妈妈都爱你java_各位叔叔阿姨啊,我不管做什么都会被自己的爸爸妈妈教育啊,如果你是? 爱问知识人...
- 好用的三维绘图软件CREO的样条曲线绘制
- Latex使用命令总结
- 我对《无为无不为》的感想
- IMO即时通讯软件测试,imo(企业即时通讯)
- 网页java挂挖矿_记一次服务器被植入挖矿脚本的解决过程
- phy基础知识总结 common register总结
- 笨办法学python3在线阅读知乎_Python第三课——笨办法学Python
- 怎么在电脑上玩口袋妖怪新世代 口袋妖怪新世代电脑版玩法攻略