6

私はbrowserify-railsを使用しており、sprockets ディレクティブを含むファイルを前処理するようにスプロケットを取得しようとしています。これにより、 require()browserify を使用すると、生成された JavaScript が含まれます。

sprockets ディレクティブは、クライアント側から Rails ルートにアクセスできるようにするために、gem js-routesの出力を含めようとします。


これは私のセットアップです(内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?");

(余談ですが、 railsware/js-routes#121で説明されているように、CommonJS モデルに準拠するためにjs-routes、出力を というオブジェクトに配置するように構成しました)module.exports

唯一の問題は、生成されたバンドルを見ると、sprockets ディレクティブがまだそこにあり、展開されていないことです。

console.log呼び出しもそこにあり、モジュールを実行すると実行されますrequire()

これを機能させる方法はありますか?browserify-railsでファイルをバンドルする前に、スプロケットにファイルを前処理させる正しい方法は何ですか?

4

1 に答える 1

8

私は自分のプロジェクトに browserify-rails を統合し、このセットアップ内で JS Routes を機能させることに無限の時間を費やしました…</p>

私がたどり着き、以下に説明する解決策は、Browserify が入る前に Sprockets にルート ファイルを前処理させることができなかった結果です。私は browserify-rails と 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 ルート ファイルの最後から 2 番目の状態を表します。なぜだか分からなかった...

application.jsの. //=_require

したがって、これは少しハックですが、機能します。

Sprockets パイプラインの知識が豊富な人がより良い解決策を提供できるかどうかを知りたいですか?

于 2014-11-20T17:52:20.173 に答える