在 javascript 项目中,通过给模块文件添加 sideeffects: false 标记来告诉打包工具该文件没有副作用。具体做法是在 package.json 中配置此字段为布尔值或数组,或者在源文件顶部使用 /*#__pure__*/ 注释。这样 webpack、rollup 等工具在 tree shaking 时就能安全地移除未使用的导出代码。

如何在 package.json 中声明全局无副作用
在 package.json 的根级别设置 sideEffects 字段是最常见的做法。如果整个包的所有文件都是纯函数式且无副作用,可以将其设为 false。如果有特定文件(如样式文件或 polyfill)包含副作用,则需列出这些文件的相对路径。例如,若 style.css 有副作用但其他 JS 文件没有,配置如下:
{
"name": "my-lib",
"version": "1.0.0",
"sideEffects": ["*.css", "src/polyfill.js"]
}
当打包工具扫描到未导入 style.css 或 src/polyfill.js 时,会直接忽略它们,即使它们在包内。对于纯 JS 库,通常只需排除 CSS 和特定的入口文件。这种配置适用于整个包级别的优化,无需修改源码。
如何在单个源文件中标记局部副作用
对于更细粒度的控制,可以在具体的 JS 源文件中使用注释标记。Webpack 5 支持在文件顶部添加 /*#__PURE__*/ 注释,或者使用 ES Module 的 sideEffects 属性(需配合 Babel 插件)。更通用的方法是使用 /*#__NO_SIDE_EFFECTS__*/ 注释包裹纯函数调用。例如:
import { pureFunction } from './utils';
const result = /*#__PURE__*/ pureFunction();
export default result;
这种写法告诉打包器 pureFunction() 是纯函数,其返回值仅依赖于输入,因此如果 result 未被使用,整个表达式及其依赖都可以被移除。这种方法适合处理第三方库中混入的副作用代码,或者在构建过程中动态生成的代码片段。

Tree Shaking 对未使用导出的实际影响
当 sideEffects 正确配置后,打包工具会执行死代码消除。假设有一个工具库 utils.js 导出了多个函数,但主应用只使用了其中一个。如果 utils.js 被标记为无副作用,打包工具会分析引用图,发现其他导出未被使用,从而将它们从最终 bundle 中剔除。这显著减小了生产环境的包体积。需要注意的是,Tree Shaking 仅作用于 ES Modules 静态结构,CommonJS 模块无法被有效摇树,因为它们的导入是动态执行的。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











