纯函数需满足不依赖外部可变状态且不产生外部影响;模块须无顶层执行逻辑,并通过sideEffects字段或/*#__PURE__*/注释声明无副作用,才能被Tree Shaking安全剔除。

纯函数本身不能被“标记”为纯,但你可以通过代码组织、构建配置和调用方式,让打包工具(如 Webpack、Rollup)安全地判定其无副作用,从而在 Tree Shaking 过程中剔除未使用的导出。
确保函数定义本身是纯的
纯函数需满足两个基本条件:不依赖外部可变状态,也不产生外部影响(如不调用 console.log、fetch、localStorage,不修改全局变量或闭包外变量)。例如:
-
✅ 纯的:
export const add = (a, b) => a + b; -
❌ 不纯的:
export const logAdd = (a, b) => { console.log('adding'); return a + b; };(含副作用,会被保留)
在模块层面声明无副作用
即使函数是纯的,整个模块若在顶层执行了任何操作(比如直接调用函数、赋值全局变量),打包工具仍会认为它有副作用而整块保留。因此:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 模块文件(如 math.js)中只写 export 语句,不写任何执行逻辑
- 在 package.json 中设置:
"sideEffects": false(全局声明)或更精准地写:"sideEffects": ["./src/utils/logger.js"](仅列出真正有副作用的路径)
显式标注调用为 pure(针对 Rollup 或 Terser)
某些构建流程支持在调用处加注释或配置,提示该调用可被安全移除:
立即学习“Java免费学习笔记(深入)”;
- Rollup 可配合 rollup-plugin-pure,自动为
trackEvent()等函数添加/*#__PURE__*/注释 - 手动添加注释也有效:
/*#__PURE__*/ trackPageView();,Terser 在压缩阶段会识别并删除整行(前提是该调用未被任何路径引用) - Webpack 5+ 默认识别该注释,无需额外插件
避免破坏静态分析的写法
以下操作会让打包工具无法确认函数是否纯,进而放弃摇树:
- 用 eval、Function 构造器或 with 包裹函数调用
- 间接引用:如
window['track']()、obj[methodName]() - 函数内部读取运行时环境(如
navigator.userAgent、location.href),除非这些值被编译期常量替换

















