Vue 项目性能优化 — 实践指南

代码层面的优化

v-if 和 v-show 区分使用场景

v-if 是真正的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。
v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做 —— 直到条件第一次变为真时,才会开始渲染条件块。
v-show 的元素始终会被渲染并保留在 DOM 中。v-show 只是简单地切换元素的 CSS 属性 display。
v-show 不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。

需要非常频繁地切换,则使用 v-show 较好,如果在运行时条件很少改变,则使用 v-if 较好。

computed 和 watch 区分使用场景

computed:是计算属性,依赖其他属性值,并且 computed 的值有缓存,只有它依赖的属性值发生变化,下一次获取 computed 的值时才会重新计算 computed 的值。

watch:更多是观察的作用,类似于某些数据的监听回调,每当监听的数据变化时都会执行回调进行后续操作;

运用场景:

需要进行数值计算,并且依赖于其他数据时,应该使用 computed,因为可以利用 computed 的缓存特性,避免每次取值时,都要重新计算;
需要在数据变化时执行异步或开销较大的操作时,应该使用 watch,使用 watch 选项允许当我们执行异步操作(访问一个 API),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态,这些都是计算属性无法做到的。

v-for 遍历必须为 item 添加 key,且避免同时使用 v-if

v-for 遍历必须为 item 添加 key

在列表数据进行遍历渲染时,需要为每一项 item 设置唯一 key 值,方便 Vue.js 内部机制准确找到该条列表数据。当 state 更新时,新的状态值和旧的状态值对比,较快地定位到 diff。

v-for 遍历避免同时使用 v-if

v-for 比 v-if 优先级高,如果每一次都需要遍历整个数组,将会影响速度,尤其是当之需要渲染很小一部分的时候,必要情况下应当替换成 computed 属性。

长列表性能优化

Vue 会通过 Object.defineProperty 对数据进行劫持,来实现视图响应数据的变化,然而有些时候我们的组件就是纯粹的数据展示,不会有任何更改,我们就不需要 Vue 来劫持我们的数据,在大量数据展示的情况下,这能够很明显的减少组件初始化的时间,那如何禁止 Vue 劫持我们的数据呢?可以通过 Object.freeze 方法来冻结一个对象,一旦被冻结的对象就再也不能被修改了。

1
2
3
4
5
6
7
8
9
export default {
data: () => ({
users: {}
}),
async created() {
const users = await axios.get("/api/users");
this.users = Object.freeze(users);
}
};

事件的销毁

Vue 组件销毁时,会自动清理它与其它实例的连接,解绑它的全部指令及事件监听器,但是仅限于组件本身的事件。 如果在 js 内使用 addEventListene 等方式是不会自动销毁的,我们需要在组件销毁时手动移除这些事件的监听,以免造成内存泄露,如:

1
2
3
4
5
6
created() {
addEventListener('click', this.click, false)
},
beforeDestroy() {
removeEventListener('click', this.click, false)
}

图片资源懒加载

对于图片过多的页面,为了加速页面加载速度,所以很多时候我们需要将页面内未出现在可视区域内的图片先不做加载, 等到滚动到可视区域后再去加载。这样对于页面加载性能上会有很大的提升,也提高了用户体验。我们在项目中使用 Vue 的 vue-lazyload 插件:

安装插件

1
npm install vue-lazyload --save-dev

以上是我对下列文章的复制粘贴。详细请看下列文章。
Vue 项目性能优化 — 实践指南

Vue 项目性能优化 — 实践指南

http://example.com/2020/02/14/Blog-about-learning-28/

作者

Fallen-down

发布于

2020-02-14

更新于

2020-05-22

许可协议

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

评论

You forgot to set the shortname for Disqus. Please set it in _config.yml.
You need to set client_id and slot_id to show this AD unit. Please set it in _config.yml.