粥里有勺糖

vuePress-theme-reco 粥里有勺糖    2018 - 2023
粥里有勺糖 粥里有勺糖

Choose mode

  • dark
  • auto
  • light
关于我
备战春秋
  • 心得总结
  • 校招考点汇总
  • 面经汇总
  • 复习自查
技术笔记
  • 技术教程
  • 模板工程
  • 源码学习
  • 技术概念
  • 个人作品
  • 学习笔记
计算机基础
  • 算法与数据结构
  • 操作系统
  • 计算机网络
  • 设计模式
  • 剑指offer
大前端
  • javascript
  • vue
  • html
  • css
  • 🌏浏览器专题
  • Web性能优化
  • regexp
  • node
面试
  • 问解
  • javascript
  • css
  • 手撕代码
  • 性能优化
  • 综合问题
  • 面经汇总
  • 小程序
手撕代码
  • 数据结构与算法
  • javascript
  • css
个人站点
  • GitHub (opens new window)
  • 博客园 (opens new window)
  • 掘金 (opens new window)
线上作品
  • 轻取(文件收集) (opens new window)
  • 个人图床 (opens new window)
  • 考勤小程序 (opens new window)
  • 时光恋人 (opens new window)
  • 在线简历生成 (opens new window)
留言板
Github (opens new window)
author-avatar

粥里有勺糖

285

文章

40

标签

关于我
备战春秋
  • 心得总结
  • 校招考点汇总
  • 面经汇总
  • 复习自查
技术笔记
  • 技术教程
  • 模板工程
  • 源码学习
  • 技术概念
  • 个人作品
  • 学习笔记
计算机基础
  • 算法与数据结构
  • 操作系统
  • 计算机网络
  • 设计模式
  • 剑指offer
大前端
  • javascript
  • vue
  • html
  • css
  • 🌏浏览器专题
  • Web性能优化
  • regexp
  • node
面试
  • 问解
  • javascript
  • css
  • 手撕代码
  • 性能优化
  • 综合问题
  • 面经汇总
  • 小程序
手撕代码
  • 数据结构与算法
  • javascript
  • css
个人站点
  • GitHub (opens new window)
  • 博客园 (opens new window)
  • 掘金 (opens new window)
线上作品
  • 轻取(文件收集) (opens new window)
  • 个人图床 (opens new window)
  • 考勤小程序 (opens new window)
  • 时光恋人 (opens new window)
  • 在线简历生成 (opens new window)
留言板
Github (opens new window)
  • Vue

    • 简介
    • 响应式基本原理
    • 路由原理
    • 生命周期钩子
    • 组件通信
    • extend API
    • mixin与mixins
    • computed与watch
    • keep-alive
    • v-show 与 v-if
    • ❤运行机制概述
    • ❤响应式系统的依赖收集追踪原理
    • ❤VNode实现
    • 编译template的过程
    • 数据状态更新时的差异 diff 及 patch 机制

运行机制概述

vuePress-theme-reco 粥里有勺糖    2018 - 2023

运行机制概述

粥里有勺糖 2020-04-14 大前端vue

# 运行机制概述

图片

全局概览

# 初始化及挂载

  • 在 new Vue() 之后。 Vue 会调用 _init 函数进行初始化
    • 初始化生命周期、事件、 props、 methods、 data、 computed 与 watch 等
    • 通过 Object.defineProperty 设置 setter 与 getter 函数,用来实现响应式以及依赖收集
    • 初始化之后调用 $mount 挂载组件
      • 如果是运行时编译,即不存在 render function
      • 存在 template 的情况,需要进行编译步骤。

# 编译

compile编译分为 parse

解析
, optimize
优化
, generate
生成
三个阶段,最终需要得到 render function
渲染函数

# parse

使用正则表达式等方式解析Template模板中的指令,class,style等等数据,形成AST

Abstract Syntax Tree
抽象语法树

# optimize

optimize 的主要作用是标记 static 静态节点

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

# generate

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

静态Render
静态 render 其实跟 render 是一样的,都是执行得到 Vnode,只是静态 render,没有绑定动态数据,即说不会变化
字符串。

在经历过 parse,optimize,generate这三个阶段以后,组件中就会存在渲染 VNode

Virtual DOM
虚拟DOM是JavaScript对象
所需的 render function 了

# 响应式

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',                 
    children: [                 
        {
            tag: 'a',    
            text: 'click me'
        }
    ]
}
1
2
3
4
5
6
7
8
9

渲染为

<div>
    <a>click me</a>
</div>
1
2
3

# 更新视图

在修改一个对象值的时候,会通过 setter -> Watcher -> update 的流程来修改对应的视图

当数据变化后,执行 render function 就可以得到一个新的 VNode 节点,将新 VNode 与旧 VNode 一起传入 patch 进行比较,经过 diff 算法得出它们的差异 ,只需要将这些差异的对应 DOM 进行修改即可。

Edit this page (opens new window)
Last Updated: 2022/5/15 12:46:34