如何减小 node_modules 文件夹的体积?
减小 node_modules 体积的方法:npm prune 清理多余包、--omit=dev 只装生产依赖、换 pnpm(硬链接共享存储可省 70%+)、审计依赖瘦身、部署时打包产物而非整个 node_modules。
最有效的三招:换 pnpm(共享存储立竿见影)、部署时 --omit=dev、定期 npm prune。
1. 换 pnpm:效果最显著
pnpm 用全局存储 + 硬链接:同一个包在磁盘上只存一份,所有项目链接过去。多项目机器上轻松省下 70% 以上空间:
npm install -g pnpm
pnpm install
yarn 的 Plug'n'Play(PnP)模式更激进——干脆没有 node_modules,依赖从压缩缓存直接加载。
2. 部署时只装生产依赖
npm ci --omit=dev
devDependencies(构建工具、测试框架、lint)在 CI 构建完就该退场,生产镜像里它们纯属赘肉。
3. 清理多余包
npm prune # 删除 package.json 里没有声明的包
手动 npm install 装过又忘了的包就靠它清。
4. 审计依赖本身
有些包是"体积刺客"(moment、lodash 全量等)。用工具找出谁最大:
npx node-modules-inspector # 可视化分析
减重思路:moment → dayjs/date-fns;lodash 按需引入单函数包或原生方法替代;重复版本用 npm dedupe 去重。
5. 换个思路:干脆不部署 node_modules
Docker/Serverless 场景更现代的做法:构建产物打包成单文件(esbuild/webpack bundle)或层缓存,部署物里根本不需要完整的 node_modules。
RUN npm ci --omit=dev && npm cache clean --force
常见问题(FAQ)
Q:node_modules 应该提交到 Git 吗?
不应该。提交 lock 文件(package-lock.json / pnpm-lock.yaml),CI 上 npm ci 重现依赖。
Q:pnpm 的硬链接会不会导致包之间互相污染?
不会。硬链接指向只读的全局存储,包文件内容不可变;每个项目的依赖结构仍严格隔离。
Q:为什么删了 node_modules 重装后还是很大?
体积是依赖树决定的,重装不减量。减量的正道是换 pnpm、砍依赖、拆 dev。