You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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"

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只安装生产依赖:
    heroku config:set NPM_CONFIG_PRODUCTION=true
    # 或Yarn:heroku config:set YARN_PRODUCTION=true
    
    如果NestJS编译需要typescript、@nestjs/cli等开发依赖,把它们临时移到dependencies,或者在heroku-postbuild脚本完成编译后清理:
  • 在根package.json添加编译后清理脚本:
    "scripts": {
      "heroku-postbuild": "cd apps/nestjs-server && npm run build && rm -rf src node_modules"
    }
    
    编译完成后删除NestJS的源码和本地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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 02:32:38