6

我正在使用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中所述)

唯一的问题是,当我查看生成的捆绑包时,sprockets 指令仍然存在并且没有展开。

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

有没有办法让它工作?在将文件与 browserify-rails 捆绑之前,让 sprockets 预处理文件的正确方法是什么?

4

1 回答 1

8

我花了无数时间在我的项目中集成 browserify-rails 并使 JS Routes 在这个设置中工作......</p>

我来到下面描述的解决方案是我无法在 Browserify 进入之前让 Sprockets 预处理我的路由文件的结果。我在 browserify-rails 和 sprockets 的源代码中花了相当长的时间,但不能找不到一种方法来扭转局面并让每个组件以正确的顺序运行以使其正常工作。

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

在环境加载中这样做可以确保 JS 文件在 Sprockets/browserify 启动之前准备好:对他们来说,这只是另一个普通的 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 管道有更好了解的人是否可以提供更好的解决方案?

于 2014-11-20T17:52:20.173 回答