按需引入第三方工具函数需满足esm导出、独立子包或官方支持tree shaking;应避免全量导入,改用路径导入(如lodash/debounce)并确保使用lodash-es等esm友好版本;可借助插件自动转换导入路径,最后通过source-map-explorer验证剔除效果。

只打包用到的第三方工具函数,核心是切断“全量加载”路径,让构建工具能准确识别并剔除未使用的代码。这不单是写法问题,更依赖模块规范、构建配置和库本身的导出结构三者配合。
确认库是否支持按需引入
不是所有 npm 包都天然支持按需引入。关键看它是否满足以下任一条件:
- 提供 ES 模块(ESM)格式导出,且每个工具函数单独导出(如
lodash/map、date-fns/format) - 每个函数有独立的 npm 子包(如
lodash.isequal、ramda.filter) - 官方明确说明支持 Tree Shaking(例如 date-fns、lodash-es、nanoid、clsx)
反例:Moment.js、underscore、原生 lodash(非 lodash-es)默认不支持良好 Tree Shaking,全量导入时几乎无法剔除未用代码。
用对导入方式:路径导入 + ESM
避免 import _ from 'lodash' 或 import moment from 'moment' 这类全量写法。改用具体路径导入:
import debounce from 'lodash/debounce'import { format, parseISO } from 'date-fns'-
import isEmail from 'validator/lib/isEmail'(注意/lib/路径,避开 UMD 入口)
⚠️ 注意:必须确保你用的是 lodash-es(而非 lodash),因为前者是专为 ESM 和 Tree Shaking 设计的版本;date-fns 默认即为 ESM 友好。
借助插件自动处理(可选但推荐)
当项目中频繁使用某类工具库(如 Lodash),手动写路径易出错、难维护。可用构建插件辅助:
-
Webpack:搭配
lodash-webpack-plugin+babel-plugin-lodash,允许你仍写import { debounce, throttle } from 'lodash',插件自动转成路径导入并精简功能 -
Vite / Vue / React 项目:推荐
unplugin-auto-import或unplugin-vue-components(对组件库更常用),或直接用unplugin-lodash实现零配置按需
这些插件本质是在构建阶段重写 import 语句,把模糊引用映射为精确路径,再交由打包器做 Tree Shaking。
验证是否真正生效
光写对了不等于打出来就小了。务必检查最终产物:
- 用
npm run build后运行npx source-map-explorer dist/assets/index.*.js(Vite/Webpack 通用),查看 bundle 中是否还存在未调用的函数模块 - 在代码里故意引入一个不用的函数(如
import get from 'lodash/get'但实际没调用),观察构建后该函数是否被剔除 - 对比全量导入与路径导入的打包体积差异——Lodash 场景下常有 60%+ 的体积下降
若发现未剔除,常见原因包括:用了非 ESM 版本、启用了 babel 插件却未关闭 preset-env 的 modules 转换、或库内部有副作用(需在 webpack.config.js 中标注 /*#__PURE__*/ 或配置 sideEffects: false)。











