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

Rails7项目中esbuild代码分割在CI/Heroku环境超时问题

Rails 7 + esbuild 部署超时/卡住问题解决方案

你的问题根源在于esbuild配置里的watch: true——这个选项会让esbuild进程持续运行,监听文件变化,而CI(GitHub Actions)和Heroku的构建任务需要一次性执行完成,进程不会自动退出,最终导致超时或卡住。

1. 区分开发/生产构建命令

修改package.json的scripts,拆分开发和生产环境的构建命令:

"scripts": {
  "build": "NODE_ENV=production node app/assets/config/esbuild.js",
  "build:dev": "node app/assets/config/esbuild.js",
  "build:css": "sass ./app/assets/stylesheets/application.sass.scss ./app/assets/builds/application.css --no-source-map --load-path=node_modules",
  "build:css:dev": "sass ./app/assets/stylesheets/application.sass.scss ./app/assets/builds/application.css --source-map --load-path=node_modules"
}
  • build:生产环境构建(无watch、开启压缩)
  • build:dev:开发环境构建(保留watch)
  • build:css:生产环境CSS构建(关闭sourcemap)
  • build:css:dev:开发环境CSS构建(开启sourcemap)

2. 修改esbuild配置,根据环境变量控制行为

更新app/assets/config/esbuild.js,通过环境变量判断是否开启watch和压缩:

const path = require('path');
const isProduction = process.env.NODE_ENV === 'production';

require("esbuild").build({
  entryPoints: ["stimulus.js","article.js"],
  bundle: true,
  minify: isProduction, // 仅生产环境开启代码压缩
  outdir: path.join(process.cwd(), "app/assets/builds"),
  absWorkingDir: path.join(process.cwd(), "app/javascript"),
  watch: !isProduction, // 仅开发环境开启文件监听
  loader: { '.js': 'jsx' },
  publicPath: 'assets',
  target: 'es6',
  plugins: [],
}).catch(() => process.exit(1));

3. 部署环境验证

  • GitHub Actions:构建步骤中使用yarn build + yarn build:css,确保执行一次性构建任务
  • Heroku:Heroku默认会自动执行yarn build,无需额外配置,修改后的命令会自动以生产模式运行,完成后进程正常退出

开发时继续使用yarn build:dev和yarn build:css:dev,保持原有热更新/监听功能不变。

内容的提问来源于stack exchange,提问作者port5432

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:15:37