如何减小 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            # 删除依赖树中的extraneous包,不会删掉合法传递依赖

已写入package.json的直接依赖不会因“不再使用”而被prune删除,需先审计再uninstall。

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

npm cache clean 清理下载缓存,不会缩小已安装node_modules;镜像层缓存也不等于省去运行时依赖。

常见问题(FAQ)

Q:node_modules 应该提交到 Git 吗?
不应该。提交 lock 文件(package-lock.json / pnpm-lock.yaml),CI 使用对应包管理器的锁定安装方式:package-lock用npm ci,pnpm-lock用pnpm install --frozen-lockfile。

Q:pnpm 的硬链接会不会导致包之间互相污染?
不能把硬链接当成只读安全边界。不要原地修改共享包文件;具体导入方式可能是硬链接、reflink或复制,取决于环境与配置。

Q:为什么删了 node_modules 重装后还是很大?
体积是依赖树决定的,重装不减量。减量的正道是换 pnpm、砍依赖、拆 dev。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台