Vue.js 运行机制全局概览

全局概览

这一节笔者将为大家介绍一下 Vue.js 内部的整个流程,希望能让大家对全局有一个整体的印象,然后我们再来逐个模块进行讲解。从来没有了解过 Vue.js 实现的同学可能会对一些内容感到疑惑,这是很正常的,这一节的目的主要是为了让大家对整个流程有一个大概的认识,算是一个概览预备的过程,当把整本小册认真读完以后,再来阅读这一节,相信会有收获的。

首先我们来看一下笔者画的内部流程图。

大家第一次看到这个图一定是一头雾水的,没有关系,我们来逐个讲一下这些模块的作用以及调用关系。相信讲完之后大家对Vue.js内部运行机制会有一个大概的认识。

初始化及挂载

在 new Vue() 之后。 Vue 会调用 _init 函数进行初始化,也就是这里的 init 过程,它会初始化生命周期、事件、 props、 methods、 data、 computed 与 watch 等。其中最重要的是通过 Object.defineProperty 设置 setter 与 getter 函数,用来实现「响应式」以及「依赖收集」,后面会详细讲到,这里只要有一个印象即可。

初始化之后调用 $mount 会挂载组件,如果是运行时编译,即不存在 render function 但是存在 template 的情况,需要进行「编译」步骤。

编译

compile编译可以分成 parse、optimize 与 generate 三个阶段,最终需要得到 render function。

parse

parse 会用正则等方式解析 template 模板中的指令、class、style等数据,形成AST。

optimize

optimize 的主要作用是标记 static 静态节点,这是 Vue 在编译过程中的一处优化,后面当 update 更新界面时,会有一个 patch 的过程, diff 算法会直接跳过静态节点,从而减少了比较的过程,优化了 patch 的性能。

generate

generate 是将 AST 转化成 render function 字符串的过程,得到结果是 render 的字符串以及 staticRenderFns 字符串。

在经历过 parse、optimize 与 generate 这三个阶段以后,组件中就会存在渲染 VNode 所需的 render function 了。

响应式

接下来也就是 Vue.js 响应式核心部分。

这里的 getter 跟 setter 已经在之前介绍过了,在 init 的时候通过 Object.defineProperty 进行了绑定,它使得当被设置的对象被读取的时候会执行 getter 函数,而在当被赋值的时候会执行 setter 函数。

当 render function 被渲染的时候,因为会读取所需对象的值,所以会触发 getter 函数进行「依赖收集」,「依赖收集」的目的是将观察者 Watcher 对象存放到当前闭包中的订阅者 Dep 的 subs 中。形成如下所示的这样一个关系。

在修改对象的值的时候,会触发对应的 setter, setter 通知之前「依赖收集」得到的 Dep 中的每一个 Watcher,告诉它们自己的值改变了,需要重新渲染视图。这时候这些 Watcher 就会开始调用 update 来更新视图,当然这中间还有一个 patch 的过程以及使用队列来异步更新的策略,这个我们后面再讲。

Virtual DOM

我们知道,render function 会被转化成 VNode 节点。Virtual DOM 其实就是一棵以 JavaScript 对象( VNode 节点)作为基础的树,用对象属性来描述节点,实际上它只是一层对真实 DOM 的抽象。最终可以通过一系列操作使这棵树映射到真实环境上。由于 Virtual DOM 是以 JavaScript 对象为基础而不依赖真实平台环境,所以使它具有了跨平台的能力,比如说浏览器平台、Weex、Node 等。

比如说下面这样一个例子:

{ tag: ‘div’, /说明这是一个div标签/ children: [ /存放该标签的子节点/ { tag: ‘a’, /说明这是一个a标签/ text: ‘click me’ /标签的内容/ } ] }

渲染后可以得到

click me

这只是一个简单的例子,实际上的节点有更多的属性来标志节点,比如 isStatic (代表是否为静态节点)、 isComment (代表是否为注释节点)等。

更新视图

前面我们说到,在修改一个对象值的时候,会通过 setter -> Watcher -> update 的流程来修改对应的视图,那么最终是如何更新视图的呢?

当数据变化后,执行 render function 就可以得到一个新的 VNode 节点,我们如果想要得到新的视图,最简单粗暴的方法就是直接解析这个新的 VNode 节点,然后用 innerHTML 直接全部渲染到真实 DOM 中。但是其实我们只对其中的一小块内容进行了修改,这样做似乎有些「浪费」。

那么我们为什么不能只修改那些「改变了的地方」呢?这个时候就要介绍我们的「patch」了。我们会将新的 VNode 与旧的 VNode 一起传入 patch 进行比较,经过 diff 算法得出它们的「差异」。最后我们只需要将这些「差异」的对应 DOM 进行修改即可。
关于vue的更多、更详细源码解析,可识别以下小程序进行查看哈!

Vue.js 运行原理解析、vue源码剖析相关推荐

  1. JAVA毕业设计vue.js开发红酒网站计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计vue.js开发红酒网站计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计vue.js开发红酒网站计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构:B ...

  2. 用vue.js实现的网页计算器源码

    大家好,今天给大家介绍一款,用vue.js实现的网页计算器源码(图1).送给大家哦,获取方式在本文末尾. 图1 可以切换为科学计算器(图2) 图2 部分代码: <!DOCTYPE html> ...

  3. 【Unity】 Spine渲染原理解析与源码解读

    Spine渲染原理解析与源码解读 安装环境 从Spine编辑器导出 将资源导入Unity 基础概念 其他相关概念 Spine架构 Spine运行时的各个模块 有状态(Stateful) 和 无状态(S ...

  4. SpringKafka原理解析及源码学习-Spring生态(一)

    Kafka 作为老牌消息中间件, 高吞吐是它的拿手好戏. Spring 的生态中也有官方提供的 spring-kafka.jar. 本文主要学习 Spring 官方提供的 spring-kafka.j ...

  5. JS魔法堂:mmDeferred源码剖析

    一.前言 avalon.js的影响力愈发强劲,而作为子模块之一的mmDeferred必然成为异步调用模式学习之旅的又一站呢!本文将记录我对mmDeferred的认识,若有纰漏请各位指正,谢谢.项目请见 ...

  6. laravel $request 多维数组取值_Laravel 运行原理分析与源码分析,底层看这篇足矣

    精选文章内容 一.运行原理概述 laravel的入口文件 index.php 1.引入自动加载 autoload.php 2.创建应用实例,并同时完成了: 基本绑定($this.容器类Containe ...

  7. Android悬浮窗原理解析(Window)[源码]

    悬浮窗,在大多数应用中还是很少见的,目前我们接触到的悬浮窗,差不多都是一些系统级的应用软件,例如:360安全卫士,腾讯手机管家等:在某些服务行业如金融,餐饮等,也会在应用中添加悬浮窗,例如:美团的偷红 ...

  8. 含文档+PPT+源码等]精品基于ssm的足球联赛管理系统的设计与实现vue[包运行成功]计算机项目源码Java项目毕设

  9. cvMorphology形态学原理解析及源码分析

    ⑴ 图像形态学处理的概念...1 ⑵ 二值图像的逻辑运算...3 ⑶ 膨胀和腐蚀...4 (4) 高级形态学变换...8 (5) 细化...10 ⑴ 图像形态学处理的概念 数字图像处理中的形态学处理是 ...

最新文章

  1. Linux下tcpdump用法
  2. 用技嘉Windows Image Tool给原版WIN7镜像注入USB3.0驱动
  3. iis占用服务器内存,W3wp.exe 进程占用内存高消耗CPU近100%导致网站反应速度缓慢的解决方案...
  4. 机器学习和图像资源整理
  5. python os.path.exists()(用于判断文件夹路径是否存在)
  6. GCD介绍(一): 基本概念和Dispatch Queue (转载)
  7. “薅羊毛”漏洞分析 | 我是如何到处“混吃混喝”的
  8. 本地缓存需要高时效性怎么办_详解微信小程序缓存--缓存时效性
  9. 动态规划经典算法--最大子段和
  10. 网站布局中遇到的一些问题
  11. oracle unused 语法_Oracle教程之设置为unused 后如何恢复 ?
  12. Python 数据分析实战:经典的同期群分析
  13. paip.中文 分词 ---paoding 3.1 的使用
  14. java 正则表达式 例子_Java正则表达式例子汇总
  15. matlab打开jpg文件怎么打开,Matlab读取图片、显示和保存图像的详细教程
  16. windows+Texstudio+languagetool修改语法错误
  17. IAR分析内存重要的神器 - map文件全解析
  18. 增长率超 100%!东软数据可视化到底什么样?
  19. POJ1008 玛雅历
  20. 虚拟机Win 7中重新 划分 分区 合并 磁盘

热门文章

  1. fiddler 抓包详细教程
  2. 大神f1修改服务器的密码,大神F1 Plus锁屏密码怎么设置 大神F1 Plus锁屏密码设置教程...
  3. 国泰君安实习笔试面试情况
  4. 小说网站毕业设计,小说阅读网站毕业设计,毕设设计论文需求分析源码作品
  5. 食品行业数字化解决方案
  6. 美术课上用计算机玩游戏,小学美术四年级第十七课电脑美术教案
  7. 创成汇创业赛事平台|效果怎么样?
  8. yocto 工程目录结构及大概含义
  9. zip或.rar下载后怎么转成apk格式
  10. Kali系统MSF模块暴力破解MySQL弱口令漏洞