Tree Shaking 能移除未使用代码,但要求 ES6 模块语法、无副作用、按需导入且构建工具正确配置;CommonJS、默认导出对象、顶层执行、全局修改等均会阻碍摇树。

Tree Shaking 能移除未使用的代码,但前提是模块必须是 ES6 静态导入导出,且算法模块本身不能有副作用(如直接执行、修改全局、调用 console 或 DOM 操作等)。复杂算法模块若写法不当,即使没被调用,也可能无法被摇掉。
确保使用 ES6 模块语法
CommonJS(require/module.exports)不支持静态分析,Tree Shaking 无效。必须改用 import/export:
- ✅ 正确:算法模块写成
export function quickSort()、export const MERGE_THRESHOLD = 16 - ❌ 错误:用
module.exports = { quickSort }或export default { quickSort }(默认导出对象会阻碍摇树) - 建议每个算法函数单独导出,避免聚合对象导出,例如不要写
export default { quickSort, mergeSort }
避免模块级副作用
Webpack 和 Rollup 会将含副作用的模块整体保留。复杂算法模块中常见陷阱包括:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 顶层执行代码(如直接调用
initCache()或console.log('algo loaded')) - 修改全局变量或原型(如
Array.prototype.fastSort = ...) - 动态 require 或
eval、new Function等无法静态分析的逻辑 - 解决方法:把初始化逻辑移到函数内部,或用
/*#__PURE__*/标记无副作用调用(慎用)
按需导入,不批量解构
即使模块本身可摇,错误的导入方式也会“激活”整个模块:
立即学习“Java免费学习笔记(深入)”;
- ❌ 危险:
import * as algo from './algorithms.js'或import { quickSort, mergeSort } from './algorithms.js'(哪怕只用其中一个,也可能因模块结构导致另一个也被保留) - ✅ 推荐:
import { quickSort } from './algorithms.js'—— 仅导入实际需要的成员 - 更稳妥:拆分模块,每个算法独立文件(
quickSort.js、mergeSort.js),按需导入单个文件
配置构建工具启用严格摇树
确保打包器识别并执行 Tree Shaking:
- Webpack:设
mode: 'production'(自动开启optimization.usedExports: true和sideEffects: false) - Rollup:默认激进摇树,但需在
package.json中声明"sideEffects": false(或精确列出有副作用的文件,如["*.css"]) - 确认算法模块所在路径未被
sideEffects配置意外包含(例如误把.js文件列入副作用列表)

















