跳到主要内容

认识

一、认识


二、特点


三、Vue vs React


Vue 是一个 编译时 + 运行时 的前端框架, Vue 通过编译 Template 得到虚拟 DOM 渲染函数, 可以在编译的时候进行非常好的性能优化, 比如 动态标记靶向更新静态提升(静态节点、动态节点中的静态属性)、预字符串化内联函数缓存等; Vue 采用响应式依赖追踪机制, 基于 Proxy 来监听数据变化, Vue 内部可以精确的知道数据发生变化的组件, 从而自动更新渲染。Vue 内部将 Template 或者 JSX 编译之后, 生成 VNode 虚拟 DOM, 在整个更新渲染中只会操作 VNode 数据。由于 Vue 只有 VNode, 在进行 Diff 算法时, 可以使用双端对比算法, 高效、快速的完成最小差异比对。 Vue3.0 则是把整个静态节点进行提升处理, Diff 的时候是不过进入循环的。而且, 针对动态节点的, 通过建立块虚拟节点数组, 实现了靶向更新。

React 是纯运行时前端框架, 在运行前, 已经将 JSX 全部转换为 ReactElement 虚拟 DOM, 在运行中没有机会进行编译优化。React 需要通过 this.setState 或者 useState dispatch 手动触发更新, 由开发者决定是否触发更新。React 触发更新工作流为: 从当前 Fiber 节点开始, 冒泡标记更新, 从当前 Fiber 向上遍历,更新每个祖先节点的 childLanes 属性,表明该分支中存在待调和的更新任务。在冒泡更新标记的过程中,最终会找到对应的根节点(通常为 FiberRoot),这个根节点是整个更新流程的入口, 并返回 FiberRoot。也就是说, React 每一次更新都是从 根节点 开始, 为调度提供了统一的入口, 使得更新可以被分割、优先级调度、甚至中断。虽然更新调度从根开始, 但实际的重新渲染和 DOM 更新只发生在受影响的部分, Fiber 算法通过 diff 和优化手段避免了全量重渲染。 另外, React 在运行前, 将 JSX 全部转换为 ReactElement 虚拟 DOM, 随后在 Render BeginWork 递阶段 会生成 Fiber, 具有两种数据结构。由于 React 具有两种结构, 在进行 Diff 对比时, 通过对比 ReactElement 数组Fiber 单链表, 只能从左到右依次比对, 无法实现双端对比。而且, 由于 React 是纯运行时前端框架, 在运行前, 已经将 JSX 全部转换为 ReactElement 虚拟 DOM, 在运行中没有机会进行编译优化, 所以无法进行静态节点分析的,因此 React 在对静态节点处理这一块是要逊色的。