Heroku部署Rails 5应用时JavaScript文件无法加载求助
别急,我之前也碰到过几乎一模一样的问题,大概率是资产管道预编译的配置没弄对,给你几个排查和解决的方向:
确保static.js被纳入主资产文件
Rails资产管道默认只会预编译application.js、application.css这类入口文件,所以你需要把static.js引入到app/assets/javascripts/application.js里。打开这个文件,加上一行://= require static或者如果你的js文件都在这个目录下,也可以用
//= require_tree .来引入所有文件,这样就不用单独加每个文件了。配置预编译列表(如果需要单独编译)
如果你不想把static.js合并到application.js里,而是单独引用它,那得告诉Rails要预编译这个文件。打开config/environments/production.rb,添加:config.assets.precompile += %w( static.js )这样Heroku预编译资产的时候就会单独处理这个文件了。
本地先测试预编译
别直接推到Heroku碰运气,先在本地模拟生产环境预编译,看看有没有问题:RAILS_ENV=production rails assets:precompile执行完后去
public/assets目录看看,应该能看到带哈希值的static-xxxxxxxxxxxx.js文件。如果没有,说明本地预编译就出错了,先解决本地的问题,比如语法错误、依赖缺失之类的。检查Heroku的部署日志
有时候预编译过程中会有错误但没提示出来,你可以查看Heroku的日志:heroku logs --tail搜索
assets相关的关键词,比如precompile,看看有没有报错信息,比如某个依赖找不到、JavaScript语法错误之类的,这些都会导致预编译失败,文件没法生成。清理Heroku的资产缓存
有时候Heroku会缓存旧的资产文件,导致新的文件没生效。可以先清理缓存再重启:heroku run rails assets:clean heroku restart确认视图里的引用正确
如果是用合并后的application.js,那视图里只要有<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>就够了;如果是单独引用static.js,那得写成<%= javascript_include_tag 'static', 'data-turbolinks-track': 'reload' %>,而且必须确保已经配置了预编译列表。
按照这些步骤一步步排查,应该能解决你的问题。
内容的提问来源于stack exchange,提问作者Diego Flores

