1. Webpack 配置优化
- 代码分割与优化:
- 动态导入语法调整:确保
import()
的使用合理,避免不必要的重复加载。例如,如果有多个路由组件依赖相同的基础库,可以将这些基础库通过 webpack
的 splitChunks
进行拆分。在 webpack.config.js
中配置如下:
module.exports = {
optimization: {
splitChunks: {
chunks: 'all',
minSize: 30000,
minChunks: 1,
maxAsyncRequests: 5,
maxInitialRequests: 3,
automaticNameDelimiter: '~',
name: true,
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
priority: -10
},
default: {
minChunks: 2,
priority: -20,
reuseExistingChunk: true
}
}
}
}
};
- Tree - shaking:确保项目中开启了 Tree - shaking,以去除未使用的代码。对于 ES6 模块,Webpack 会自动进行 Tree - shaking,但要注意确保代码的模块化结构良好,没有副作用的代码阻止 Tree - shaking 的进行。例如,在
package.json
中设置 "type": "module"
,并保证导入导出的模块使用 ES6 标准语法。
- 压缩与优化:
- 启用压缩插件:使用
terser - webpack - plugin
对 JavaScript 代码进行压缩,在 webpack.config.js
中配置如下:
const TerserPlugin = require('terser - webpack - plugin');
module.exports = {
optimization: {
minimizer: [
new TerserPlugin({
parallel: true,
terserOptions: {
compress: {
drop_console: true // 去除 console.log 等调试代码
}
}
})
]
}
};
- 图片优化:使用
image - webpack - loader
等插件对图片进行压缩,减少图片体积。在 webpack.config.js
中配置如下:
module.exports = {
module: {
rules: [
{
test: /\.(png|jpg|gif)$/,
use: [
{
loader: 'file - loader',
options: {
name: 'images/[name].[ext]'
}
},
{
loader: 'image - webpack - loader',
options: {
mozjpeg: {
progressive: true,
quality: 65
},
// optipng.enabled: false will disable optipng
optipng: {
enabled: false
},
pngquant: {
quality: [0.65, 0.90],
speed: 4
},
gifsicle: {
interlaced: false
},
// the webp option will enable WEBP
webp: {
quality: 75
}
}
}
]
}
]
}
};
2. 路由配置策略优化
- 减少嵌套路由深度:检查嵌套路由结构,尽量减少不必要的嵌套。过深的嵌套路由会增加组件的加载层级和复杂度。例如,如果某些嵌套路由只是为了简单的布局,可以考虑使用其他方式(如组件组合)来实现,而不是通过路由嵌套。
- 按需加载策略调整:
- 预加载部分关键路由组件:对于首屏可能用到的关键路由组件,可以使用
router - lazy - load - prefetch
等插件进行预加载。在路由配置中,可以这样设置:
const Home = () => import(/* webpackPrefetch: true */ './views/Home.vue');
const router = new VueRouter({
routes: [
{
path: '/home',
name: 'Home',
component: Home
}
]
});
- 延迟加载非关键组件:对于一些非首屏立即需要的组件,进一步延迟其加载时机。例如,某些用户操作后才会显示的路由组件,可以在路由配置中不做特殊处理,让其在用户实际访问时再加载。
- 懒加载组件的优化:
- 拆分懒加载组件:如果某些懒加载组件体积过大,可以进一步拆分这些组件。例如,将一个大的业务组件拆分成多个小的功能模块,按需加载这些小模块。
- 使用动态路由匹配:对于一些相似的路由,可以使用动态路由匹配,减少路由配置的冗余。例如:
const router = new VueRouter({
routes: [
{
path: '/user/:id',
component: UserProfile
}
]
});
3. 其他优化方面
- 服务器端渲染(SSR)或静态站点生成(SSG):
- SSR:如果项目架构允许,可以考虑采用服务器端渲染。在服务器端将首屏的 HTML 生成好返回给客户端,减少客户端的渲染压力和时间。例如使用
Nuxt.js
等框架来实现 SSR,它基于 Vue.js 并提供了一套完整的 SSR 解决方案。
- SSG:对于内容驱动的项目,静态站点生成也是一个不错的选择。在构建时生成静态 HTML 文件,用户访问时直接加载静态页面,大大提高首屏加载速度。例如使用
VuePress
等工具,适合文档类、博客类等应用。
- 缓存策略:
- 客户端缓存:在客户端使用浏览器缓存机制,对于不经常变化的资源(如静态样式文件、脚本文件等)设置较长的缓存时间。可以通过在
webpack
配置中设置 output.filename
带上哈希值,例如:output: { filename: '[name].[contenthash].js' }
,这样当文件内容变化时,哈希值改变,浏览器会重新请求新的文件,而内容未变时则从缓存中读取。
- 服务器端缓存:在服务器端设置合理的缓存策略,对于频繁请求且不经常变化的数据进行缓存。例如使用 Redis 等缓存工具来缓存数据库查询结果等,减少数据库的查询压力,间接提高首屏加载性能。