Vue项目开发完毕后,对项目进行打包发布之前,必不可少的操作就是项目优化,这也是程序猿的加分项。跟随本文的脚步来看看如何对项目进行优化吧!
在项目中使用
rollup-plugin-visualizer
插件可以生成可视化的代码分析报告,看看哪些模块占用了空间,帮助我们更好地了解构建过程中的文件大小、依赖关系等信息。
rollup-plugin-visualizer
插件。可以使用 npm
或者 yarn
进行安装:yarn add rollup-plugin-visualizer -D
npm i rollup-plugin-visualizer -D
vite.config.js
中引入 rollup-plugin-visualizer
插件,并将其添加到插件列表中。import { visualizer } from 'rollup-plugin-visualizer';
export default defineConfig({
plugins: [
vue(),
visualizer({
open: true, //在默认用户代理中打开生成的文件
gzipSize: true, // 收集 gzip 大小并将其显示
brotliSize: true, // 收集 brotli 大小并将其显示
filename: "stats.html", // 分析图生成的文件名
}),
})
配置的参数有很多是默认的,如果你没有特殊需求,完全可以不添加参数;下面我添加一个表格对已有参数进行诠释:
参数 | 类型 | 解释 |
---|---|---|
filename/file | string | 生成分析的文件名 |
title | string | html标签页标题 |
open | boolean | 以默认服务器代理打开文件 |
template | string | 可选择的图表类型 |
gzipSize | boolean | 搜集gzip压缩包的大小到图表 |
BrotliSize | boolearn | 搜集brotli压缩包的大小到图表 |
emitFile | boolean | 使用emitFile生成文件,简单说,这个属性为true,打包后的分析文件会出现在打包好的文件包下,否则就会在项目目录下 |
sourcemap | boolean | 使用sourcemap计算大小 |
projectRoot | string, RegExp | 文件的根目录,默认在打包好的目录下 |
npm run build
命令后等待片刻,生成分析视图,视图会自动跳出来,并保存在项目根目录下,文件名就是刚刚参数filename
的名字(stats.htm
l)npm run build
stats.html
的文件,这就是生成的可视化报告。stats.html
文件,你将看到一个交互式的可视化图表,显示了打包文件中各个模块的大小、依赖关系等信息。你可以通过这个图表来识别哪些模块占用了较大的空间,从而进行代码优化。路由懒加载的实现方式通常是使用动态导入(
Dynamic Import
)语法,比如在Vue
项目中使用import()
来导入需要懒加载的组件。当用户访问到对应的路由时,该组件才会被异步加载,实现了按需加载的效果。
export const constantRoute = [
{
path: '/login',
component: () => import('@/views/login/index.vue'),
name: 'Login',
meta: {
title: '登录', //菜单标题
hidden: true, //代表路由标题在菜单中是否隐藏 true:隐藏 false:不隐藏
icon: 'Promotion',
},
},
{
path: '/',
component: () => import('@/layout/index.vue'),
name: '/',
meta: {
title: '',
hidden: false,
},
redirect: '/home',
children: [{
path: '/home',
component: () => import('@/views/home/index.vue'),
meta: {
title: '项目总览',
hidden: false,
icon: 'HomeFilled',
},
},],
},
{
path: '/user',
component: () => import('@/views/user/index.vue'),
name: 'User',
meta: {
title: '个人中心',
hidden: true,
},
},
{
path: '/404',
component: () => import('@/views/404/index.vue'),
name: '404',
meta: {
title: '找不到数据',
hidden: true,
},
},
]
在项目中可根据需要引入第三方库
CDN
,使用CDN
引入第三方库可以提高项目的性能和开发效率,减少项目的体积,同时也可以减轻服务器的负担,提高用户体验。
npm install vite-plugin-cdn-import -D
yarn add vite-plugin-cdn-import -D
vite.config.js
中进行配置import { defineConfig } from 'vite';
import compression from 'vite-plugin-compression';
export default defineConfig({
// 其他配置项...
plugins: [
// 其他插件...
// 第三方库CDN引入
importToCDN({
prodUrl: "https://unpkg.com/{name}@{path}",
modules: [
autoComplete('vue'),
autoComplete('axios'),
{
name: "vue-router",
var: "VueRouter",
path: "4.1.3",
},
{
name: "element-plus",
var: "ElementPlus",
path: "2.2.14",
css: "2.2.14/dist/index.css",
},
{
name: "@element-plus/icons-vue",
var: "ElementPlusIconsVue", // 根据main.js中定义的来
path: "2.0.9",
},
{
name: "pinia",
var: "Pinia",
path: "2.0.34",
},
{
name: "lodash",
var: "Lodash",
path: "4.17.21",
},
],
}),
],
});
gzip
压缩是一种常用的数据压缩算法,它可以减小文件的大小,从而减少文件的传输时间和占用空间。gzip
压缩算法基于DEFLATE
算法,使用了哈夫曼编码和LZ77
算法来实现高效的数据压缩。
当使用gzip
压缩文件时,文件会被转换为一种经过压缩和编码的格式。这种格式可以通过减少冗余数据和使用更紧凑的编码方式来降低文件的大小。压缩后的文件通常以.gz
为扩展名。
yarn add vite-plugin-compression -D
npm i vite-plugin-compression -D
vite.config.js
中进行配置import { defineConfig } from 'vite';
import compression from 'vite-plugin-compression';
export default defineConfig({
// 其他配置项...
plugins: [
// 其他插件...
compression({
algorithm: "gzip", // 指定压缩算法为gzip,[ 'gzip' , 'brotliCompress' ,'deflate' , 'deflateRaw']
ext: ".gz", // 指定压缩后的文件扩展名为.gz
threshold: 10240, // 仅对文件大小大于threshold的文件进行压缩,默认为10KB
deleteOriginFile: false, // 是否删除原始文件,默认为false
filter: /\.(js|css|json|html|ico|svg)(\?.*)?$/i, // 匹配要压缩的文件的正则表达式,默认为匹配.js、.css、.json、.html、.ico和.svg文件
compressionOptions: { level: 9 }, // 指定gzip压缩级别,默认为9(最高级别)
verbose: true, //是否在控制台输出压缩结果
disable: false, //是否禁用插件
}),
],
});
对于一些较大的第三方库,如
Element UI
或Ant Design
,可以考虑按需引入组件或样式,而不是全部引入。按需引入组件或样式可以参考这些第三方库的官方文档,在里面有介绍如何按需引入组件或样式。
treeshaking
也被称为 “摇树优化”。简单来讲,就是在保证代码运行结果不变的前提下,去除无用的代码。Vue3
中,许多ApI
的引入都支持treeshaking
优化。也就是说只打包你用到的API
,忽略那些没有用到的。
Vue3
会默认使用 Rollup
进行 treeshaking
,不需要额外进行配置。但有一个条件,必须是 ES6 module
模块才行。
vite 4.X
版本已经不集成 terser
,需要自行下载。yarn add terser -D
npm i terser -D
vite.config.js
中进行配置import { defineConfig } from "vite";
export default defineConfig({
build: {
minify: 'terser', // 启用 terser 压缩
terserOptions: {
compress: {
pure_funcs: ['console.log'], // 只删除 console.log
//drop_console: true, // 删除所有 console
drop_debugger: true, // 删除 debugger
}
}
}
})
默认情况下,浏览器重复请求相同名称的静态资源时,会直接使用缓存的资源。利用这个机制我们可以将不会经常更新的代码单独打包成一个
JS
文件,这样就可以减少HTTP
请求,同时降低服务器压力。
manualChunks自定义分割
// vite.config.js
import { defineConfig } from 'vite'
export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks: id => {
// 将 node_modules 中的代码单独打包成一个 JS 文件
if(id.includes('node_modules')) {
return 'vendor'
}
}
}
}
}
})
可以看到依赖模块已经单独生成一个 JS
文件了。这样我们即使修改了 main.js
中的代码重新打包,依赖文件 vendor.b3aecacd.js
也不会发生变化的,对于这个文件,浏览器也不会再次发起请求。如果依赖模块很多的话,性能将会有很大的提升。
根据项目对清晰度的要求,我们可以使用 vite-plugin-imagemin
插件,对图片进行适当压缩:
npm i vite-plugin-imagemin -D
插件vite.config.js
中进行配置// vite.config.js
import { defineConfig } from 'vite'
import viteImagemin from 'vite-plugin-imagemin'
export default defineConfig({
plugins: [
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
}
]
}
})
]
})
注意:viteImagemin
在国内比较难安装,容易出现报错,可以尝试一下下面几种解决方案。
viteImagemin
报错
yarn
在 package.json
内配置(推荐)"resolutions": {
"bin-wrapper": "npm:bin-wrapper-china"
}
npm
,在电脑 host
文件加上如下配置即可199.232.4.133 raw.githubusercontent.com
cnpm
安装(不推荐)