Ich fand einen eleganten, Rails-ähnlichen Weg, dies zu tun. Benennen Sie zuerst Ihre .scss
Datei in um .scss.erb
und verwenden Sie dann die folgende Syntax (Beispiel für das CSS-Asset "light_js-rails4 gem " ):
@import "<%= asset_path("highlight_js/github") %>";
Warum können Sie die Datei nicht direkt über SCSS hosten? :
Das Ausführen eines @import
in SCSS funktioniert für CSS-Dateien einwandfrei, solange Sie den vollständigen Pfad explizit auf die eine oder andere Weise verwenden. rails s
Versorgt Assets im Entwicklungsmodus, ohne sie zu kompilieren, sodass ein Pfad wie dieser funktioniert ...
@import "highlight_js/github.css";
... weil der gehostete Pfad buchstäblich ist /assets/highlight_js/github.css
. Wenn Sie mit der rechten Maustaste auf die Seite klicken und "Quelle anzeigen" und dann auf den Link für das Stylesheet mit den obigen Angaben klicken @import
, wird dort eine Zeile angezeigt, die wie folgt aussieht:
@import url(highlight_js/github.css);
Die SCSS-Engine übersetzt "highlight_js/github.css"
in url(highlight_js/github.css)
. Dies funktioniert reibungslos, bis Sie versuchen, es in der Produktion auszuführen, in der Assets vorkompiliert werden und ein Hash in den Dateinamen eingefügt wird. Die SCSS-Datei wird weiterhin in eine statische Datei aufgelöst /assets/highlight_js/github.css
, die nicht vorkompiliert wurde und in der Produktion nicht vorhanden ist.
So funktioniert diese Lösung:
Erstens haben wir durch Verschieben der .scss
Datei .scss.erb
das SCSS effektiv in eine Vorlage für Rails verwandelt. Nun, wann immer wir verwenden<%= ... %>
Vorlagen-Tags verwenden, ersetzt der Rails-Vorlagenprozessor diese Snippets durch die Ausgabe des Codes (genau wie bei jeder anderen Vorlage).
Das Angeben asset_path("highlight_js/github")
in der .scss.erb
Datei bewirkt zwei Dinge:
- Löst die
rake assets:precompile
Aufgabe zum Vorkompilieren der entsprechenden CSS-Datei aus.
- Generiert eine URL, die das Asset unabhängig von der Rails-Umgebung angemessen widerspiegelt.
Dies bedeutet auch, dass die SCSS-Engine nicht einmal die CSS-Datei analysiert. Es wird nur ein Link dazu gehostet! Es gibt also keine hokey Affenflecken oder grobe Problemumgehungen. Wir stellen ein CSS-Asset wie vorgesehen über SCSS bereit und verwenden eine URL zu diesem CSS-Asset wie beabsichtigt. Süss!