Nach meinem Verständnis wird Ihr gesamter JavaScript-Code in eine Datei zusammengeführt. Rails macht dies standardmäßig, wenn es //= require_tree .
am Ende Ihrer application.js
-Manifestdatei hinzufügt.
Dies klingt wie ein Lebensretter, aber ich mache mir ein wenig Sorgen um seitenbezogenen JavaScript-Code. Wird dieser Code auf jeder Seite ausgeführt? Das Letzte, was ich möchte, ist, dass alle meine Objekte für jede Seite instanziiert werden, wenn sie nur auf einer Seite benötigt werden.
Besteht nicht auch das Risiko von konkurrierendem Code?
Oder setzen Sie einfach ein kleines script
-Tag am Ende der Seite, das einfach eine Methode aufruft, die den JavaScript-Code für die Seite ausführt?
Brauchen Sie dann nicht mehr require.js?
Danke
EDIT: Ich schätze alle Antworten... aber ich glaube nicht, dass sie wirklich das Problem ansprechen. Einige von ihnen handeln von Styling und scheinen nicht zuzutreffen... und andere erwähnen nur javascript_include_tag
... was ich weiß (offensichtlich...) aber anscheinend ist der Weg für Rails 3.1, zukünftig Ihren gesamten JavaScript-Code in eine Datei zu packen, anstatt einzelnes JavaScript am Ende jeder Seite zu laden.
Die beste Lösung, die ich mir vorstellen kann, ist, bestimmte Funktionen in div
-Tags mit id
s oder class
en zu packen. Im JavaScript-Code prüfen Sie einfach, ob die id
oder class
auf der Seite vorhanden ist, und wenn ja, führen Sie den entsprechenden JavaScript-Code aus. Auf diese Weise wird der JavaScript-Code nicht ausgeführt, wenn das dynamische Element nicht auf der Seite ist - obwohl er in der großen application.js
-Datei enthalten ist, die von Sprockets gebündelt wird.
Meine obige Lösung hat den Vorteil, dass z.B. wenn eine Suchleiste auf 8 der 100 Seiten enthalten ist, sie nur auf diesen 8 Seiten läuft. Außerdem müssen Sie den Code nicht auf 8 der Seiten der Website einfügen. Tatsächlich müssen Sie niemals wieder manuelle Skript-Tags auf Ihrer Website einfügen.
Ich denke, das ist die eigentliche Antwort auf meine Frage.
11 Stimmen
"Der Weg von Rails 3.1 ist es, alle deine JavaScript-Dateien in eine Datei zu packen, anstatt einzelne JavaScript-Dateien am Ende jeder Seite zu laden." — Nur weil das Rails-Kernteam wirklich schlecht darin ist, zu wissen, wie man JavaScript verwaltet. Kleine Dateien sind im Allgemeinen besser (siehe meine Kommentare anderswo). Wenn es um JavaScript geht, ist der Rails-Weg selten der richtige Weg (außer beim Asset-Pipeline, die wirklich gut ist, und der Förderung von CoffeeScript).
0 Stimmen
So werden Sie Ihre seitenbezogenen JS-Dateien auf jeder Seite einfügen? Ich denke, das ist eine Verschwendung, ich stimme ClosureCowboys Antwort mehr zu.
1 Stimmen
Hast du dir die akzeptierte Antwort auf diese Frage angesehen? stackoverflow.com/questions/6571753/…
0 Stimmen
Psh, ich denke, ich werde bei Require.js bleiben :) Es gibt einen Compiler für RequireJS, der die Dateien bündelt, auf die Ihr Modul verweist.
0 Stimmen
@beefjerky "Wirst du also deine seiten-spezifischen JS-Dateien auf jeder Seite einbinden?" Auf keinen Fall. Auf jeder Seite inkludiere ich nur die JS-Dateien, die ich tatsächlich für diese Seite benötige. Wenn sie ordnungsgemäß modularisiert sind, werden sie vom Browser schnell zwischengespeichert.
0 Stimmen
@Ziggy Es mag konsistent sein, aber es ist nicht gut. :)
0 Stimmen
Für diejenigen, die ein vollständiges Verständnis dafür haben möchten, wie dies funktioniert und was am besten ist, lesen Sie bitte railsapps.github.io/rails-javascript-include-external.html . Dies ist meiner Meinung nach die beste Dokumentation, die ich zu diesem Thema gesehen habe. Es ist nicht nur ein großartiges Nachschlagewerk für Rails, sondern auch für alle, die sich mit Webentwicklung beschäftigen. Deshalb ist es am besten, Dinge auf die Art von Rails zu tun. Ich werde sicherlich Unholy Rails für meine zukünftigen Fragen verwenden. - Hinweis: Dies ist mein Kommentar zu einer ähnlichen Frage für diejenigen, die sie schon einmal gesehen haben. - @MarnenLaibow-Koser Ich denke, dir wird diese Lektüre wirklich gefallen.
0 Stimmen
@DutGRIFF Obwohl dies eine der besseren Diskussionen ist, die ich zu einem oft missverstandenen Thema gesehen habe, ermutigt es genau die Art von großen Küchenspülk JS-Dateien, die ich vermeiden würde. Lesen Sie es aufgrund seiner Diskussion über die Pipeline, aber ignorieren Sie seine Empfehlungen.
1 Stimmen
@DutGRIFF Mit anderen Worten: Nein, es ist in diesem Fall nicht am besten, die Dinge auf die Rails-Art zu tun (oder zumindest nicht alles in
application.js
zu platzieren), und tatsächlich zeigt die von Ihnen bereitgestellte Referenz auf, warum das so ist: Das Herunterladen ist der langsamste Teil des JS-Ausführungsprozesses. Viele kleine Dateien sind besser im Cache speicherbar als eine große. Die Unheiligen Rails-Leute scheinen dann nicht zu erkennen, dass ihre Empfehlungen mit den Grundsätzen, an die sie sich halten wollen, unvereinbar sind, und ihre Empfehlungen sollten daher nicht ernst genommen werden.0 Stimmen
Ich stimme mit vielem von dem überein, was du sagst. Ich kann definitiv sehen, wo eine große Website mit vielen seiten-spezifischen Skripts Probleme mit der kitchen-sink JS-Datei haben könnte, aber sobald sie gecacht ist, könnte es für den Rest dieser Website eine gute Sache sein. Ich würde es hassen, eine extrem große JS-Datei auf meinem Mobilgerät (langsames Internet) zu laden, nur um einem Link zu einer anderen Website zu folgen. Zum Beispiel beim Bezahlen meiner Harley-Rechnung. Gute Informationen. Danke.
1 Stimmen
@DutGRIFF Nein, eine große JS-Datei wäre normalerweise auch nach dem Zwischenspeichern keine gute Sache. Siehe meine Kommentare an anderer Stelle auf dieser Seite: Kleinere Dateien können bestimmte Seiten besser ansprechen und feiner zwischengespeichert werden. Ich sehe keinen guten Anwendungsfall für eine einzelne große Datei, es sei denn, es gibt überhaupt keinen seitenbezogenen Code weder.
0 Stimmen
Ebenso für Rails 3: stackoverflow.com/questions/3437585/…
0 Stimmen
Wenn Sie die Asset-Pipeline und die CoffeeScript-Implementierung verwenden, können Sie hier JS in CoffeeScript umwandeln. js2coffee.org