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…

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

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

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

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

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. 设计目标设计一个具备治理,监控,服务发现能力的…

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

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

java数据结构期末复习_java数据结构复习02

1.递归问题1.1计算阶乘packageinterview.recursion;importjava.util.Scanner;public classFact {public static voidmain(String[] args) {System.out.println("请输入n的值:");Scanner in newScanner(System.in);int n in.nextInt();int num fact(n);Sys…

java中methods方法_java中Class.getMethod方法

Method Class.getMethod(String name, Class>... parameterTypes)的作用是获得对象所声明的公开方法该方法的第一个参数name是要获得方法的名字,第二个参数parameterTypes是按声明顺序标识该方法形参类型。person.getClass().getMethod("Speak", null)…

centos6 yum快速安装mysql_centos6.10 yum安装mysql 5.6-Go语言中文社区

一、检查系统是否安装其他版本的MYSQL数据#yum list installed | grep mysql#yum -y remove 文件名二、安装及配置# wget http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm# rpm -ivh mysql-community-release-el6-5.noarch.rpm# yum repolist all | grep mysq…

二叉树两节点距离java,求二叉树中两个节点的最远距离

问题定义如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。计算一个二叉树的最大距离有两个情况:情况A: 路径经过左子树的最深节…

php cli 编程,php-cli下编程如何分层架构、面向对象、统一入口文件?

以往写cli下运行的业务或者测试代码,总是新建文件,面向过程编写代码。几次之后,cli目录下好多文件,即便勉强在一个cli测试文件中写了一个类,也是让其中的一个方法自启动,要测试别的方法,总是要修…

php中gd为什么是乱码的,php gd库中文乱码怎么解决?

php gd库中文乱码怎么解决?,中文,乱码,字符,选项,字体php gd库中文乱码怎么解决?易采站长站,站长之家为您整理了php gd库中文乱码怎么解决?的相关内容。解决方法:1、网站整站使用UTF8编码,如果已使用GB2312…

php实现飘窗,JS实现网站图片飘窗效果,JavaScript悬浮广告(附详细代码)

原标题:JS实现网站图片飘窗效果,JavaScript悬浮广告(附详细代码)JS实现网站图片飘窗效果,Java悬浮广告,郑州SEO提供以下代码,仅供参考:飘窗效果-丁光辉博客(www.dingguanghui.com)*{margin:0px;padding:0px…

oracle中orand使用,Postgres兼容Oracle研究——orafce调研

一、背景PostgreSQL是和Oracle最接近的企业数据库,包括数据类型,功能,架构和语法等几个方面。甚至大多数的日常应用的性能也不会输给Oracle。但是Oracle有些函数或者包,默认PostgreSQL是没有的,需要安装orafce包来实现…

labview linux 内核 不匹配,Linux CentOS7(或Ubuntu)中安装NI-VISA后一打开范例Simple Serial.vi就闪退,LabVIEW就崩溃。...

Linux CentOS7(或Ubuntu)中安装NI-VISA后一打开范例Simple Serial.vi就闪退,LabVIEW就崩溃。我安装了LabVIEW pro 2017 for Linux(另外也试了2016版的都是一样的效果),VISA也试了4.1.0、4.4.0、5.1.1、15.0.0、15.5.0、16.0.0、17.0.0版本都试过了&#…

kali linux子远程桌面,适用于kali linux的远程桌面开启方法(从windows xp 远程登录到kali linux )...

为了解决Windows远程桌面访问Ubuntu 12.04 之一 中提到的VNC远程桌面的缺点(见http://www.linuxidc.com/Linux/2012-07/64801.htm),我们采用第二种方法XRDP,该方法支持多用户登录并远程桌面。1、首先参考Windows远程桌面访问Ubuntu 12.04 之安装VNC中提到…

linux装redis环境变量,linux 怎样安装redis

人到中年有点甜获取Redis1、通过官网http://redis.io/获取稳定版源码包下载地址;2、通过wget http://download.redis.io/releases/redis-3.0.2.tar.gz下载 源码包;2编译安装Redis1、解压源码安装包,通过tar -xvf redis-3.0.2.tar.gz解压源码&…

word2016能识别linux换行符,word文章中的换行符如何批量替换为回车符

word文件中有换行符很正常,但是想要将换行符全部替换为回车符,该怎么替换?以下是学习啦小编为您带来的关于word文章中的换行符批量替换为回车符,希望对您有所帮助。word文章中的换行符批量替换为回车符1、在打开的word中,依次点击…

linux禁用防火墙配置,CentOS Linux防火墙配置及关闭

最近在CentOS Linux下安装配置 Oracle 数据库的时候,总显示因为网络端口而导致的EM安装失败,遂打算先关闭一下防火墙。偶然看到防火墙的配置操作说明,感觉不错。执行”setup”命令启动文字模式配置实用程序,在”选择一种工具”中选择”防火墙…