module.exports = {
optimization: {
splitChunks: {
chunks: 'async', // 值有 all,async 和 initial
minSize: 20000, // ⽣成 chunk 的最⼩体积(以 bytes 为单位)。
minRemainingSize: 0,
minChunks: 1, // 拆分前必须共享模块的最⼩ chunks 数。
maxAsyncRequests: 30, // 按需加载时的最⼤并⾏请求数。
maxInitialRequests: 30, // ⼊⼝点的最⼤并⾏请求数。
enforceSizeThreshold: 50000,
cacheGroups: {
defaultVendors: {
test: /[\/]node_modules[\/]/, //第三⽅模块拆出来
priority: -10,
reuseExistingChunk: true,
},
util.vendors: {
test: /[\/]utils[\/]/, //公共模块拆出来
minChunks: 2,
priority: -20,
reuseExistingChunk: true,
},
},
},
},
}
tree shaking
tree shaking
在⽣产模式下已经默认开启了
只是需要注意下⾯⼏点:
1. 只对 ESM ⽣效
2. 只能是静态声明和引⽤的 ES6 模块,不能是动态引⼊和声明的。
3. 只能处理模块级别,不能处理函数级别的冗余。
4. 只能处理 JS 相关冗余代码,不能处理 CSS 冗余代码。
⽽可能样式⽂件⾥⾯有些代码我们也没有使⽤,我们可以通过
purgecss-webpack-plugin
插件
来对 css 进⾏ tree shaking
const path = require("path");
const PurgecssPlugin = require("purgecss-webpack-plugin");
const glob = require("glob"); // ⽂件匹配模式
module.exports = {//...
plugins: [
...new PurgeCSSPlugin({
paths: glob.sync(`${PATH.src}/**/*`, { nodir: true }),
})
],
};
gzip
前端除了在打包的时候将⽆⽤的代码或者
console
、注释剔除之外。我们还可以使⽤
Gzip
对资
源进⾏进⼀步压缩。那么浏览器和服务端是如何通信来⽀持
Gzip
呢?
1. 当⽤⼾访问 web 站点的时候,会在 request header 中设置 accept-encoding:gzip ,表明浏览器是否⽀持 Gzip 。
2. 服务器在收到请求后,判断如果需要返回 Gzip 压缩后的⽂件那么服务器就会先将我们的
JS\CSS 等其他资源⽂件进⾏ Gzip 压缩后再传输到客⼾端,同时将 response headers设置 content-encoding:gzip 。反之,则返回源⽂件。
3. 浏览器在接收到服务器返回的⽂件后,判断服务端返回的内容是否为压缩过的内容,是的话则进⾏解压操作。⼀般情况下我们并不会让服务器实时 Gzip 压缩,⽽是利⽤ webpack 提前将静态资源进⾏ Gzip 压缩,然后将 Gzip 资源放到服务器,当请求需要的时候直接将 Gzip 资源发送给客⼾端。 我们只需要安装 compression-webpack-plugin 并在 plugins 配置就可以了
const CompressionWebpackPlugin = require("compression-webpack-plugin");
// 需要安装
module.exports = {
plugins: [new CompressionWebpackPlugin()]
}
作⽤域提升
Scope Hoisting
可以让
webpack
打包出来的代码⽂件体积更⼩,运⾏更快。在开启 Scope Hoisting
后,构建后的代码会按照引⼊顺序放到⼀个函数作⽤域⾥,通过适当重命名某些变量以防⽌变量名冲突,从⽽减少函数声明和内存花销。需要注意: Scope Hoisting
需要分析模块之间的依赖关系,所以源码必须采⽤ ES6 模块化语法Scope Hoisting 是 webpack 内置功能,只需要在
plugins
⾥⾯使⽤即可,或者直接开启⽣产环境也可以让作⽤域提升⽣效。
module.exports = {
//⽅式1
mode: 'production',
//⽅式2
plugins: [// 开启 Scope Hoisting 功能new
webpack.optimize.ModuleConcatenationPlugin()
]
}