# tree shaking

tree shaking 是一个术语,通常用于描述移除 javascript 上下文中的未引用代码(dead-code)

新的 webpack 4 正式版本,扩展了这个检测能力,通过 package.json 的 "sideEffects" 属性作为标记,向 compiler 提供提示,表明项目中的哪些文件是 "pure(纯的 ES2015 模块)",由此可以安全地删除文件中未使用的部分。

# 1. 将文件标记为无副作用(side-effect-free)

# - package.json

{
  "name": "your-project",
  "sideEffects": false
}
1
2
3
4

如果你的代码确实有一些副作用,那么可以改为提供一个数组:

{
  "name": "your-project",
  "sideEffects": [
    // 支持相关文件的相对路径、绝对路径和 glob 模式
    "./src/some-side-effectful-file.js"
  ]
}
1
2
3
4
5
6
7
注意,任何导入的文件都会受到 tree shaking 的影响。这意味着,如果在项目中使用类似 css-loader 并导入 CSS 文件,则需要将其添加到 side effect 列表中,以免在生产模式中无意中将它删除:
{
  "name": "your-project",
  "sideEffects": ["./src/some-side-effectful-file.js", "*.css"]
}
1
2
3
4

还可以在 module.rules 配置选项 中设置 "sideEffects"

module.rules: [
  {
    include: path.resolve("node_modules", "lodash"),
    sideEffects: false
  }
  // 或者这样写
  sideEffects: {
    "./x": false,
    "./y": true
  }
]
1
2
3
4
5
6
7
8
9
10
11

# 2. 压缩输出

从 webpack 4 开始,也可以通过 "mode" 配置选项轻松切换到压缩输出,只需设置为 "production"。



 


module.exports = {
  entry: "./src/index.js",
  mode: "production",
};
1
2
3
4

注意,也可以在命令行接口中使用 --optimize-minimize 标记,来使用 UglifyJSPlugin。 也就是在package.json 中的 script中使用 --optimize-minimize 可以使用 UglifyJSPlugin。 也就是没有被使用的代码会被移除

以上描述也可以通过命令行实现。例如,--optimize-minimize 标记将在后台引用 UglifyJSPlugin。和以上描述的 DefinePlugin 实例相同,--define process.env.NODE_ENV="'production'" 也会做同样的事情。并且,webpack -p 将自动地调用上述这些标记,从而调用需要引入的插件。

Last Updated: 4/6/2023, 11:06:38 PM