要让JavaScript项目真正受益于Tree Shaking,关键在于统一使用ESM语法、正确配置构建工具(如Webpack需启用usedExports和minimize)、显式声明sideEffects,并优先采用命名导出以提升剔除精度。

要让 JavaScript 项目真正受益于 Tree Shaking,关键不是“选 Rollup 还是 Webpack”,而是统一用 ESM 语法 + 正确配置 + 明确副作用声明。Rollup 和 Webpack 的 Tree Shaking 原理高度一致,都依赖静态分析模块导出与导入的映射关系,但实际效果差异主要来自配置细节和生态兼容性。
确保所有模块使用 ES Module 语法
Tree Shaking 只对 export / import 生效,CommonJS(require/module.exports)或动态 import() 无法被静态判定,会导致整块模块保留在 bundle 中。
- 避免混合写法:比如在 ESM 文件里用
require('./utils'),会破坏分析链 - 第三方库若只有 CommonJS 版本(如早期 lodash),需借助插件(如
@rollup/plugin-commonjs)转换,但转换后可能丢失可摇性 - 推荐优先选用原生支持 ESM 的库(查看 package.json 中是否有
"type": "module"或"exports"字段)
显式声明 sideEffects,避免误删有副作用的代码
Tree Shaking 默认会删除未被引用的导出,但如果某个模块的执行本身就有副作用(例如注册全局样式、初始化 SDK、修改原型),直接删掉就出问题。这时需通过 package.json 中的 sideEffects 字段告诉打包工具:“这些文件不能被摇掉”。
-
"sideEffects": false表示整个包无副作用,可安全摇树 -
"sideEffects": ["*.css", "*.scss"]表示只保留 CSS 类文件,其余导出均可摇 -
"sideEffects": ["./polyfill.js"]表示仅该文件有副作用,其他导出仍可分析剔除
导出方式影响摇树粒度
命名导出(export const foo = ...)比默认导出(export default {...})更利于精准剔除。因为默认导出是一个整体对象,即使只用其中一两个属性,整个对象也可能无法拆分。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- ✅ 推荐:
export const add = (a, b) => a + b;+export const sub = (a, b) => a - b; - ⚠️ 谨慎:
export default { add, sub };—— Rollup/Webpack 很难判断你是否只用了add - ? 补充技巧:对工具函数库,提供单独入口(如
import { debounce } from 'lodash-es'),比import _ from 'lodash-es'更易摇树
Webpack 需手动启用 usedExports,Rollup 默认开启
Rollup 默认对 ESM 做完整依赖分析;Webpack 则需明确配置才能标记未使用导出:
- Webpack 必须设置
optimization.usedExports: true,否则即使mode: 'production'也不会标记导出使用状态 - 同时需启用压缩(
minimize: true或指定minimizer),因为 Terser 才真正执行删除 - Rollup 不需要额外开关,只要输入是 ESM、输出格式支持 tree-shaking(如
format: 'es'或'cjs'配合preserveModules: true),就会自动剔除
不复杂但容易忽略:Tree Shaking 不是开个开关就自动生效的魔法,它是一套配合机制——语法规范是前提,配置是触发器,副作用声明是护栏,导出设计是放大器。

















