Tree Shaking 能清理无用类方法的前提是:方法必须独立 export 且调用方使用命名导入;类整体导出难以被摇掉;需启用 production 模式、usedExports、ES Module,并配合 sideEffects: false。

Tree Shaking 清理无用的类方法,关键在于类方法必须通过 ES6 的 export 显式导出,且调用方使用命名导入(import { method }),否则打包工具无法静态识别哪些方法被使用、哪些未被引用。
类本身不是问题,问题在于“导出方式”和“引入方式”是否满足静态分析前提。
类方法能被 Tree Shaking 的前提条件
- ✅ 类写在单独模块中,且每个方法是独立
export的函数(推荐) - ✅ 或整个类
export default class,但仅当该类未被实例化或其方法未被调用时,整类才可能被移除(实际中极难触发,不推荐依赖) - ✅ 调用方必须使用命名导入,而非
import * as或默认导入后动态访问 - ✅ 项目启用生产模式(
mode: 'production'),且optimization.usedExports: true(Webpack 默认已开) - ✅ 所有模块使用 ES Module 语法(
import/export),禁用 CommonJS(require/module.exports)
推荐写法:把类方法拆成独立导出函数
// math.js
export function add(a, b) { return a + b; }
export function subtract(a, b) { return a - b; }
export function multiply(a, b) { return a * b; }
// ❌ 不要写成 class 内部方法再整体导出// index.js
import { add } from './math.js';
console.log(add(1, 2)); // 只引用 add → subtract 和 multiply 会被摇掉这样 Webpack/Rollup/Vite 都能准确标记并删除未引用的函数。
如果必须用 class,这样写才可能被部分摇掉
// calculator.js
export class Calculator {
static add(a, b) { return a + b; }
static subtract(a, b) { return a - b; }
static multiply(a, b) { return a * b; }
}// index.js
import { Calculator } from './calculator.js';
console.log(Calculator.add(1, 2));⚠️ 注意:
立即学习“Java免费学习笔记(深入)”;
-
Calculator.subtract没被调用,但因Calculator类被引用,其所有静态方法仍可能保留在 bundle 中(取决于打包工具和sideEffects设置) - 若
Calculator类有构造逻辑、原型方法或副作用(如初始化全局状态),它几乎不会被完全移除 - 更稳妥的做法仍是拆解为独立函数导出
配合 sideEffects: false 提升清理效果
在 package.json 中声明:
{
"sideEffects": false
}这告诉 Webpack:“本包所有模块都没有副作用”,于是未被引用的导出(包括类中的静态方法、独立函数等)可安全删除。
若项目中有 CSS 或有副作用的初始化代码,改用数组白名单:
"sideEffects": ["*.css", "*.less"]
实际验证小技巧
- 构建后查看
.js文件源码,搜索未使用的函数名是否还在 - 使用 Webpack Bundle Analyzer 查看模块构成
- 开发时临时设
mode: 'development'+optimization.minimize: false+usedExports: true,对比未压缩产物中是否有/* unused export subtract */注释(Webpack 会标记)
不复杂但容易忽略。


















