vue3相比vue2性能上提升体现

vue3相比vue2,在 编译阶段,源码体积 响应式系统 都做了性能提升

不以解决实际业务痛点的更新都是耍流氓
1. ts的支持
2. 移除了不常用的api,例如 过滤器 $on $off $once 实例方法 内联模板attribute $destroy
3. 加了tree - shaking
4. 移除了mixin缺点,命名冲突,和数据来源不清楚
5. options Api 改成了 composition Api
提高了大门逻辑组织和代码复用能力
6. Object.defineProperty 变成了 proxy
同时Proxy 并不能监听到内部深层次的对象变化,
而 Vue3 的处理方式是在 getter 中去递归响应式,
这样的好处是真正访问到的内部对象才会变成响应式,
而不是无脑递归

一、编译阶段

Vue3在编译阶段,做了进一步优化。主要有如下:
diff算法优化
静态提升
事件监听缓存
SSR优化

二、源码体积

相比Vue2,Vue3整体体积变小了,除了移出一些不常用的API,再重要的是Tree shaking
任何一个函数,如ref、reavtived、computed等,仅仅在用到的时候才打包,没用到的模块都被摇掉,打包的整体体积变小

三、响应式系统

vue2中采用 Object.defineProperty来劫持整个对象,然后进行深度遍历所有属性,给每个属性添加getter和setter,实现响应式

vue3采用proxy重写了响应式系统,因为proxy可以对整个对象进行监听,所以不需要深度遍历

可以监听动态属性的添加

可以监听到数组的索引和数组length属性

可以监听删除属性

一、编译阶段性能提升详解

diff算法优化

Vue2,每个组件实例都对应一个 watcher 实例,它会在组件渲染的过程中把用到的数据property记录为依赖,当依赖发生改变,触发setter,则会通知watcher,从而使关联的组件重新渲染

试想一下,一个组件结构如下图

<template>
<div id="content">
<p class="text">静态文本</p>
<p class="text">静态文本</p>
<p class="text">{{ message }}</p>
<p class="text">静态文本</p>
...
<p class="text">静态文本</p>
</div>
</template>
可以看到,组件内部只有一个动态节点,剩余一堆都是静态节点,所以这里很多 diff 和遍历其实都是不需要的,造成性能浪费

vue3在diff算法中相比vue2增加了静态标记

关于这个静态标记,其作用是为了会发生变化的地方添加一个flag标记,下次发生变化的时候直接找该地方进行比较

下图这里,已经标记静态节点的p标签在diff过程中则不会比较,把性能进一步提高

静态类型枚举如下:
export const enum PatchFlags {
TEXT = 1,// 动态的文本节点
CLASS = 1 << 1, // 2 动态的 class
STYLE = 1 << 2, // 4 动态的 style
PROPS = 1 << 3, // 8 动态属性,不包括类名和样式
FULL_PROPS = 1 << 4, // 16 动态 key,当 key 变化时需要完整的 diff 算法做比较
HYDRATE_EVENTS = 1 << 5, // 32 表示带有事件监听器的节点
STABLE_FRAGMENT = 1 << 6, // 64 一个不会改变子节点顺序的 Fragment
KEYED_FRAGMENT = 1 << 7, // 128 带有 key 属性的 Fragment
UNKEYED_FRAGMENT = 1 << 8, // 256 子节点没有 key 的 Fragment
NEED_PATCH = 1 << 9, // 512
DYNAMIC_SLOTS = 1 << 10, // 动态 solt
HOISTED = -1, // 特殊标志是负整数表示永远不会用作 diff
BAIL = -2 // 一个特殊的标志,指代差异算法
}

静态提升

Vue3中对不参与更新的元素,会做静态提升,只会被创建一次,在渲染时直接复用

这样就免去了重复的创建节点,大型应用会受益于这个改动,免去了重复的创建操作,优化了运行时候的内存占用

静态内容_hoisted_1被放置在render 函数外,每次渲染的时候只要取 _hoisted_1 即可

同时 _hoisted_1 被打上了 PatchFlag ,静态标记值为 -1 ,特殊标志是负整数表示永远不会用于 Diff

事件监听缓存

默认情况下绑定事件行为会被视为动态绑定,所以每次都会去追踪它的变化

<div>
<button @click = 'onClick'>点我</button>
</div>
没开启事件监听器缓存
export const render = /*#__PURE__*/_withId(function render(_ctx, _cache, $props, $setup, $data, $options) {
return (_openBlock(), _createBlock("div", null, [
_createVNode("button", { onClick: _ctx.onClick }, "点我", 8 /* PROPS */, ["onClick"])
// PROPS=1<<3,// 8 //动态属性,但不包含类名和样式
]))
})
开启事件侦听器缓存后
export function render(_ctx, _cache, $props, $setup, $data, $options) {
return (_openBlock(), _createBlock("div", null, [
_createVNode("button", {
onClick: _cache[1] || (_cache[1] = (...args) => (_ctx.onClick(...args)))
}, "点我")
]))
}

上述发现开启了缓存后,没有了静态标记。也就是说下次diff算法的时候直接使用

SSR优化

当静态内容大到一定量级时候,会用createStaticVNode方法在客户端去生成一个static node,这些静态node,会被直接innerHtml,就不需要创建对象,然后根据对象渲染

<div>
<div>
<span>你好</span>
</div>
... // 很多个静态属性
<div>
<span>{{ message }}</span>
</div>
</div>
编译后
import { mergeProps as _mergeProps } from "vue"
import { ssrRenderAttrs as _ssrRenderAttrs, ssrInterpolate as _ssrInterpolate } from "@vue/server-renderer"

export function ssrRender(_ctx, _push, _parent, _attrs, $props, $setup, $data, $options) {
const _cssVars = { style: { color: _ctx.color }}
_push(`<div${
_ssrRenderAttrs(_mergeProps(_attrs, _cssVars))
}><div><span>你好</span>...<div><span>你好</span><div><span>${
_ssrInterpolate(_ctx.message)
}</span></div></div>`)
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue 3相比Vue 2提升了更快的渲染速度,更好的类型安全性,更灵活的组件通信机制,更强大的路由系统,更容易的服务器端渲染,更全面的 TypeScript 支持,更优化的代码结构,以及新的调试工具。 ### 回答2: Vue 3相比Vue 2在以下几个方面有了明显的提升。 1. 性能提升Vue 3通过优化虚拟DOM的算法和编译器,显著提高了性能。新的响应式系统使用了基于Proxy的数据劫持,比Vue 2的Object.defineProperty更高效,能够更好地追踪数据的变化。 2. 打包体积减小:Vue 3移除了一些过时的API,整个库的打包体积比Vue 2减小了约30%,减轻了网络传输负担,提速了页面加载速度。 3. 组合式API:Vue 3引入了组合式API,使得组件逻辑可以更加清晰地组织和重用。开发者可以通过API自由组合逻辑代码,更好地划分功能,提高了代码的可维护性。 4. TypeScript支持:Vue 3对TypeScript的支持更加友好,大部分核心API都有了相应的类型声明,开发者可以更早地发现潜在的错误,并且编辑器能够提供更好的代码提示和补全。 5. 更好的升级途径:Vue 3可以与Vue 2共存,并提供了更好的升级途径。Vue 3提供了一个逐步升级的工具,帮助开发者平滑过渡到新版本,从而降低了升级的风险。 总的来说,Vue 3在性能、打包体积、API设计、TypeScript支持和升级途径等方面都有了明显的提升,使得开发者能够更加高效、舒适地使用Vue进行开发。 ### 回答3: Vue 3相比Vue 2在性能、体积、使用体验和开发者工具等方面有了很多提升。 首先是性能方面的提升Vue 3通过使用Proxy代理对象替代了Vue 2中的Object.defineProperty方法,使得响应式系统的性能得到了显著提升。此外,Vue 3还引入了静态树优化和组件级别的缓存优化,可以减少不必要的渲染操作,提高页面性能。 其次是体积方面的提升Vue 3采用了更好的Tree-Shaking机制和模块化设计,可以让开发者只引入所需的功能代码,从而减小项目的体积。这使得Vue 3在移动端和网络环境较差的情况下有更好的表现。 再者,Vue 3在使用体验方面也有了很多提升Vue 3引入了Composition API,提供了更加灵活的组合式编程方式,使得代码逻辑更加清晰和可维护。此外,Vue 3还提供了更好的TypeScript支持,让开发者在开发过程中能够更快速、更准确地发现错误。 最后,开发者工具方面也有了很多改进。Vue 3的开发者工具更加强大和易用,提供了更多的工具和功能,如更好的性能监控和调试工具等,可以帮助开发者更高效地进行开发和调试工作。 总结来说,Vue 3相比Vue 2在性能、体积、使用体验和开发者工具等方面都有了明显的提升,使得开发者能够更加高效、更加愉快地开发Vue应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值