判断第三方包是否真正支持 tree shaking,核心是验证其是否提供纯 esm 入口、无副作用、导出结构可静态分析:检查 package.json 的 "module" 或 "exports" 字段指向 esm 文件,"sideeffects" 设为 false 或精确声明;再通过最小测试用例构建产物,搜索未使用导出是否残留,并结合 bundle 分析工具确认 unused 导出。

直接看它的模块导出方式和构建产物,而不是依赖文档或宣传语。一个第三方包是否真正支持 Tree Shaking,核心在于它是否提供纯 ESM 入口、无副作用、且导出结构可被静态分析。
检查 package.json 的 module / exports 字段
打开包的 package.json,重点看以下字段:
-
"module":指向 ES Module 版本入口(如
dist/index.esm.js),这是最常见也最可靠的 ESM 标识 -
"exports":现代写法,支持条件导出。若包含
"import": "./dist/index.js"或"default": "./dist/index.mjs",且路径指向 ESM 文件,则大概率支持 -
"sideEffects":若为
false或明确列出副作用文件(如["*.css"]),说明作者已主动适配 Tree Shaking;若缺失或为true,需谨慎对待
验证实际导入行为是否触发全量加载
在项目中写一个最小测试用例:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 新建
test-tree-shaking.js,只写一行:import { debounce } from 'lodash-es';(或你怀疑的包) - 用 Vite 构建(
vite build --outDir dist-test)或 Webpack 生产构建 - 打开生成的 bundle 文件,搜索该包里未使用的函数名(如
throttle、once)——若完全搜不到,说明摇树干净 - 对比改用
import _ from 'lodash-es'后的 bundle 大小,明显变大就说明具名导入生效了
比对不同版本/分发格式的实际产物
很多包提供多个分发版本,效果差异很大:
- ✅ 推荐:
lodash-es(原生 ESM)、date-fns(每个函数独立文件)、clsx(无副作用 + 具名导出) - ⚠️ 谨慎:
lodash(CommonJS 主入口)、moment(默认导出对象 + 动态方法)、axios(虽有 ESM 入口但含顶层副作用逻辑) - ? 查看 npm 包源码页的
Files列表,确认是否存在.mjs、index.esm.js或dist/*.js中明确标注type: "module"的文件
借助工具快速定位残留代码
不靠肉眼扫,用可视化手段确认:
- Webpack 项目:加
webpack-bundle-analyzer插件,构建后点开该包所在模块,看“Exports”面板中哪些导出被标记为unused - Vite 项目:启用
build.rollupOptions.output.manualChunks把该包单独拆成 chunk,再用vite-plugin-visualizer查看内部保留了哪些函数 - 通用技巧:在 node_modules 对应包里搜索
export default或module.exports—— 出现任一者,基本意味着该文件无法被安全摇掉










