tree shaking 生效需 babel 保持 es 模块语法不变,配置 "modules": false;对子模块库如 litegraph.js,用 babel-plugin-import 实现路径级按需加载;并启用 production 模式及 sideeffects 声明。

Tree Shaking 要真正生效,Babel 不能把 ES 模块语法(import/export)提前转成 CommonJS(require/module.exports),否则 webpack 或 rollup 就无法做静态分析。配合 Babel 插件的关键,是让模块结构“保持原样”,再交由打包工具裁剪。
确保 Babel 不转换模块语法
Babel 默认会把 import 编译为 require,这直接破坏 Tree Shaking 的前提。必须显式关闭:
- 在
.babelrc或babel.config.js中,@babel/preset-env的配置里加"modules": false - 例如:
{ "presets": [["@babel/preset-env", { "modules": false }]] } - 这样 Babel 只负责语法降级(如箭头函数、可选链),保留
import/export原始形态,留给 webpack 做依赖分析
按需引入 + babel-plugin-import(针对组件库或节点库)
像 LiteGraph.js 这类提供大量子模块的库,光靠默认 Tree Shaking 不够——它导出的是一个大对象,内部节点未被单独导出时,打包工具识别不出哪些能删。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
babel-plugin-import实现“路径级按需”:写import MathNode from 'litegraph.js/src/nodes/MathNode',插件自动帮你解析并只加载该文件 - 配合
.babelrc配置:
{"plugins": [["import", {"libraryName": "litegraph.js", "libraryDirectory": "src/nodes"}]]} - 注意:前提是目标库源码本身是 ESM 格式,且各节点文件有独立
export
启用生产模式 + 声明副作用
webpack 的 Tree Shaking 在 mode: 'production' 下才默认开启,但还需明确告知哪些代码“可以安全删除”:
- 在
package.json中设置"sideEffects": false,表示项目内所有模块都没有副作用(比如不操作 DOM、不改全局变量、不发起请求) - 如果用了 CSS 文件、字体或 polyfill,它们有副作用,要显式列出:
- 漏配
sideEffects会导致 webpack 保守处理,跳过本可摇掉的模块
验证是否生效
别只看打包体积变化,要确认代码确实被删了:
- 用
webpack --stats=verbose查看 module graph,找unused exports字段 - 生成
stats.json后用 webpack-bundle-analyzer 可视化查看哪些模块没被引用 - 检查最终产物中是否存在你没 import 过的函数名或类名(搜索关键词即可)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










