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
相关产品推荐
相关产品推荐

