数据双向绑定

image.png
双向绑定的实现:数据劫持、发布订阅
vue2中关于数组和对象,数据劫持时有写什么特殊处理吗?==> 重写数组方法
defineProperty 和 proxy 有什么区别?==> proxy学习笔记
vue的数据频繁变化但是只更新一次?===> [点我跳转**](#enJyB)
vue-响应式base

new Vue()发生了什么

vue框架的整个周期,比如vue的初始化,发生了什么?
new Vue发生了什么,各个生命周期的函数如何被触发的
生命周期函数
父子组件挂载的时候,生命周期顺序?
.vue文件开始到DOM渲染到页面上,Vue做了哪些工作
vue的模板解析,是如何进行的?
如何形成AST?
render函数的生成?
什么是依赖收集?
什么是patch?

  • vnode -> DOM:把虚拟DOM转换成真正的DOM节点

初始化

1、创建Vue实例对象
2、init过程
3、初始化后,调用$mount方法对Vue实例进行挂载
3.1模板编译
render function生成: template -> render function
template 字符串编译步骤如下 :

  • parse正则解析template字符串形成AST(抽象语法树,是源代码的抽象语法结构的树状表现形式)
  • optimize标记静态节点跳过diff算法(diff算法是逐层进行比对,只有同层级的节点进行比对,因此时间的复杂度只有O(n)
  • generate将AST转化成render function字符串

mountComponent: 编译成render function 后,调用$mount的mountComponent方法

  • 执行beforeMount钩子函数
  • 再执行核心逻辑:实例化一个渲染Watcher,在它的回调函数(初始化的时候执行,以及组件实例中监测到数据发生变化时执行)中调用updateComponent方法

    (此方法调用render方法生成虚拟Node,最终调用update方法更新DOM)
    3.2渲染
    render function -> 虚拟Node render方法的第一个参数是createElement
    3.3更新update
    update方法调用pacth方法把虚拟DOM转换成真正的DOM节点

响应式流程

https://www.yuque.com/u2728/work-makes-me-happy/pcu1dv#wlhyh

image.png

在初始化流程中的编译阶段,当render function被渲染的时候,会读取Vue实例中和视图相关的响应式数据
=> 触发getter函数进行依赖收集: 将观察者Watcher对象存放到当前闭包的订阅者Depsubs

可以发现只要视图中添加监听事件,就会自动纳入 依赖收集 以及 该数据对应变化的 update函数

watch 和 computed原理

computed、watcher

Vue的数据为什么频繁变化但只会更新一次

小提示:这里问的是Vue源码对于视图更新的优化。我这里的回答是乱糟糟的,希望有同学能够给出一个精准并且简短的回答。
Vue是异步更新Dom的,Dom的更新放在下一个宏任务或者当前宏任务的末尾(微任务)中进行执行
由于VUE的数据驱动视图更新是异步的,即修改数据的当下,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图更新。在同一事件循环中的数据变化后,DOM完成更新,立即执行nextTick(callback)内的回调。

脑海中过一下vue里data→view的过程:

vue中从修改 data 到 UI 更新的过程(注意顺序):

  1. 修改 data 后,Vue 的 watcher 收到通知,压入 MicroTask Queue;
  2. 你立即调用 Vue.nextTick(企图获得data改变后的最新dom),Callback压入 MicroTask Queue;
  3. 依次执行所有 MicroTask
    1. data 的修改会被更新到 DOM 上。请注意,此时浏览器并没有将这些变更渲染到屏幕上,但是,DOM 已经更新了!(dom的修改是同步的 但是 浏览器的dom树绘制到屏幕显示是异步的!
    2. 执行 nexttick的Callback,此时拿到的 DOM 已经是新的了
    3. 可以在 nextTick 的 Callback 中继续修改 data,那么使用 MicroTask 能够确保你的这个更新在本轮 Event Loop 就能完成,直接上屏。而如果使用类似 setTimeout 那样的机制来实现 nextTick 的话,这个修改引发的 UI Render 必须等到至少下一轮 Event Loop 中执行。
  4. 浏览器渲染 DOM 更新到屏幕上。

this.$nextTick

$nextTick原理
$nextTick 执行的时机和 DOM 渲染的关系是什么?

  • 什么是 Event Loop ?
  • 宏任务和微任务有什么区别?
  • 哪些是宏任务哪些是微任务?
  • $nextTick在几个版本迭代中都经历了什么变化?
  • 打开新的浏览器窗口时会重新创建一个新的 Network 进程吗?

执行栈-> 微任务 -> 宏任务 -> UI render

MVVM vs MVC

viewmodel有什么好处?

virtual dom 与 dom diff

image.png

既然 Vue 通过数据劫持可以精准探测数据变化,为什么还需要虚拟 DOM 进行 diff 检测差异?
Vue和React的视图更新机制对比
https://blog.csdn.net/qq_43271330/article/details/107763945
简单的 Virtual DOM 算法
从零开始,手写一个简易的Virtual DOM
小白大战diff算法
livoras-深度剖析如何实现dom diff

0 代表 直接替换原有节点 1 代表 调整子节点,包括移动、删除等 2 代表 修改节点属性 3 代表 修改节点文本内容


Vue能做哪些性能优化?

解题思路

  • keep-alive
  • 路由懒加载
    • 路由懒加载是如何实现的?
  • Preload / Prefetch
  • key
  • 响应式依赖扁平化
  • 减少非必要的响应式依赖
  • Object.freeze
  • DOM 滚动加载
  • v-if / v-show
  • computed / watch
  • 事件销毁(防止内存泄漏)
  • 组件按需引入
  • 预渲染
  • 按需 Polyfill
  • 模板预编译
  • 渲染函数
  • 官方风格指南 + 官方 ESLint 插件
  • Coding Split 和哪些 Webpack 配置相关?

状态管理

image.png

vue router

阿里p7: 你了解路由吗

参考资料

2021年前端面试必读文章【超三百篇文章/赠复习导图】-框架(Vue 为主)
在阿里我是如何当面试官的-Vue篇