从Monorepo部署NestJS时如何减小Heroku Slug体积?
解决Monorepo中NestJS部署Heroku的Slug体积超限问题
核心问题定位
你遇到的问题本质是Heroku默认会在根目录安装所有Monorepo依赖,导致node_modules包含了Angular、Loopback等完全不需要的包,再加上Chrome/Chromedriver Buildpack的体积,最终触发Slug上限。以下是无需拆分仓库、无需付费的针对性解决方案:
1. 用工作区(Workspace)精准控制依赖安装
Monorepo的核心优势就是共享依赖,通过工作区配置可以让Heroku只安装NestJS及它依赖的共享库,排除其他项目的依赖:
- 在根目录
package.json中配置工作区,明确指定需要的子项目:{ "workspaces": [ "apps/nestjs-server", "libs/shared-*" // 匹配所有共享库 ] } - 设置Heroku环境变量,强制只安装指定工作区的依赖:
- 用Yarn:
heroku config:set YARN_WORKSPACES_TO_INSTALL="apps/nestjs-server libs/shared-utils" - 用NPM:
heroku config:set NPM_CONFIG_WORKSPACE="apps/nestjs-server"
- 用Yarn:
2. 清理不必要的Buildpack
如果你的NestJS服务不需要浏览器自动化(比如爬虫、端对端测试),直接移除Chrome和Chromedriver的Buildpack:
heroku buildpacks:remove https://github.com/heroku/heroku-buildpack-google-chrome heroku buildpacks:remove https://github.com/heroku/heroku-buildpack-chromedriver
这两个Buildpack会增加几十MB的体积,是常见的冗余项。
3. 用.slugignore排除无关文件
在根目录创建.slugignore文件,把所有不需要打包进Slug的内容排除:
# 排除所有Angular应用 apps/angular-* # 排除Loopback、Express服务器 apps/loopback-server apps/express-server # 排除测试、文档、冗余配置 tests/ docs/ *.md .eslintrc.json .gitignore # 排除非必要的二进制文件或缓存 .cache/ tmp/
注意:不要排除NestJS项目目录、共享库目录,以及根package.json。
4. 仅安装生产依赖并清理编译冗余
- 强制Heroku只安装生产依赖:
如果NestJS编译需要heroku config:set NPM_CONFIG_PRODUCTION=true # 或Yarn:heroku config:set YARN_PRODUCTION=truetypescript、@nestjs/cli等开发依赖,把它们临时移到dependencies,或者在heroku-postbuild脚本完成编译后清理: - 在根
package.json添加编译后清理脚本:
编译完成后删除NestJS的源码和本地"scripts": { "heroku-postbuild": "cd apps/nestjs-server && npm run build && rm -rf src node_modules" }node_modules,只保留编译后的dist目录,能大幅减少体积。
5. 验证体积优化效果
部署前可以本地模拟Heroku的安装流程,查看依赖体积:
# 清理本地依赖 npm install --production --workspace=apps/nestjs-server # 查看node_modules体积 du -sh node_modules
也可以部署后通过heroku run bash进入容器,查看Slug内的文件结构:
heroku run bash # 查看整体体积 du -sh /app # 检查是否有冗余文件 ls -la /app/apps/
这些操作既保留了Monorepo的共享依赖优势,又能把Slug体积压缩到500MB以内,无需拆分仓库或升级付费套餐。
内容的提问来源于stack exchange,提问作者batman567
相关产品推荐
相关产品推荐

