tree shaking 可剔除未用代码,但需 es module 格式及静态分析支持;应直接导入单个函数如 import debounce from 'lodash-es/debounce',禁用默认/通配符导入,确保构建工具启用 esm 解析且避免动态导入。

Tree Shaking 能在构建时剔除未使用的代码,但前提是模块必须是 ES Module(ESM)格式,且导入方式支持静态分析。Lodash-es 是 Lodash 的 ESM 版本,专为 Tree Shaking 设计,但若用法不当,仍会导致全量打包。
只按需导入具体函数
避免使用解构或命名导入整个工具库对象,例如不要这样写:
❌ 错误示例(看似按需,实则可能触发副作用或全量解析)import { debounce, throttle } from 'lodash-es';
虽然语法正确,但某些构建工具(如旧版 Webpack 或未配置好的 Vite)在处理大命名空间时,仍可能保留未用函数的引用链。更稳妥的方式是直接导入单个函数文件:
import debounce from 'lodash-es/debounce';import throttle from 'lodash-es/throttle';import get from 'lodash-es/get';
这种方式路径明确、无命名空间依赖,Tree Shaking 更可靠,也利于编辑器跳转和类型推导。
禁用默认导入和通配符导入
绝对不要写:
-
import _ from 'lodash-es';(默认导出会引入整个包) -
import * as _ from 'lodash-es';(通配符破坏静态分析)
这类写法让打包器无法判断哪些导出被实际使用,直接关闭 Tree Shaking 路径。
检查构建工具配置是否启用 ESM 解析
确保构建工具识别 .mjs 或 package.json 中的 "type": "module" 和 "exports" 字段。例如 Vite 默认支持;Webpack 5+ 需确认 experiments.topLevelAwait 非必需,但要保证 resolve.exports 启用(通常默认开启)。可验证方式:
- 查看最终打包产物中是否包含未调用的函数(如
cloneDeep),若有,说明未 shake 掉 - 在 vite.config.ts 中添加
build.rollupOptions.treeshake: true(默认已启用,仅作确认)
避免运行时动态导入路径
不要通过字符串拼接或变量构造导入路径:
-
const funcName = 'debounce'; import(`lodash-es/${funcName}`);(动态 import 无法被静态分析) -
import('lodash-es').then(mod => mod.debounce);(同样绕过编译期分析)
这类写法会强制加载整个模块,Tree Shaking 失效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











