Treesharking的原理

文章类型:webpack

发布者:hp

发布时间:2023-04-20

一:是什么

Tree-Shaking 是一种基于 ES Module 规范的 Dead Code Elimination 技术,

它会在运行过程中静态分析模块之间的导入导出,确定 ESM 模块中哪些导出值未曾其它模块使用,并将其删除,以此实现打包产物的优化。

二:实现原理

是先标记出模块导出值中哪些没有被用过,然后使用 Terser 删掉这些没被用到的导出语句,主要是利用AST抽象语法树做dead code(死码)分析

1:Make 阶段,收集模块导出变量并记录到模块依赖关系图 ModuleGraph 变量中

1:Seal 阶段,遍历 ModuleGraph 标记模块导出变量有没有被使用

3:生成产物时,若变量没有被其它模块使用则删除对应的导出语句

特征:

1:代码不会被执行,不可到达

2:代码执行的结果不会被用到

3:代码只会影响死变量(只写不读)

三:webpack中

先收集模块间的导入导出关系保存到 ModuleGraph 中,遍历 ModuleGraph 标记模块中哪些导出值没有被使用,打包前将没有使用的导出值的导出语句删除,从而减小打包体积

1:从ES6顶层模块开始分析,可以清除未使用的模块,

2:会对多层调用的模块进行重构,提取其中的代码,简化函数的调用结构

3:不会清除IIFE(立即调用函数表达式)

4:对于IIFE的返回函数,如果未使用会被清除

配置条件:

1:使用 ESM 规范编写模块代码

2:配置 optimization.usedExports 为 true,启动标记功能

3:启动代码优化功能


配置 mode = production
配置 optimization.minimize = true
提供 optimization.minimizer 数组

// webpack.config.js
module.exports = {
entry: "./src/index",
mode: "production",
devtool: false,
optimization: {
usedExports: true,
},
};