Rails 7生产环境使用importmaps时JavaScript文件报404错误问题咨询
问题原因及解决方案
关于config.assets.compile = true的作用说明
这个配置的作用是开启生产环境的实时资产编译,生产环境默认值为false。当值为true时,如果请求的静态资源没有提前预编译,Rails会在收到请求时当场编译资源再返回。这种方式虽然能临时解决404问题,但会大幅降低生产环境响应速度,还存在额外的性能开销和安全隐患,完全不推荐生产环境长期开启,属于临时绕过问题的方案,没有从根本解决问题。
404报错根因
你使用的是Rails 7.0.0.alpha2这个早期测试版本,该版本的importmap功能存在未修复的缺陷:pin_all_from "app/javascript/controllers"声明的控制器文件不会被自动纳入生产环境的资产预编译清单,执行rails assets:precompile时会漏掉这部分JS文件,导致生产环境请求时找不到文件报404。开发环境默认开启实时编译,所以不会出现该问题。
正确解决步骤
- 第一步:先将
config/environments/production.rb中的config.assets.compile改回默认值false - 第二步(推荐方案):将Rails版本升级到7.0.0及以上正式稳定版,该版本已经修复了importmap资源自动纳入预编译清单的缺陷,无需额外配置即可正常工作
- 第二步(临时兼容方案,不升级Rails版本时使用):在
config/initializers/assets.rb中手动添加需要预编译的JS文件规则:Rails.application.config.assets.precompile += %w( controllers/*.js application.js ) - 第三步:生产环境部署时确保执行了资产预编译命令:
绝大多数Rails部署平台都会自动执行该步骤,无需手动操作。RAILS_ENV=production rails assets:precompile
验证方法
本地执行RAILS_ENV=production rails assets:precompile,查看public/assets目录下是否存在controllers文件夹和对应的JS编译文件,以及application.js的编译版本,存在即说明预编译正常,部署后不会再出现404问题。
内容的提问来源于stack exchange,提问作者Shpigford
相关产品推荐
相关产品推荐

