6

Ich benutze browserify-rails und ich versuche, Ritzel zu erhalten, um eine Datei vorverarbeiten, die eine Ritzeldirektive enthält, so dass wenn ich require() es mit browserify, wird es enthalten das generierte JavaScript.Benötigt eine Rakete-vorverarbeitete Datei mit Browserify und browserify-rails

Die Anweisung kinkets versucht, die Ausgabe des Gems js-routes einzuschließen, damit ich von den Clients aus auf die Rails-Routen zugreifen kann.


Dies ist mein Setup (innerhalb app/assets/javascripts):

system/ 
    rails_routes.js 
application.js 

application.js die Hauptdatei ist, und es läuft den Rest der Anwendung. Ich möchte in der Lage sein, etwas zu tun, wie

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

darin, und erhalten Sie Zugriff auf die Routen-Objekt.


Innerhalb system/react_routes.js, habe ich folgendes:

//= require js-routes 

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

(wie Nebenbei bemerkt, konfiguriert I js-routes die Ausgabe in einem Objekt module.exports, genannt zu platzieren, so mit dem Commonjs Modell entsprechen, wie beschrieben in railsware/js-routes#121)

Das einzige Problem ist, dass, wenn ich auf das generierte Bundle schaue, die Ritzel-Direktive immer noch da ist und nicht erweitert wurde.

Der console.log Aufruf ist auch da und wird ausgeführt, wenn ich das Modul require().

Gibt es eine Möglichkeit, dies zum Laufen zu bringen? Was ist der richtige Weg, um Ritzel vorverarbeiten eine Datei vor der Bündelung mit browsery-Rails?

Antwort

8

ich endlose Stunden damit verbracht habe auf die Integration browserify-Schienen in meinem Projekt und machen JS Routen in diesem Setup arbeiten ...

Die Lösung kam ich zu und weiter unten beschrieben ist das Ergebnis von mir nicht Ketten in der Lage zu haben pre-process meine routes-Datei, bevor Browserify kommen würde. Ich habe ziemlich viel Zeit sowohl im Quellcode von browserify-rails als auch in rackets verbracht, konnte aber keine Möglichkeit finden, die Dinge umzuleiten und jede Komponente in der richtigen Reihenfolge zu betreiben das funktioniert.

Meine Lösung bestand also darin, einen Rails-Hook zu verwenden, um die komplette JS-Datei «von Hand» in der Entwicklungsumgebung zu generieren, so dass die Routen mit den neuesten Rails-Routes-Dateien immer auf dem neuesten Stand sind. Ich nehme dann an, dass die Routen-JS-Datei auf dem neuesten Stand ist, wenn sie in Produktion geht.

Tun Sie dies in der Umgebung geladen wird, stellt sicher, dass die JS-Datei bereit ist, bevor Ringtones/browserygime in: für sie ist es nur eine andere JS-Datei.

Hier ist der Code enthalten in 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 

Sie wollen werden immer Wege neu zu laden, da sonst die erzeugte Datei wird immer die vorletzte Status der Datei Rails Routen darstellen. Ich habe nie herausgefunden, warum ...

In meinem application.js habe ich dann alle //= Richtlinien nur entfernt, sondern die jQuery one (eine globale jQuery verfügbar zu halten), und verwendet, um die require Methode für alle anderen Module, so dass browserify die Dateien auswählen würde ich aufnehmen möchten.

Also das ist ein bisschen hacky, aber es funktioniert.

Ich wäre interessiert zu sehen, ob jemand mit besseren Kenntnissen der Sprockets-Pipeline mit einer besseren Lösung kommen könnte?

+1

Vielen Dank für diese Lösung. Ich kann bestätigen, dass es funktioniert! –

+0

wieder, froh zu helfen;) –