要让 tree shaking 稳定生效,关键在于统一使用命名导出、入口文件零副作用、按功能原子化拆分文件,并在 package.json 中严格声明 sideeffects 字段。

要让 Tree Shaking 在团队项目中稳定生效,关键不是“开了没开”,而是所有成员导出代码的方式必须统一、可静态分析、无副作用。规范导出风格,本质是建立一套模块契约——让每个文件都成为可被安全摇掉的“原子单元”。
只用命名导出,禁用默认导出
默认导出(export default { a, b, c })会把多个功能打包进一个对象,工具无法判断其中某个方法是否被单独使用,极易导致整块代码被保留。
- ✅ 推荐写法:每个函数/常量独立命名导出
export const debounce = () => { /* ... */ };
export const throttle = () => { /* ... */ };
export const formatDate = (d) => new Intl.DateTimeFormat().format(d);
- ❌ 禁止写法:聚合式默认导出
export default { debounce, throttle, formatDate };
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
入口文件只做“转发”,不执行逻辑
团队库的 index.js 或主入口,应严格作为“导出清单”,不能包含任何初始化、赋值、DOM 操作等副作用代码。
- 允许:
export { debounce } from './debounce'; - 允许:
export * from './types';(但需确保所 re-export 的模块本身也符合规范) - 禁止:
console.log('utils loaded'); - 禁止:
document.addEventListener(...); - 禁止:
globalThis.MyLib = {...};
按功能拆分文件,避免“大而全”模块
一个文件导出 20 个工具函数,即使只用 1 个,也可能因副作用或导入方式不当导致全部保留。应推动“一个能力,一个文件”原则。
- ✅ 合理结构:
src/
├── date/
│ ├── format.js // export const formatISO = ...
│ └── parse.js // export const parseISO = ...
├── dom/
│ ├── show.js // export const show = ...
│ └── hide.js // export const hide = ...
└── index.js // export { formatISO } from './date/format'; export { show } from './dom/show';
- ❌ 高风险结构:
src/utils.js导出 50+ 函数,且含顶层 console 或 polyfill 注入
在 package.json 中统一声明副作用策略
团队应约定并强制执行 sideEffects 字段,避免因个别模块副作用导致整包保守保留。
- 绝大多数纯工具库适用:
"sideEffects": false - 若含样式或初始化脚本,明确列出路径:
"sideEffects": ["*.css", "src/init.js"] - 禁止留空或设为
true(等于放弃 Tree Shaking)
该字段对 node_modules 中的依赖同样生效,尤其影响 Webpack 5+ 和 Vite 的优化判断。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










