你应该知道webpack的这13个常用优化技巧
前言
现目前,前端开发使用打包工具更多的还是webpack
,再加上不管是通过vue-cli
、vite
、create-react-app
来生成Vue
项目还是React
项目,这些脚手架都已经将webpack
打包工具集成进去了。这对于我们开发者来说省去很多时间去单独配置webpack
,但是有时候也需要去额外配置一些工具,使得集成的webpack
更加便捷快速,所以这次就给你们来点狠货,分享一些webpack
的优化技巧。
无论是日常开发还是面试,都应该掌握一些webpack
的优化技巧,总之你来看了这篇文章是不会吃亏的,反而会让你在今后的工作中得心应手。
下面,就来开始我们的表演→
webpack优化技巧
在接下来的介绍中,将从优化速度、压缩打包文件大小和用户体验这3
个方面来分享一些常用的技巧,抓稳扶手,马上开车啦~
一、优化速度
1.1 线程加载器
多线程可以提高程序的效率,在webpack
中,就可以使用thread-loader
来启用多线程的加载器。
安装:
npm i thread-loader -D
配置:
{
test: /.js$/,
use: [
'thread-loader',
'babel-loader'
]
}
1.2 缓存加载器
多次构建项目,为了加快后续的构建,可以使用cache-loader
来启用缓存的加载器。
安装:
npm i cache-loader -D
配置:
{
test: /.js$/,
use: [
'cache-loader',
'thread-loader',
'babel-loader'
],
}
1.3 热更新
热更新可能是我们开发中最能深切体会的一个配置了。当我们在项目中修改了一个文件时,保存之后就可以在浏览器看到修改后的实时效果。而这得益于webpack
会重新构建整个项目,但这并不是必须的,而我们只需要重新编译修改的文件即可,这样效率就会更高了。
Webpack
内置了Hot update
插件,我们只需要在配置中开启Hot update
即可。
配置:
const webpack = require('webpack'); // 导入即可
{
plugins: [
new webpack.HotModuleReplacementPlugin()
],
devServer: {
hot: true
}
}
1.4 exclude&include
在项目中,有一些文件是不需要参与打包的,所以可以在配置时指定某些文件不参与构建,防止webpack取回它,从而提高编译效率。当然,也可以指定某些文件需要编译。那就可以使用exclude&include
来进行配置,如下:
exclude
: 不需要编译的文件include
: 需要编译的文件
配置:
{
test: /.js$/,
include: path.resolve(__dirname, '../src'),
exclude: /node_modules/,
use: [
'babel-loader'
]
}
二、压缩打包文件大小
2.1 压缩CSS代码
压缩和去重CSS
代码使用的是css-minimizer-webpack-plugin
插件。
安装:
npm i css-minimizer-webpack-plugin -D
配置:
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); // 导入插件
// 配置
optimization: {
minimizer: [
new CssMinimizerPlugin(),
],
}
2.2 压缩JS代码
terser-webpack-plugin
可以压缩和去重JavaScript
代码。
安装:
npm i terser-webpack-plugin -D
配置:
const TerserPlugin = require('terser-webpack-plugin'); // 导入插件
// 配置
optimization: {
minimizer: [
new CssMinimizerPlugin(), // 压缩CSS的
new TerserPlugin({
terserOptions: {
compress: {
drop_console: true, // 去掉console打印
},
},
}),
],
}
2.3 tree-shaking
tree-shaking
只编译实际用到的代码,不编译项目中没有用到的代码。
在Webpack
中,默认情况下会启用tree-shaking
,只需要确保在最终编译时使用生产模式。
module.exports = {
mode: 'production'
}
2.4 source-map
当代码出现bug
时,source-map
可以快速定位到源代码的位置,但是这个文件很大。所以为了平衡性能和准确性,在开发模式下生成准确(但更大)的source-map
;在生产模式下生成更小(但不那么准确)的源映射。
开发模式:
module.exports = {
mode: 'development',
devtool: 'eval-cheap-module-source-map'
}
生产方式:
module.exports = {
mode: 'production',
devtool: 'nosources-source-map'
}
2.5 bundle analyzer
使用webpack-bundle-analyzer
来查看打包后的bundle
文件的体积,从而有针对性的进行相应的体积优化。
安装:
npm i webpack-bundle-analyzer -D
配置:
const {BundleAnalyzerPlugin} = require('webpack-bundle-analyzer'); 、、 导入插件
// 配置
plugins: [
new BundleAnalyzerPlugin(),
]
三、用户体验
3.1 按需加载
如果模块没有按需加载,整个项目的代码会被打包成一个js
文件,导致单个js
文件体积非常大。那么当用户请求网页时,首屏的加载时间会更长。使用模块来加载后,大js
文件会被分割成多个小js
文件,加载时网页按需加载,大大提高了首屏的加载速度。
// 路由文件
const routes = [
{
path: '/index',
name: 'index',
component: () => import('../views/index/index.vue'), // 按需加载
},
]
3.2 压缩包
Gzip
是一种常用的文件压缩算法,可以提高传输效率。
安装:
npm i compression-webpack-plugin -D
配置:
const CompressionPlugin = require('compression-webpack-plugin'); // 导入插件
// 配置
plugins: [
new CompressionPlugin({
algorithm: 'gzip',
threshold: 10240,
minRatio: 0.8
})
]
3.3 base64
对于一些小图片,可以转成base64
编码,这样可以减少用户的HTTP
请求次数,提升用户体验。
配置:
{
test: /.(png|jpe?g|gif|svg|webp)$/,
type: 'asset',
parser: {
dataUrlCondition: {
maxSize: 20 * 1024, // 20kb
}
},
generator: {
filename: 'images/[contenthash][ext][query]',
},
},
3.4 配置哈希
可以将哈希添加到捆绑文件中,这样可以更轻松地处理缓存。
output: {
path: path.resolve(__dirname, '../dist'),
filename: 'js/chunk-[contenthash].js',
clean: true,
},
好了,到这里webpack
的日常优化技巧就介绍完了。上面介绍了的应该算是常规操作,应该是足以应对工作中和面试中的一些优化配置问答了。最后,希望大家看完能有所收获!
后语
小伙伴们,如果觉得本文对你有些许帮助,点个👍或者➕个关注再走呗^_^ 。另外如果本文章有问题或有不理解的部分,欢迎大家在评论区评论指出,我们一起讨论共勉。
转载自:https://juejin.cn/post/7135297659354480653