问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Vue 项目性能优化技巧分享

发布网友 发布时间:2小时前

我来回答

1个回答

热心网友 时间:2小时前

Vue 框架通过数据双向绑定和虚拟 DOM 技术,帮我们处理了前端开发中最脏最累的 DOM 操作部分, 我们不再需要去考虑如何操作 DOM 以及如何最高效地操作 DOM;但 Vue 项目中仍然存在项目首屏优化、Webpack 编译配置优化等问题,所以我们仍然需要去关注 Vue 项目性能方面的优化,使项目具有更高效的性能、更好的用户体验。本文是作者通过实际项目的优化实践进行总结而来,希望读者读完本文,有一定的启发思考,从而对自己的项目进行优化起到帮助。本文内容分为以下三部分组成:

一、代码层面的优化

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

v-if 是 真正 的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建;也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。

v-show 就简单得多, 不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 的 display 属性进行切换。

所以,v-if 适用于在运行时很少改变条件,不需要频繁切换条件的场景;v-show 则适用于需要非常频繁切换条件的场景。

1.2、computed 和 watch 区分使用场景

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

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

运用场景:

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

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

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

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

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

1.4、长列表性能优化

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

1.5、事件的销毁

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

1.6、图片资源懒加载

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

1.7、路由懒加载

Vue 是单页面应用,可能会有很多的路由引入 ,这样使用 webpcak 打包后的文件很大,当进入首页时,加载的资源过多,页面会出现白屏的情况,不利于用户体验。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应的组件,这样就更加高效了。

1.8、第三方插件的按需引入

我们在项目中经常会需要引入第三方插件,如果我们直接引入整个插件,会导致项目的体积太大,我们可以借助 babel-plugin-component ,然后可以只引入需要的组件,以达到减小项目体积的目的。

1.9、优化无限列表性能

如果你的应用存在非常长或者无限滚动的列表,那么需要采用 窗口化 的技术来优化性能,只需要渲染少部分区域的内容,减少重新渲染组件和创建 dom 节点的时间。你可以参考以下开源项目 vue-virtual-scroll-list 和 vue-virtual-scroller 来优化这种无限列表的场景的。

1.10、服务端渲染 SSR or 预渲染

服务端渲染是指 Vue 在客户端将标签渲染成的整个 html 片段的工作在服务端完成,服务端形成的 html 片段直接返回给客户端这个过程就叫做服务端渲染。

(1)服务端渲染的优点:

(2)服务端渲染的缺点:

如果你的项目的 SEO 和 首屏渲染是评价项目的关键指标,那么你的项目就需要服务端渲染来帮助你实现最佳的初始加载性能和 SEO,具体的 Vue SSR 如何实现,可以参考作者的另一篇文章《Vue SSR 踏坑之旅》。如果你的 Vue 项目只需改善少数营销页面(例如/, /about, /contact 等)的 SEO,那么你可能需要预渲染,在构建时 (build time) 简单地生成针对特定路由的静态 HTML 文件。

二、Webpack 层面的优化

2.1、Webpack 对图片进行压缩

在 vue 项目中除了可以在webpack.base.conf.js 中 url-loader 中设置 limit 大小来对图片处理,对小于 limit 的图片转化为 base64 格式,其余的不做操作。所以对有些较大的图片资源,在请求资源的时候,加载会很慢,我们可以用 image-webpack-loader来压缩图片。

2.2、减少 ES6 转为 ES5 的冗余代码

Babel 插件会在将 ES6 代码转换成 ES5 代码时会注入一些辅助函数,例如下面的 ES6 代码,通过require('babel-runtime/helpers/createClass') 的方式导入,可以避免代码冗余。

2.3、提取公共代码

如果项目中没有去将每个页面的第三方库和公共模块提取出来,则项目会存在以下问题。所以我们需要将多个页面的公共代码抽离成单独的文件,来优化以上问题。

2.4、模板预编译

当使用 DOM 内模板或 JavaScript 内的字符串模板时,模板会在运行时被编译为渲染函数。通常情况下这个过程已经足够快了,但对性能敏感的应用还是最好避免这种用法。预编译模板最简单的方式就是使用单文件组件。

2.5、提取组件的 CSS

当使用单文件组件时,组件内的 CSS 会以 style 标签的方式通过 JavaScript 动态注入。这有一些小小的运行时开销,将所有组件的 CSS 提取到同一个文件可以避免这个问题,也会让 CSS 更好地进行压缩和缓存。

三、基础的 Web 技术优化

3.1、开启 gzip 压缩

3.2、浏览器缓存

3.3、CDN 的使用

3.4、使用 Chrome Performance 查找性能瓶颈

总结

本文通过以下三部分组成:Vue 代码层面的优化、webpack 配置层面的优化、基础的 Web 技术层面的优化;来介绍怎么去优化 Vue 项目的性能。希望对读完本文的你有帮助、有启发,如果有不足之处,欢迎批评指正交流!
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
word文档怎么设置页码word怎么从中间开始设置页码 《祖宗模拟器》如何长寿长寿技巧分享 祖宗模拟器答案大全,你知道吗。 祖宗模拟器答案大全,哪位有? 宝石种类分为哪几类? 表格怎么自动排序号excel表格中自动生成序号技巧 表格如何自动排序仅需4步让Excel表格自动排序的方法 1.5匹富士空调电脑板开机就烧保险丝 为什么 修空调只是把拆了个压敏电阻,虽然可以运行,但这样没问题吗? 1.5富士空调电脑板一通电就烧保险丝为什么 vue服务器渲染速度 服务端渲染(SSR) vue的两种服务器端渲染方案 Nuxt.js实战:Vue.js的服务器端渲染框架 快速在你的vue/react应用中实现ssr(服务端渲染) 天之痕陈辅被宇文拓冰封然后去哪 剑侠情缘3 80级后一下迷茫了! 关于剑网3 80级后玩法,装备兑换等,求高端玩家指导 想自己在电脑编点实用的小程序,搜索发现VB比较容易上手,请教一下怎么入... vb6.0和vb.net有什么区别 我用VB编写了个小程序,怎样让它脱离VB成为能单独运行的程序 苹果手机亮屏时间怎么设置 万象网管ol钱多多怎么设置定额上机 华东理工大学入校后可以调专业不? 华东理工大学转专业,急 华东理工大学新生换专业容易吗 自家wifi怎么防止别人蹭网 电脑怎么防止别人蹭网 4-Dot1x(802.1x)、EAP、WEP、WPA、WPA2、PSK WiFi无线网络中的安全性选项里的open,WPApsk,wpa2psk是是什么意思? wpa2psk是什么安全性 Vue构建的页面怎么提高首屏渲染以及性能优化 ios上的mobileprovision文件要过期了,怎样直接更新这个文件 悲伤恋歌里面的主题曲和插曲是谁唱的及名字? 电视剧《悲伤恋歌》插曲有哪些?主要经常放的有首特别好听?麻烦大家帮忙... 教育学自考很难吗 自考大专考试题目难吗 自学考试的难度和高考的一样吗 山东菏泽教师招聘报名截止时间是什么时候 有节奏的跑步口号 地下城与勇士:起源 dnf手游导师套a和b称号有什么区别? 23年中国科学院大学地理科学与资源研究所考博招生和备考分享 2023中国地质大学(武汉)大地测量学与测量工程学硕考研招生情况及备考... 幻想生物图鉴求全集 求幻想生物图鉴1-12 跪求幻想生物图鉴全套 幻想生物图鉴 ...卫生间里,很小,很多。它生在秋天,请问它叫什么名字,如何驱除?_百... ...卫生间里,很小,很多。它生在秋天,请问它叫什么名字... 2匹空调用多少平方铜线 为什么qq无法定位程序输入点?errordocument@qbepbdxz于动态链接库tinyxm...