Tree Shaking
开发时我们定义了一些工具函数库,或者引用第三方工具函数库或组件库。
如果没有特殊处理的话我们打包时会引入整个库,但是实际上可能我们可能只用上极小部分的功能。
这样将整个库都打包进来,体积就太大了。
Tree Shaking 是一个术语,通常用于描述移除 JavaScript 中的没有使用上的代码。引入用得上的功能,没有用到的代码是不会被打包进入的。
它依赖 ES Module。
使用
Webpack5 已经默认开启了这个功能,无需其他配置。
减少 Babel 的体积
Babel 为编译的每个文件都插入了辅助代码,使代码体积过大。
Babel 对一些公共方法使用了非常小的辅助代码,比如_extend
,默认情况下会被添加到每一个需要它的文件中。
我们可以将这些辅助代码作为一个独立模块,来避免重复引入。
@babel/plugin-transform-runtime: 禁用了 Babel 自动对每个文件的 runtime 注入,而是引入 @babel/plugin-transform-runtime 并且使所有辅助代码从这里引用。
npm i @babel/plugin-transform-runtime -D
{
test: /\.js$/,
// exclude: /node_modules/, // 排除node_modules代码不编译
include: path.resolve(__dirname, '../src'),
use: [
{
loader: 'thread-loader',//开启多进程
options: {
workers: threads //数量
}
},
{
loader: "babel-loader",
options: {
cacheDirectory: true,// 开启babel编译缓存
cacheCompression: false, // 缓存文件不要压缩
plugins: ['@babel/plugin-transform-runtime']//减少代码体积
}
}
]
},
Image Minimizer
开发如果项目中引用了较多图片,那么图片体积会比较大,将来请求速度比较慢。
我们可以对图片进行压缩,减少图片体积。
如果项目中图片都是在线链接,那么就不需要了。本地项目静态图片才需要进行压缩。
使用
image-minimizer-webpack-plugin
: 用来压缩图片的插件。
npm i image-minimizer-webpack-plugin imagemin -D
还有剩下包需要下载,有两种模式:
- 无损压缩:对文件本身的压缩,和其它数据文件的压缩一样,是对文件的数据存储方式进行优化,采用某种算法表示重复的数据信息,文件可以完全还原,不会影响文件内容,对于数码图像而言,也就不会使图像细节有任何损失。
安装命令npm install imagemin-gifsicle imagemin-jpegtran imagemin-optipng imagemin-svgo -D
- 有损压缩:对图像本身的改变,在保存图像时保留了较多的亮度信息,而将色相和色纯度的信息和周围的像素进行合并,合并的比例不同,压缩的比例也不同,由于信息量减少了,所以压缩比可以很高,图像质量也会相应的下降。
安装命令npm install imagemin-gifsicle imagemin-mozjpeg imagemin-pngquant imagemin-svgo -D
如果包下载失败,可以使用 cnpm 进行下载。
配置
以无损压缩配置为例,修改 config/webpack.prod.js
const ImageMinimizerPlugin = require("image-minimizer-webpack-plugin");
...
optimization: {
minimize: true,
minimizer: [
// css压缩
new CssMinimizerPlugin(),
// 当生产模式会默认开启TerserPlugin,但是我们需要进行其他配置,就要重新写了
new TerserPlugin({
parallel: threads // 开启多进程
}),
// 压缩图片
new ImageMinimizerPlugin({
minimizer: {
implementation: ImageMinimizerPlugin.imageminGenerate,
options: {
plugins: [
["gifsicle", { interlaced: true }],
["jpegtran", { progressive: true }],
["optipng", { optimizationLevel: 5 }],
[
"svgo",
{
plugins: [
"preset-default",
"prefixIds",
{
name: "sortAttrs",
params: {
xmlnsOrder: "alphabetical",
},
},
],
},
],
],
},
},
}),
]
},
执行 npm run build
,对比 dist/images 下图片大小。