1. 避免过度使用响应式数据(如冻结大对象)
-
问题:Vue 默认会给所有数据加上"监控"(响应式),数据变化时会自动更新页面。但如果是超大的对象(比如几万行的表格数据),这个"监控"会非常耗性能。
-
例子 :
你有一个只展示不修改的静态数据表,如果让 Vue 一直监控它,就像给一个不动的摄像头一直录像,浪费电(性能)! -
解决 :
用Object.freeze()
冻结数据,告诉 Vue:"别监控它了,我不改!"javascriptdata() { return { bigData: Object.freeze([...]) // 冻结大对象 } }
2. 使用 v-for
时加唯一 key
,不和 v-if
共用
-
为什么加
key
:
Vue 更新列表时,需要知道每个节点的身份。如果没key
,它会傻傻地从头对比,效率低。
例子 :
你的书架有 100 本书,如果每本书都有唯一编号(key),整理时直接按编号找位置;没编号就得一本本对比书名,累死! -
代码 :
html<!-- 正确做法 --> <div v-for="item in list" :key="item.id">{{ item.name }}</div>
-
不和
v-if
共用 :
v-for
优先级比v-if
高,一起用会导致每次循环都执行一次判断,浪费性能。
解决 :
先过滤数据,再循环。
3. 路由懒加载
-
是什么 :
把不同页面的代码拆分成多个文件,访问某个页面时才加载对应代码。 -
例子 :
你点外卖,不会一次性把全城餐厅的菜都做好,而是你选好餐厅后,才让厨师开始做菜(加载代码)。 -
代码 :
javascript// 普通加载(一次性全加载) import Home from '@/views/Home.vue' // 懒加载(访问时才加载) const Home = () => import('@/views/Home.vue')
-
效果:首屏加载更快,用户不用等所有代码下载完。
4. 组件异步加载
-
原理:和路由懒加载类似,延迟加载不常用的组件。
-
例子 :
你的网页有个"高级设置"弹窗,用户可能根本不会点开。等用户点击时再加载这个组件代码。 -
代码 :
javascriptcomponents: { AdvancedSettings: () => import('./AdvancedSettings.vue') }
5. 图片懒加载
-
是什么:页面滚动到图片位置时,再加载图片。
-
例子 :
刷朋友圈时,先加载看到的图片,下面的图片等你滑到那里再加载。 -
实现 :
使用vue-lazyload
库:html<img v-lazy="imageUrl"> <!-- 懒加载图片 -->
6. CDN 加速第三方库
-
问题 :像
vue
、element-ui
这些库,打包到项目里会增大文件体积。 -
解决:用 CDN 引入这些库,让用户从离他们最近的服务器下载,更快!
-
代码 :
html<!-- 在 index.html 中引入 CDN 链接 --> <script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
javascript// 告诉 webpack:"别打包 Vue 了,我用 CDN!" configureWebpack: { externals: { vue: 'Vue' // 这里的 'Vue' 是全局变量名 } }
7. 使用 keep-alive
缓存组件
-
是什么:让切换走的组件不被销毁,保留状态(比如表格的筛选条件)。
-
例子 :
你在"订单列表"页筛选了状态,切换到其他页再回来时,筛选条件还在。 -
代码 :
html<keep-alive> <component :is="currentTab"></component> </keep-alive>
8. 服务端开启 Gzip 压缩
-
是什么:把文件压缩后再传给浏览器,减少下载时间。
-
例子 :
你寄衣服时抽真空压缩,包裹变小,运费更便宜,快递员送得更快。 -
如何做 :
Nginx 配置:nginxgzip on; # 开启压缩 gzip_types text/plain text/css application/json application/javascript; # 压缩类型
总结
- 核心思想 :
减负 :少做无用功(如冻结不动的数据)。
拆包 :别一次性扛所有东西(懒加载)。
缓存 :记住能复用的东西(keep-alive)。
压缩:寄快递前先打包抽真空(Gzip)。