vue 数值 拼接字符串_【Vue原理】Compile - 白话版

d8ca2047f3563227ccc71ebe6a7d90ca.png
写文章不容易,点个赞呗兄弟 专注 Vue 源码分享,文章分为白话版和 源码版,白话版助于理解工作原理,源码版助于了解内部详情,让我们一起学习吧 研究基于 Vue版本 【2.5.17】

如果你觉得排版难看,请点击 下面链接 或者 拉到 下面关注公众号也可以吧

【Vue原理】Compile - 白话版

终于到了要讲 compile 白话的时候了,大家准备好了吗,白话版肯定不会很复杂啦,源码版就不一定了。。。

源码版我写了9篇啊!每篇的篇幅都很长啊!!我都快写奔溃了啊!!

都快坚持不下来了,我算了算, compile 的源码版,我好像快写了一个多月???

卧槽,竟然写了这么久.....

7f73a795ea2dbc56818595dd9c1b2c84.png

好吧,现在开始我们的正文


Compile

compile 的内容非常多,大致分为三块主要内容,我也称他们是Vue的 渲染三巨头

就是 parse,optimize,generate

虽然分为三块,但是要明确一点

compile 的作用是解析模板,生成渲染模板的 render

比如这样的模板

0385e84893fd24b7bdad4fcafba315e2.png

经过 compile 之后,就会生成下面的 render

_c('div', [_c('span'), _v(num)])

而 render 的作用,也是为了生成跟模板节点一一对应的 Vnode

{    tag: "div",    children:[{        tag: "span",        text: undefined},{        tag: undefinedtext: "111"}]
}

下面我们就来一个个看渲染三巨头


Parse

这是 compile 的第一个步骤

作用是

接收 template 原始模板,按照模板的节点 和数据 生成对应的 ast

比如这样

de8b60e4095f635daaaedb681197cf5e.png

生成的 ast 是这样,所有模板中出现的数据,你都可以在 ast 中找到

{    tag: "div",    attrsMap: {test: "2"},    children:[{        tag: "span",        children: [],        attrsMap: {name: "1"}}]
}

ast 是什么?个人简单理解的话

以数据的形式去描述一个东西的所有的特征吧,说错别打我

比如说ast 描述我

{    name: "神仙朱",    sex: 1,desc: "一个靓仔"}

具体可以查一下,相关内容挺多的

另外,这里不会讲细节,parse 是怎么生成 ast 的,因为涉及很多源码,放在源码版了


Optimize

这是 compile 的第二步

作用是

遍历递归每一个ast节点,标记静态的节点(没有绑定任何动态数据),

这样就知道那部分不会变化,于是在页面需要更新时,减少去比对这部分DOM

从而达到性能优化的目的

比如这个模板

f0bdde25dd428a5705a945304bb41e11.png

span 和 b 就是静态节点,在 optimize 处理中,就会给他们添加 static 判断是否是静态节点

{    static: false,    staticRoot: false,    tag: "div",    children: [{        staticRoot: true,        tag: "span",        children: [{            static: true,            tag: "b"}]},{        static: false,        text: "{{a}}"}]
}

而你也看到一个属性,staticRoot,这个是表示这个节点是否是静态根节点的意思

用来标记 某部分静态节点 最大的祖宗节点,后面更新的时候,只要碰到这个属性,就知道他的所有子孙节点都是静态节点了,而不需要每个子孙节点都要判断一次浪费时间

具体是怎么做的,感兴趣的话欢迎看以后的源码版


Generate

这是 compile 的第三步

作用是

把前两步生成完善的 ast 组装成 render 字符串(这个 render 变成函数后是可执行的函数,不过现在是字符串的形态,后面会转成函数)

看个例子

914eb1a1aac5b5d9ebe13f5736948d5b.png

经过前两步变成 ast

{    static: false,    staticRoot: false,    tag: "div",    children: [{        static: false,        staticRoot: false,        tag: "span",        children: [{            static: false,            text: "{{b}}"}]},{        static: false,        text: "{{a}}"}]
}

然后,generate 接收 ast,先处理最外层 ast,然后开始递归遍历子节点,直到所有节点被处理完

这个过程中,字符串会被一点一点拼接完成,比如上面的 ast 拼接结果就是下面这样

_c 是生成节点对应的 Vnode 的一个函数

`
_c('div', [_c('span', [_v(b)]),_v(a)
])
`

简单说一下拼接流程

1、一开始接收到 ast,处理最外层 ast 这个点,是 div,于是拼接得到字符串

code  = ` _c('div', [  `

2、遍历 div 子节点,遇到 span,拼接在 div 的子节点数组中

code = `_c('div', [  _c('span', [ `

3、开始处理 span 的子节点 b,放进 span 的 子节点数组中

code = ` _c('div', [  _c('span', [  _v(b)  `

4、span 子节点处理完,闭合 span 的 子节点数组

code = ` _c('div', [  _c('span', [  _v(b) ] `

5、继续处理 span 同级 的子节点,是个文本节点,但是是动态值,变量是 a

code = `_c('div', [  _c('span', [  _v(b) ] , _v(a)  `

6、所有子节点都处理完毕,闭合 div 的 子节点数组

code = ` _c('div', [  _c('span', [  _v(b) ] , _v(a) )]  `

render转成函数

前面两步把 template 解析生成了 render 字符串,但是需要执行的话,还是需要转换成函数的

怎么转呢?就是下面这样

render = new Function(render)

然后 render 保存在实例上,具体位置是

605fe8451012f17b6729d01b6ee11b05.png

vm.$options.render

至此,compile 所有的功能就完成了

而关于 render 的内容,比如说 render 中出现的各种函数是什么,会专门放在 render 的文章去记录

316ee5f0bbd3f734a3b6de1c0d9bbbc5.png

17af1e4cd501e46a70f51920446c7633.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gpio驱动蜂鸣器出现破音_五款蜂鸣器驱动电路原理图

蜂鸣器驱动电路图一:典型的蜂鸣器驱动电路,蜂鸣器驱动电路一般包含:一个三极管、一个蜂鸣器、一个续流二极管、一个滤波电容。1、蜂鸣器:发声元件,在其两端施加直流电压(有源蜂鸣器)或者方波(无源蜂鸣器)就可以发声&am…

php和mysql的实践报告_PHP+MySQL项目开发与实践

前言部分基础篇任务一PHP基础知识简介1.1静态网页与动态网页的工作原理1.1.1静态网页与工作原理1.1.2动态网页与工作原理1.2初识PHP1.3习题任务二PHP程序的运行环境搭建2.1配置Apache服务器2.1.1安装Apache服务器2.1.2Apache服务器安装过程中的问题及解决方案2.1.3Apache主目录…

mediumint 在mysql 中是什么类型_mysql中bigint、int、mediumint、smallint 和 tinyint的取值范围...

mysql数据库设计,其中,对于数据性能优化,字段类型考虑很重要,搜集了些资料,整理分享出来,这篇为有关mysql整型bigint、int、mediumint、smallint 和 tinyint的语法介绍,如下:1、bigi…

mysql备份还原数据库操作系统_mysql 命令行备份还原数据库操作

一 备份操作1.备份全部数据库mysqldump -uroot -p --all databases > aa.sql2.备份某个数据库并压缩mysqldump -uroot -p databasename |gzip > aa.sql.gz3 .备份单个表mysqldump -uroot -p -table dbname tbname1 tbname2 >aa.sql4.同时备份多个数据库mysqldump -ur…

python表示当前对象_对象操作

[TOC]# 对象操作## help:返回对象的帮助信息~~~>>> help(str)Help on class str in module builtins:class str(object)| str(object) -> str| str(bytes_or_buffer[, encoding[, errors]]) -> str|| Create a new string object from the given object. If enc…

中国大学慕课python答案第七章_中国大学慕课mooc用Python玩转数据章节答案

嵌体来源A.嵌入牙冠内的修复体 B.没有覆盖前牙唇面或后牙颊面的部分冠修复体艺术不是象牙塔里的_____ ,所谓的“为艺术而艺术”,说到底不过是唯美主义_____的志向。自古以来,艺小轿车的速度比卡车的速度每小时快6千米,小轿车和卡车…

mysql 多项式_mysql主从复制原理及实现

一.主从复制原理利用MySQL提供的Replication,其实就是Slave从Master获取Binary log文件,然后再本地镜像的执行日志中记录的操作。由于主从复制的过程是异步的,因此Slave和Master之间的数据有可能存在延迟的现象,此时只能保证数据最…

python迭代器是什么百度百科,python迭代器的接口是什么?

What are the required methods for defining an iterator? For instance, on the following Infinity iterator, are its methods sufficient? Are there other standard or de factor standard methods that define an iterator?class Infinity(object):def __init__(self…

python逻辑表达式3+45and_python入门到精通(一)| python基础语法与各种运算符的使用...

一、python中的基础语法1、输入语句 input格式:变量input(“输入提示信息”)功能:从键盘上输入一行文本信息到变量中,可以强转为各种数据类型。案例: xinput(“您的个人基本信息”)注意点:只能接受一行信息2 input语句…

java中文分词算法_Java实现逆向最大匹配中文分词算法

写道//Java实现逆向最大匹配中文分词算法public class SplitChineseCharacter {public static void main(String[] args) {String input "太好了,今天是星期六啊"; // 要匹配的字符串new Split(input).start();}}class Split {private String[] dictiona…

途牛java面试题_途牛java面试题.docx

途牛java面试题途牛java面试题  QUESTION NO: 1   publicclass Test1 {   publicstaticvoid changeStr(String str){   str"welcome";   }   publicstaticvoid main(String args) {   String str"1234";   changeStr(str);   (str);   …

java httpclient 异步请求_java_java实现HttpClient异步请求资源的方法,本文实例讲述了java实现HttpClien - phpStudy...

java实现HttpClient异步请求资源的方法本文实例讲述了java实现HttpClient异步请求资源的方法。分享给大家供大家参考。具体实现方法如下:package demo;import java.util.concurrent.CountDownLatch;import org.apache.http.HttpResponse;import org.apache.http.cli…

idea创建web项目运行报404错误_使用IDEA新建Web工程启动报404的错误

新换了一个项目组被人吐槽配置文件都能写错,所以打算从头开始一步步搭建一个项目,包含ssm基础框架、mongodb工具类、redis工具类、jsf配置、log配置等今天先来搭建一个web工程。工程搭建好运行时发现404我们都知道,一般404都是由于请求资源的…

java高效写文件_java如何高效读写10G以上大文件

有一份10G以上大文本文件,需要替换里面的一些文本信息(每一行都有),如何高效读并替换掉生成新的文件先分割成多个文件多个线程操作多个文件,避免两个线程操作同一个文件按行读文件并按行写入新的文件合并所有文件1,4用linux命令就可以了&…

java md2_GitHub - edzjx/Md2Crypto

此项目来源一个字谜解体过程一个程序猿在自己的微信公众号里出了一个字谜。其中用到了MD2加密算法,这是各很古老的加密算法。从网上搜到作者92年发布的C代码还能正常执行。此项目介绍解题过程,和使用C,C#,Java,Python3来测试代码。文章结构破…

java stringbuffer原理_深入理解Java:String

在讲解String之前,我们先了解一下Java的内存结构。一、Java内存模型按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。JVM主要管理两种类型内存:堆和非堆,堆…

java dubbo jsf_cubelink

cubelink概要设计[TOC]1. 撰写记录更新时间内容作者2017-08-23 08:39:31撰写参数回调章节内容林斌2017-08-22 21:26:52增加了异步响应和异步回调章节林斌2017-08-22 14:36:36确定文档结构和大致框架林斌2. 设计目标设计一个具备治理,监控,服务发现能力的…

用java输出图形_java基础-输出一个简单的图形。

最近写了几行代码输出下面的图形。不多说了,代码如下。 * *** ***** public class javaDemoOne {/** * @brief 主函数 * @author wks * @param args */ public static void main(String[] args) {// TODO Auto-generated method stub inputGraPh(); System.out.print("\n…

python 的案例实战_python案例实战之一

分析思路:1、明确分析目标;2、导入库、导入数据;3、简单查看下数据行列、整体情况;4、数据清洗;5、确定维度和指标;6、分析并作图1、查看整体数据情况1.1引入使用的库import numpy as npimport pandas as p…

django 模板mysql_59 Django基础三件套 , 模板{{}}语言 , 程序连mysql Django项目app Django中ORM的使用...

主要内容:https://www.cnblogs.com/liwenzhou/p/8688919.html1 form表单中提交数据的三要素a : form标签必须要有action和method的属性b : 所有获取用户输入的标签必须放在form表单里,也必须要有那么name属性.因为往后端提交数据的时候name所对应的是关键字, input输入的值为va…