纯函数本身不直接触发 Tree Shaking,但能显著提升摇树成功率和可靠性;它通过消除隐式依赖与运行时不确定性,降低打包工具保守判断风险,使未调用的纯函数及其副作用逻辑可被整块剔除。

纯函数本身不直接触发 Tree Shaking,但它能显著提升摇树成功的概率和可靠性。Tree Shaking 的核心是静态分析,而纯函数通过消除隐式依赖和运行时不确定性,降低了打包工具的保守判断风险。
纯函数减少副作用误判
Tree Shaking 工具(如 Webpack、Rollup)会将模块顶层存在副作用的代码视为“不可安全移除”,从而保留整个模块。纯函数把副作用(如修改全局变量、发起请求、读写 localStorage)严格限制在函数内部,且仅在被实际调用时发生。只要该函数未被引用,它连同其内部副作用逻辑都会被整块剔除。
- ✅ 安全:顶层无副作用,函数内有副作用 → 可摇
- ❌ 危险:顶层执行 fetch('/api') 或 console.log() → 整个模块被标记为有副作用,无法摇
纯函数避免隐式依赖干扰分析
非纯函数常依赖外部状态(如全局变量、模块级缓存、时间戳),这会让打包器难以确认“该函数是否可能影响其他模块”。一旦工具怀疑某个导出可能产生跨模块影响,就会保守保留——即使你没调用它。
Node.js 可靠编程技能。避免事件循环阻塞、异步陷阱、ESM 兼容问题和内存泄漏。触发词:Node.js 开发、async/await、流处理、性能优化、安全编码。
- 纯函数输入完全决定输出,无外部状态耦合 → 工具更容易判定“未调用 = 真正无用”
- 例如:export const formatDate = (ts) => new Date(ts).toISOString() 不纯(依赖 Date 构造行为);改用确定性时间格式化库或传入预计算时间对象,更利于分析
纯函数配合静态导出才真正起效
再纯的函数,如果导出方式破坏了静态可分析性,Tree Shaking 依然失效。关键不是“函数是否纯”,而是“导出是否静态、调用是否直接”。
- 必须用具名导出:export function helper() { ... } ✅
- 不能包裹在对象里:const utils = { helper }; export default utils ❌
- 调用必须明确:import { helper } from './x'; helper() ✅,而非 import * as x from './x'; x['helper']() ❌
纯函数是加分项,不是通行证
一个纯函数若被动态引用、或所在模块顶层有 console、或导出被条件控制,它照样不会被摇掉。反过来,一个非纯函数,只要满足静态导出 + 顶层无副作用 + 直接调用,同样可以被成功摇除——只是风险更高、稳定性更差。
- 纯函数的价值在于:让代码更“可预测”,让 Tree Shaking 更“敢删”
- 它解决的是工具的“信任问题”,而不是替代 ESM 静态语法这个硬性前提

















