sprockets指令尝试包含gem js-routes的输出,以便允许我从客户端访问Rails路由.@H_502_3@
这是我的设置(在app / assets / javascripts中):@H_502_3@
system/ rails_routes.js application.js
application.js是主文件,它运行应用程序的其余部分.我希望能够做类似的事情@H_502_3@
var rr = require("./system/rails_routes.js");
在其中,并访问路由对象.@H_502_3@
在system / react_routes.js中,我有以下内容:@H_502_3@
//= require js-routes console.log("Does this work?");
(顺便说一句,我配置了js-routes将输出放在一个名为module.exports的对象中,以符合CommonJS模型,如railsware/js-routes#121所述)@H_502_3@
唯一的问题是,当我查看生成的bundle时,sprockets指令仍然存在并且尚未展开.@H_502_3@
console.log调用也在那里,当我需要()模块时执行.@H_502_3@
有没有办法让这个工作?在使用browserify-rails捆绑文件之前让链接器预处理文件的正确方法是什么?@H_502_3@
解决方法
我来到下面描述的解决方案是我无法在Browserify进入之前让Sprockets预处理我的路由文件的结果.我在browserify-rails和sprockets的源代码中花了很长时间但是却没有没有办法扭转局面,让每个组件按照正确的顺序行事.@H_502_3@
所以我的解决方案是使用Rails挂钩在开发环境中“手动”生成完整的JS文件,以便路由始终与最新的Rails路由文件保持同步.然后我假设路由JS文件在推送到生产时将是最新的.@H_502_3@
在环境加载中这样做可确保在Sprockets / browserify chime in之前JS文件已准备就绪:对于它们来说,它只是另一个普通的JS文件.@H_502_3@
这是包含在development.rb中的代码:@H_502_3@
ActionDispatch::Reloader.to_prepare do Rails.application.reload_routes! if JsRoutes.assert_usable_configuration! JsRoutes.generate!(Rails.root.join('app/assets/javascripts/routes.js')) end end
您将希望始终重新加载路由,否则生成的文件将始终表示Rails路由文件的倒数第二个状态.我从未想过为什么……@H_502_3@
在我的application.js中,然后我删除了所有// =指令但jQuery指令(保持全局jQuery可用),并对所有其他模块使用require方法,以便browserify选择我想要包含的文件.@H_502_3@
所以这有点hacky,但确实有效.@H_502_3@