需要带有浏览器化和浏览器化轨道的链轮预处理文件

Requiring a sprockets-preprocessed file with Browserify and browserify-rails

本文关键字:浏览器 文件 预处理 轨道      更新时间:2023-09-26

我正在使用browserify-rails,我正在尝试让sprockets预处理包含sprockets指令的文件,以便当我使用browserify require()它时,它将包含生成的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 中所述)

唯一的问题是,当我查看生成的捆绑包时,链轮指令仍然存在并且尚未扩展。

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

有没有办法让它工作?在将文件与浏览器化轨道捆绑之前让链轮预处理文件的正确方法是什么?

我花了无数的时间在我的项目中集成浏览器化轨道,并使 JS 路由在此设置中工作......

得出并在下面描述的解决方案是我无法在 Browserify 进入之前让 Sprockets 预处理我的路由文件的结果。我在浏览器化轨道和链轮的源代码上都花了相当长的时间,但找不到一种方法来扭转局面,让每个组件以正确的顺序工作。

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

环境加载中这样做可确保在 Sprockets/browserify 插话之前 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 方法,以便浏览器会选择我想要包含的文件。

所以这有点笨拙,但它确实有效。

我很想知道对 Sprockets 管道有更好了解的人是否可以提供更好的解决方案?