Rails生产环境application.js不在资产管道的问题求助
Rails + jsbundling-rails/esbuild + cssbundling-rails/Tailwind 生产环境首次资产加载失败问题解决
问题背景
- 开发环境:当
assets/builds目录为空时首次启动服务器,触发ActionView::Template::Error,重启服务器后恢复正常 - 生产环境:构建日志显示js/css构建成功,但首次加载页面时提示
application.js不在资产管道,重启生产服务器无法解决;执行两次bundle exec rails assets:precompile可临时解决问题
可能原因
- 预编译时序冲突:第一次执行
assets:precompile时,esbuild的js构建与sprockets的manifest生成存在时序问题——sprockets扫描文件时,esbuild还未生成application.js,导致manifest文件中未记录该资产;第二次预编译时,构建产物已存在,sprockets能正确捕获并写入manifest。 - manifest.js配置遗漏:若
app/assets/config/manifest.js未正确包含assets/builds目录下的产物,sprockets不会将这些文件纳入资产管道。 - 部署脚本顺序错误:自定义部署脚本(如
render-build.sh)中,若先执行assets:precompile再执行js/css构建,会导致预编译时产物尚未生成。
解决方案
1. 强制构建步骤优先于资产预编译
Rails的jsbundling-rails默认会在assets:precompile前触发build:js,但自定义部署脚本需确保顺序正确:
- 确认
package.json的构建脚本包含完整的js/css构建:"scripts": { "build": "yarn build:js && yarn build:css", "build:js": "esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds --public-path=assets", "build:css": "tailwindcss -i ./app/assets/stylesheets/application.tailwind.css -o ./app/assets/builds/application.css" } - 修改部署脚本(如
render-build.sh),显式按顺序执行:# render-build.sh yarn install yarn build bundle exec rails assets:precompile bundle exec rails assets:clean
2. 修正manifest.js配置
确保app/assets/config/manifest.js正确引入builds目录下的所有产物:
//= link_tree ../images //= link_tree ../builds //= link application.css
不要单独使用
//= link application.js,生产环境esbuild会生成带哈希的文件名,link_tree可自动捕获所有构建产物。
3. 预编译前清理旧产物
避免旧缓存干扰,在部署脚本中添加清理步骤:
# render-build.sh rm -rf app/assets/builds/* rm -rf public/assets/* yarn install yarn build bundle exec rails assets:precompile bundle exec rails assets:clean
4. 调整生产环境资产配置
在config/environments/production.rb中确保资产管道识别构建目录:
config.assets.paths << Rails.root.join('app/assets/builds') config.assets.compile = false # 生产环境保持关闭,强制使用预编译产物 config.public_file_server.enabled = true
验证方法
本地模拟生产环境流程:
rm -rf app/assets/builds public/assets yarn build bundle exec rails assets:precompile
检查public/assets/manifest-*.json中是否存在application.js的条目。如果存在,说明配置正确,部署环境需同步调整。
内容的提问来源于stack exchange,提问作者Ernesto G
相关产品推荐
相关产品推荐

