1. 剔出console
npm i terser -D
import { defineConfig } from "vite";
export default defineConfig({
build: {
minify: 'terser',
terserOptions: {
compress: {
pure_funcs: ['console.log'],
drop_debugger: true,
}
}
}
})
2. 图片压缩
npm i vite-plugin-imagemin -D
import viteImagemin from 'vite-plugin-imagemin';
plugin: [
viteImagemin({
gifsicle: {
optimizationLevel: 7,
interlaced: false
},
optipng: {
optimizationLevel: 7
},
mozjpeg: {
quality: 20
},
pngquant: {
quality: [0.8, 0.9],
speed: 4
},
svgo: {
plugins: [
{
name: 'removeViewBox'
},
{
name: 'removeEmptyAttrs',
active: false
}
]
}
})
]
3. gzip 压缩
npm i vite-plugin-compression -D
import compression from 'vite-plugin-compression';
export default defineConfig({
plugins: [
compression({
algorithm: "gzip",
ext: ".gz",
threshold: 10240,
deleteOriginFile: false,
filter: /\.(js|css|json|html|ico|svg)(\?.*)?$/i,
compressionOptions: { level: 9 },
verbose: true,
disable: false,
}),
],
});
4. 图片懒加载
npm install vite-plugin-vue-lazyload
import vue from '@vitejs/plugin-vue'
import VueLazyload from 'vite-plugin-vue-lazyload'
export default {
plugins: [
VueLazyload({
loading: 'loading.webp',
error: 'error.webp',
}),
],
};
<img v-lazy="'image1.jpg'">
5. 虚拟长列表优化
文档 https://www.npmjs.com/package/vue-virtual-scroller#installation
npm install --save vue-virtual-scroller
import Vue from 'vue'
import 'vue-virtual-scroller/dist/vue-virtual-scroller.css'
import VueVirtualScroller from 'vue-virtual-scroller'
Vue.use(VueVirtualScroller)
或
<RecycleScroller class="scroller" :items="list" :item-size="32" key-field="id" v-slot="{item}"><div class="user"> {{ item.name }} </div></RecycleScroller>
6. 缓存组件内部实例
<!-- 非活跃的组件将会被缓存! -->
<KeepAlive :max="10" include="a,b" >
<component :is="activeComponent" />
</KeepAlive>
7. 代码分割-
function loadLazy() {
return import('./lazy.js')
}
import { defineAsyncComponent } from 'vue'
const Foo = defineAsyncComponent(() => import('./Foo.vue'))
更新优化
1. Props 稳定性: 将状态比对的逻辑移入父组件来实现, 让传给子组件的 props 尽量保持稳定--优化组件更新
<ListItem v-for="item in list" :id="item.id" :active-id="activeId" /> ==> <ListItem v-for="item in list" :id="item.id" :active="item.id === activeId" />
2. 减少大型不可变数据的响应性开销
const shallowArray = shallowRef([
])
shallowArray.value.push(newObject)
shallowArray.value = [...shallowArray.value, newObject]
shallowArray.value[0].foo = 1
shallowArray.value = [
{
...shallowArray.value[0],
foo: 1
},
...shallowArray.value.slice(1)
]
3. 区分v-if和v-show
4. v-for与 v-if
(1) Vue 默认按照“就地更新”的策略来更新通过 v-for 渲染的元素列表。当数据项的顺序改变时,Vue 不会随之移动 DOM 元素的顺序,而是就地更新每个元素,确保它们在原本指定的索引位置上渲染。默认模式是高效的,但只适用于列表渲染输出的结果不依赖子组件状态或者临时 DOM 状态 (例如表单输入值) 的情况
(2) v-for 遍历避免同时使用 v-if
同时使用 v-if 和 v-for 是不推荐的,因为这样二者的优先级不明显。vue3中,当它们同时存在于一个节点上时,v-if 比 v-for 的优先级更高。vue2中, 当它们处于同一节点,v-for 的优先级比 v-if 更高,这意味着 v-if 将分别重复运行于每个 v-for 循环中。