需要使用Browserify和browserify-rails的sprockets预处理文件

时间:2014-11-20 16:08:29

标签: javascript ruby-on-rails sprockets js-routes browserify-rails

我正在使用browserify-rails并且我试图让sprockets预处理包含sprockets指令的文件,这样当我require()使用browserify时,它将包含生成的JavaScript。

sprockets指令尝试包含gem js-routes的输出,以便允许我从客户端访问Rails路由。


这是我的设置(app/assets/javascripts内):

system/
  rails_routes.js
application.js

application.js是主文件,它运行应用程序的其余部分。我希望能够做类似

的事情
var rr = require("./system/rails_routes.js");

,然后访问路由对象。


system/react_routes.js内,我有以下内容:

//= require js-routes

console.log("Does this work?");

(另外,我配置js-routes将输出放在名为module.exports的对象中,以符合CommonJS模型,如railsware/js-routes#121中所述

唯一的问题是,当我查看生成的bundle时,sprockets指令仍然存在且尚未展开。

console.log调用也在那里,并在我require()模块时执行。

有没有办法让它发挥作用?在使用browserify-rails捆绑文件之前让链接器预处理文件的正确方法是什么?

1 个答案:

答案 0 :(得分:8)

我花了无数个小时在我的项目中集成browserify-rails并让JS Routes在这个设置中工作......

我来到下面描述的解决方案是我无法在Browserify进入之前让Sprockets预先处理我的路由文件的结果。我在browserify-rails的源代码中花了很长时间链轮,但无法找到扭转局面的方法,让每个组件按照正确的顺序运行。

所以我的解决方案是使用Rails挂钩在开发环境中“手动”生成完整的JS文件,以便路由始终与最新的Rails路由文件保持同步。然后我假设路线JS文件在推送到生产时将是最新的。

在环境加载中执行此操作可确保在Sprockets / browserify chime in之前JS文件已准备就绪:对于它们来说,它只是另一个普通的JS文件。

以下是development.rb中包含的代码:

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路由文件的倒数第二个状态。我从未弄清楚为什么......

在我的application.js中,我刚删除了所有//=指令,但删除了jQuery指令(以保持全局jQuery可用),并将require方法用于所有其他模块,以便browserify会选择我想要包含的文件。

所以这有点hacky,但确实有效。

我有兴趣看看对Sprockets管道有更好了解的人是否可以提供更好的解决方案?