网站首页 > 技术文章 正文
当组件状态变化,Vue 会生成一棵全新的虚拟 DOM 树。如果每次都推倒重建,页面必然卡顿。Diff 算法就是「找出最小差异」的那把手术刀。Vue 2 的双端 Diff 已经很快,Vue 3 却用「快速 Diff」让它更快。
一、为什么需要 Diff?
响应式系统只能告诉你「某个组件脏了」,却不知道「脏在哪一行节点」。Diff 负责在同层级内精确定位「新增、删除、移动、更新」,避免整棵树的重绘。
二、Vue 2 的双端 Diff
想象新旧两条虚拟节点队列,各有一头一尾两个指针:
- 头头比对
新旧头节点相同 → 复用节点,两指针右移。
- 尾尾比对
新旧尾节点相同 → 复用节点,两指针左移。
- 旧头新尾比对
相同 → 把旧头节点移动到尾部,旧头右移、新尾左移。
- 新头旧尾比对
相同 → 把旧尾节点移动到头部,新头右移、旧尾左移。
如果四步都失败,就进入「暴力查找」:在旧队列里线性搜索与新头相同的节点。找到则移动,未找到则新增。
指针相遇即结束,剩余旧节点批量删除,剩余新节点批量新增。
双端 Diff 用 O(n) 时间完成「头尾夹击」,极大减少移动次数。
三、Vue 3 快速 Diff
双端 Diff 在「乱序列表」场景仍需多次线性搜索。Vue 3 把思路翻转:
- 先建立 key → index 的 Map,一次遍历即可知道是否存在可复用节点;
- 再求「最长递增子序列」(LIS),把「需要移动的节点」降到最少;
- 最后只做必要的 DOM 移动,其余节点原地复用。
结果:
- 纯新增或纯删除场景 → O(1) 完赛;
- 乱序场景 → O(n log n) 优于双端 Diff 的 O(n^2)。
快速 Diff 把「比较」提前到内存,把「移动」推迟到最小集合,浏览器只需执行真正的 DOM 操作。
总结
Vue 2 用双端指针夹击「头尾」,Vue 3 用预序列化 + LIS 直击「最小移动」。理解指针走向,你就握住了性能优化的方向盘。
猜你喜欢
- 2025-09-23 JS 打造动态表格_js如何动态改变表格内容
- 2025-09-23 能提高编码效率的8个JS语法微调小技巧
- 2025-09-23 Vue 3 快速 Diff_vue3 ref dom
- 2025-09-23 深入 Vue v-model_深入浅出电影在线观看完整版
- 2024-12-19 this is a test This is a test message.
- 2024-12-19 写给前端同学的Nginx配置指南 前端nginx 配置详解
- 2024-12-19 web前端开发 | 对小程序的理解及分包
- 2024-12-19 汽车大灯灯泡前有黑色的东西,会不会影响行车安全
- 2024-12-19 开源旅游小程序-前端+后端程序,源码开放,支持二次开发
- 2024-12-19 H5小游戏开发教程之基础项目搭建 h5小游戏制作软件
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- oracle面试 (55)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)