本文详细解析Webpack在构建速度与打包体积两方面的核心优化策略。涵盖thread-loader、cache-loader、HMR等加速手段,以及CSS/JS压缩、Tree-shaking、Gzip、懒加载和Hash配置等体积控制技巧,帮助前端工程师提升开发体验与线上性能。
Webpack优化在项目中具有必要性。
前文介绍了Vue CLI的基础搭建,但未涉及后续的性能优化环节。
无论是面试还是实际开发,webpack优化都是前端工程师必须掌握的核心技能,旨在提升用户体验。
构建时间优化
首先关注构建速度的提升。
thread-loader
通过多进程打包显著加快构建速度。配置方法是将thread-loader置于耗时较长的loader(如babel-loader)之前。
因启动与打包均需加速,该配置写入webpack.base.js。
npm i thread-loader -D
// webpack.base.js
{
test: /\.js$/,
use: [
'thread-loader',
'babel-loader'
],
}
}
cache-loader
利用缓存机制提升二次构建速度。配置时,将cache-loader置于耗时loader(如babel-loader)之前。
同样因启动与打包均需加速,该配置写入webpack.base.js。
npm i cache-loader -D
// webpack.base.js
{
test: /\.js$/,
use: [
'cache-loader',
'thread-loader',
'babel-loader'
],
},
开启热更新
传统模式下修改文件会导致全量刷新,耗时较长。启用热更新后,仅刷新修改模块,其余保持原状,大幅缩短重新构建时间。
该功能仅用于开发阶段,配置写入webpack.dev.js。
// webpack.dev.js
//引入webpack
const webpack = require('webpack');
//使用webpack提供的热更新插件
plugins: [
new webpack.HotModuleReplacementPlugin()
],
//最后需要在我们的devserver中配置
devServer: {
+ hot: true
},
exclude & include
exclude用于排除无需处理的文件。
include用于指定需要处理的文件。
合理配置这两个属性可显著提升构建速度。
配置写入webpack.base.js。
// webpack.base.js
{
test: /\.js$/,
//使用include来指定编译文件夹
include: path.resolve(__dirname, '../src'),
//使用exclude排除指定文件夹
exclude: /node_modules/,
use: [
'babel-loader'
]
},
构建区分环境
明确区分开发与生产环境的配置至关重要。开发环境侧重构建速度,生产环境侧重最终体积:
- 开发环境:移除代码压缩、gzip及体积分析等耗时优化配置,以大幅提升构建速度。
- 生产环境:启用代码压缩、gzip及体积分析等优化配置,以大幅降低最终打包体积。
前文已演示如何进行环境区分。
提升webpack版本
Webpack版本越新,打包效果通常越好。
打包体积优化
重点优化打包后的项目整体体积,以提升上线后的页面加载速度。
本项目已采用Webpack最新版本。
CSS代码压缩
使用css-minimizer-webpack-plugin进行CSS压缩,效果包括压缩与去重。
因压缩耗时,仅在生产打包时使用,配置写入webpack.prod.js。
npm i css-minimizer-webpack-plugin -D
// webpack.prod.js
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')
optimization: {
minimizer: [
new CssMinimizerPlugin(), // 去重压缩css
],
}
JS代码压缩
使用terser-webpack-plugin实现打包后JS代码的压缩。
因压缩耗时,仅在生产打包时使用,配置写入webpack.prod.js。
npm i terser-webpack-plugin -D
// webpack.prod.js
const TerserPlugin = require('terser-webpack-plugin')
optimization: {
minimizer: [
new CssMinimizerPlugin(), // 去重压缩css
new TerserPlugin({ // 压缩JS代码
terserOptions: {
compress: {
drop_console: true, // 去除console
},
},
}), // 压缩JavaScript
],
}
tree-shaking
tree-shaking的作用是仅打包被引用的代码,未使用的代码不予打包。webpack5默认开启tree-shaking,当mode设置为production时,自动启用tree-shaking进行优化。
module.exports = {
mode: 'production'
}
source-map类型
source-map用于在报错时精准定位错误代码位置。因其占用体积较大,针对不同环境设置不同类别十分必要。
- 开发环境
开发阶段需精准定位错误代码位置。
// webpack.dev.js
module.exports = {
mode: 'development',
devtool: 'eval-cheap-module-source-map'
}
- 生产环境
生产阶段希望启用source-map,但为避免体积过大,可更换为其他类型。
// webpack.prod.js
module.exports = {
mode: 'production',
devtool: 'nosources-source-map'
}
打包体积分析
使用webpack-bundle-analyzer审查打包后的体积分布,进而实施相应的体积优化。
仅在打包时查看体积,配置写入webpack.prod.js。
npm i webpack-bundle-analyzer -D
// webpack.prod.js
const {
BundleAnalyzerPlugin
} = require('webpack-bundle-analyzer')
plugins: [
new BundleAnalyzerPlugin(),
]
用户体验优化
模块懒加载
若不进行模块懒加载,整个项目代码将打包至单个JS文件,导致文件体积巨大,首屏加载时间较长。启用模块懒加载后,大JS文件被拆分为多个小文件,按需加载,显著提升首屏加载速度。
// src/router/index.js
const routes = [
{
path: '/login',
name: 'login',
component: login
},
{
path: '/home',
name: 'home',
// 懒加载
component: () => import('../views/home/home.vue'),
},
]
Gzip
启用Gzip可大幅提升页面加载速度,因为Gzip压缩后的体积远小于原文件。这需要后端配合,使用compression-webpack-plugin。
仅在打包时优化体积,配置写入webpack.prod.js。
npm i compression-webpack-plugin -D
// webpack.prod.js
const CompressionPlugin = require('compression-webpack-plugin')
plugins: [
// 之前的代码...
// gzip
new CompressionPlugin({
algorithm: 'gzip',
threshold: 10240,
minRatio: 0.8
})
]
小图片转base64
小图片转换为base64编码,可减少HTTP网络请求次数,提升用户体验。webpack5中的url-loader已被废弃,改用asset-module。
配置写入webpack.base.js。
// webpack.base.js
{
test: /\.(png|jpe?g|gif|svg|webp)$/,
type: 'asset',
parser: {
// 转base64的条件
dataUrlCondition: {
maxSize: 25 * 1024, // 25kb
}
},
generator: {
// 打包到 image 文件下
filename: 'images/[contenthash][ext][query]',
},
},
合理配置hash
确保修改过的文件更新hash值,未修改的文件保持原hash值。这样上线后,浏览器访问未改变的文件时可命中缓存,实现性能优化。
配置写入webpack.base.js。
// webpack.base.js
output: {
path: path.resolve(__dirname, '../dist'),
// 给js文件加上 contenthash
filename: 'js/chunk-[contenthash].js',
clean: true,
},以上为前端必会的Webpack优化技巧的详细内容,更多关于前端Webpack优化技巧的资料请关注本站其它相关文章!