如何减小 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。