1分钟了解 Tree-shaking

待我称王封你为后i 2023-07-25 12:43 17阅读 0赞

1分钟了解 Tree-shaking

        1. 概念
        1. 原理
        1. 对比

1. 概念

Tree-shaking 中文译为摇晃之后的树,用在 webpack 打包中。其功能是移除 JavaScript 上下文中未引用的代码。比如在项目中引用了一个模块 antd 。但其实只使用到了 Button 组件、Input 组件、Form 组件等。那么 webpack 在打包后会消除掉以上组件之外的其他 antd 组件。从而减小打包体积,以此达到性能优化的目的。

新的 webpack 4 正式版本拓展了这个检测的功能。

2. 原理

Tree-shaking 的消除原理是依赖于 ES6 模块系统中的静态结构特性。即 import 和 export。

ES6 模块的特点:

  1. 只能作为模块顶层的语句出现。
  2. import 的模块名只能是字符串常量。
  3. import binding 是 immutable(不可变的) 的。

在 webpack 中使用 Tree-shaking 的三步:

  1. 找到未使用的代码
    模块必须使用 ES6 的 import 导入 和 export 导出,以此找出未使用的代码。
  2. 标记无副作用
    通过 package.json 的 sideEffects 属性来标记为”无副作用”,可以安全地删除。也可以在 module.rules 配置选项 中设置 “sideEffects”。

    {
    “name”: “your-project”,
    “sideEffects”: false
    }

  3. 安全删除
    引入一个能够删除未引用代码(dead code)的压缩工具(minifier)(例如 UglifyJSPlugin)。 从 webpack 4 开始,也可以通过 “mode” 配置选项轻松切换到压缩输出,只需设置为 “production”。也可以在命令行接口中使用 --optimize-minimize 标记来使用 UglifyJSPlugin。

webpack.config.js

  1. const path = require('path');
  2. module.exports = {
  3. entry: './src/index.js',
  4. output: {
  5. filename: 'bundle.js',
  6. path: path.resolve(__dirname, 'dist')
  7. },
  8. mode: "production"
  9. };

3. 对比

DCE(dead code elimination)译为消除无用代码。其原理是通过编译器判断某些代码根本不影响输出,所以将其消除掉。
Tree-shaking 是 DCE 的一种实现。两者实现的方法又有些不同。DCE 旨在消除不可能执行的代码。而 Tree-shaking 是消除没有用到的代码。

DCE 消除大法:

  1. 代码不会被执行。
  2. 代码执行的结果不会被用到。
  3. 代码只会影响死变量(只读不写)。

例1:

  1. function a(){
  2. return 10;
  3. let x = 30;
  4. return x;
  5. }

以上 a 函数中 return10 之后不会再执行后面的代码,所以会被消除。

例2:

  1. function b(){
  2. let x = 30;
  3. if(false){
  4. x = 100;
  5. };
  6. return x;
  7. }

以上 b 函数中 if(false) 永远不会满足条件,即该片段也不会执行,所以会被消除。

Tree-shaking 消除大法:

  1. 只能处理函数和顶层的 import/expor 变量,不能消除没用到的类的方法。
  2. Javascript 动态语言的特性使得静态分析比较困难。
  3. 如果静态分析的时候删除某些方法,程序运行时就可能报错,那就本末倒置了。

传统编译型语言中都是由编译器将 dead code 从 AST (抽象语法树)中删除。我们都知道 JavaScript 不是编译型语言,所以一般是由 uglify 插件来完成 Javascript 的 DCE。

发表评论

表情:
评论列表 (有 0 条评论,17人围观)

还没有评论,来说两句吧...

相关阅读