Ich habe diesen Teil des Leitfadens geschrieben.
Sie möchten definitiv nicht live in der Produktion kompilieren.
Wenn Sie kompiliert haben, geschieht Folgendes:
Jede Anforderung für eine Datei in / Assets wird an Sprockets übergeben. Bei der ersten Anforderung für jedes einzelne Asset wird es kompiliert und in dem Rache zwischengespeichert, der von Rails für den Cache verwendet wird (normalerweise im Dateisystem).
Bei nachfolgenden Anforderungen empfängt Sprockets die Anforderung und muss den Dateinamen mit dem Fingerabdruck nachschlagen, überprüfen, ob die Datei (Bild) oder Dateien (CSS und JS), aus denen das Asset besteht, nicht geändert wurden, und wenn eine zwischengespeicherte Version vorhanden ist, wird dies bereitgestellt.
Das ist alles im Assets-Ordner und in allen Lieferanten- / Assets-Ordnern, die von Plugins verwendet werden.
Das ist viel Aufwand, da der Code ehrlich gesagt nicht auf Geschwindigkeit optimiert ist.
Dies wirkt sich darauf aus, wie schnell das Asset über die Leitung zum Client geleitet wird, und wirkt sich negativ auf die Ladezeiten Ihrer Website aus.
Vergleichen Sie mit der Standardeinstellung:
Wenn Assets vorkompiliert werden und die Kompilierung deaktiviert ist, werden Assets kompiliert und mit einem Fingerabdruck versehen public/assets
. Sprockets gibt eine Zuordnungstabelle der einfachen Dateinamen mit Fingerabdruck an Rails zurück, und Rails schreibt diese in das Dateisystem. Die Manifestdatei (YML in Rails 3 oder JSON mit einem zufälligen Namen in Rails 4) wird beim Start von Rails in den Speicher geladen und zur Verwendung durch die Asset-Helper-Methoden zwischengespeichert.
Dies macht die Generierung von Seiten mit den richtigen Fingerabdruck-Assets sehr schnell, und die Bereitstellung der Dateien selbst erfolgt schnell vom Webserver aus dem Dateisystem. Beides dramatisch schneller als Live-Kompilierung.
Um den maximalen Vorteil der Pipeline und des Fingerabdrucks zu erzielen, müssen Sie auf Ihrem Webserver Header für die Zukunft festlegen und die GZIP-Komprimierung für JS- und CSS-Dateien aktivieren. Sprockets schreibt komprimierte Versionen von Assets, die Sie für die Verwendung auf Ihrem Server festlegen können, ohne dass dies für jede Anforderung erforderlich ist.
Dadurch werden Assets so schnell wie möglich und in der kleinstmöglichen Größe an den Client gesendet, wodurch die clientseitige Anzeige der Seiten beschleunigt und Anforderungen (mit Header in ferner Zukunft) reduziert werden.
Wenn Sie also live kompilieren, ist dies:
- Sehr langsam
- Fehlt die Komprimierung
- Beeinflusst die Renderzeit von Seiten
Gegen
- So schnell wie möglich
- Komprimiert
- Entfernen Sie die vom Server belauschte Komprimierung (optional).
- Minimieren Sie die Renderzeit von Seiten.
Bearbeiten: (Antwort auf nachfolgenden Kommentar)
Die Pipeline könnte bei der ersten Anforderung geändert werden, um vorkompiliert zu werden, aber es gibt einige wichtige Hindernisse dafür. Das erste ist, dass es eine Nachschlagetabelle für Namen mit Fingerabdrücken geben muss, oder die Hilfsmethoden sind zu langsam. Unter einem Compile-on-Demand-Szenario müsste es eine Möglichkeit geben, an die Nachschlagetabelle anzuhängen, wenn jedes neue Asset kompiliert oder angefordert wird.
Außerdem müsste jemand den Preis für eine langsame Lieferung von Vermögenswerten für einen unbekannten Zeitraum zahlen, bis alle Vermögenswerte zusammengestellt und vorhanden sind.
Die Standardeinstellung, bei der der Preis für die Kompilierung alles gleichzeitig offline bezahlt wird, wirkt sich nicht auf die öffentlichen Besucher aus und stellt sicher, dass alles funktioniert, bevor die Dinge live gehen.
Der Deal-Breaker ist, dass es Produktionssystemen viel Komplexität verleiht.
[Bearbeiten, Juni 2015] Wenn Sie dies lesen, weil Sie nach einer Lösung für langsame Kompilierungszeiten während einer Bereitstellung suchen, können Sie die Assets lokal vorkompilieren. Informationen hierzu finden Sie im Asset-Pipeline-Handbuch . Auf diese Weise können Sie nur dann lokal vorkompilieren, wenn eine Änderung vorliegt, diese festschreiben und dann eine schnelle Bereitstellung ohne Vorkompilierungsphase durchführen.