tree shaking 不支持重构期间检测,仅在构建时静态剔除未 import 的导出;需通过规范导出、禁用 babel 模块转换、工具扫描(如 depcheck、vs code 插件)、反向引用检查及构建后搜索验证来主动清理未用导出。

Tree Shaking 本身不提供“重构期间检测”的能力,它只在最终构建时静态剔除未被 实际 import 的导出;但你可以通过组合工具链和规范实践,在重构过程中主动发现、验证并清理未使用的组件库导出函数。
重构前:确保导出可被分析
组件库的导出必须满足 Tree Shaking 基础条件,否则重构时再怎么查也白搭:
- 用具名导出(
export function X或export { X }),避免export default { X, Y }这类对象聚合导出 - 库的入口需是 ESM 格式,检查其
package.json是否有"type": "module"或"exports": { ".": { "import": "./index.mjs" } } - 项目中禁用 Babel 的模块转换:
modules: false,防止import { Button }被编译成require('xxx').Button
重构中:用工具定位未引用的导出
仅靠人工排查易遗漏,推荐以下方式主动扫描:
- 在 VS Code 中安装插件 Unused Import Highlighter 或 Import Cost,实时标灰未使用的具名导入项
- 运行
npx depcheck --ignores="webpack,vite,rollup",识别项目中声明了但从未被import的包(间接提示该包内可能有整块未用功能) - 对组件库做“反向引用检查”:在代码库全局搜索
from 'xxx-ui',再逐个查看每个import语句是否真的用了所列的成员(如import { Modal, Tooltip } from '@xxx/ui',但代码里只用了Modal)
重构后:验证是否真被移除
别只看 bundle 大小变化——压缩会掩盖结果。要确认导出函数是否从产物中消失:
- 执行真实生产构建:
vite build或webpack --mode=production - 打开
dist/下生成的 JS 文件,直接搜索目标函数名(如ElDrawer、DatePicker) - 若搜不到,且该函数没被动态
import()、* as引入或副作用文件触发保留,说明已成功清理 - 进阶验证:用
rollup-plugin-visualizer或source-map-explorer查看模块依赖图,确认对应模块未出现在图中
规避常见干扰项
重构时容易误判“已清理”,实则因以下原因被保留:
- 某组件虽未显式
import,但被其他已引入组件内部依赖(例如引入了Table,而它内部用了Pagination) - 样式文件或初始化脚本被漏写在
"sideEffects"数组里,导致整个模块因副作用保守保留 - 使用了
import * as ui from '@xxx/ui'—— 构建工具无法判断哪些成员真正被访问,整包保留
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











