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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 12:14:51