tree-shaking
webpack4 的 production 默认开启了 treeshaking
如果是 webpack2 ,可能会不起作用,因为 babel 会将代码转化成 commonjs 模块,而 treeshaking 不支持
options:{presets:[["es2015",{module:false}]]}使用
// ./webpack.config.js
module.exports = {
// ... 其他配置项
optimization: {
// 模块只导出被使用的成员
usedExports: true,
// 尽可能合并每一个模块到一个函数中
concatenateModules: true,
// 压缩输出结果
minimize: false,
},
};副作用 side effects
side effects 是指那些当 import 的时候会执行一些动作,但是不一定会有任何 export。比如 ployfill
tree-shaking 不能自动的识别那些代码属于 side effcets 。所以,有些需要手动指定
## pagejson
{
name:'tree-shaking',
"sideEffects":false,
// sideEffects:[
// './src/common/ployfill.js'
// ]
}Webpack 4 中的 Tree Shaking 功能在使用上存在限制:只支持 ES6 类型的模块代码分析,且需要相应的依赖包或需要函数声明为无副作用等。
webpack5
Nested Tree Shaking
Webpack 5 增加了对嵌套模块的导出跟踪功能,能够找到那些嵌套在最内层而未被使用的模块属性。
Inner Module Tree Shaking
Webpack 5 中还增加了分析模块中导出项与导入项的依赖关系的功能。通过 optimization.innerGraph(生产环境下默认开启)选项,Webpack 5 可以分析特定类型导出项中对导入项的依赖关系,从而找到更多未被使用的导入模块并加以移除。
CommonJS Tree Shaking
webpack5 中增加了对部分 CommonJS 风格模块代码的静态分析功功能:
- 支持 exports.xxx、this.exports.xxx、module.exports.xxx 语法的导出分析。
- 支持 object.defineProperty(exports, “xxxx”, …) 语法的导出分析。
- 支持 require(‘xxxx’).xxx 语法的导入分析。
GitHub - webpack/changelog-v5: Temporary repo for the changelog for webpack 5