Wymyśliłem elegancki, podobny do Railsów sposób na zrobienie tego. Najpierw zmień nazwę .scss
pliku na .scss.erb
, a następnie użyj następującej składni (przykład zasobu CSS highlight_js-rails4 gem ):
@import "<%= asset_path("highlight_js/github") %>";
Dlaczego nie możesz hostować pliku bezpośrednio przez SCSS :
Wykonywanie @import
w SCSS działa dobrze dla plików CSS, o ile jednoznacznie używasz pełnej ścieżki w taki czy inny sposób. W trybie programowania rails s
obsługuje zasoby bez ich kompilowania, więc ścieżka taka jak ta działa ...
@import "highlight_js/github.css";
... ponieważ hostowana ścieżka jest dosłownie /assets/highlight_js/github.css
. Jeśli klikniesz prawym przyciskiem myszy stronę i „wyświetlisz źródło”, a następnie klikniesz link do arkusza stylów z powyższym @import
, zobaczysz tam linię, która wygląda następująco:
@import url(highlight_js/github.css);
Silnik SCSS przekłada się "highlight_js/github.css"
na url(highlight_js/github.css)
. Będzie to działało płynnie, dopóki nie zdecydujesz się spróbować uruchomić go w środowisku produkcyjnym, w którym zasoby są wstępnie skompilowane, a do nazwy pliku wstawiony jest skrót. Plik SCSS nadal będzie przekształcony w plik statyczny, /assets/highlight_js/github.css
który nie został wstępnie skompilowany i nie istnieje w środowisku produkcyjnym.
Jak działa to rozwiązanie:
Po pierwsze, przenosząc .scss
plik do .scss.erb
, skutecznie zmieniliśmy SCSS w szablon dla Railsów. Teraz, ilekroć używamy <%= ... %>
tagów szablonów, procesor szablonów Railsów zamieni te fragmenty kodem wyjściowym kodu (tak jak każdy inny szablon).
Podanie asset_path("highlight_js/github")
w .scss.erb
pliku ma dwie rzeczy:
- Uruchamia
rake assets:precompile
zadanie, aby wstępnie skompilować odpowiedni plik CSS.
- Generuje adres URL, który odpowiednio odzwierciedla zasób, niezależnie od środowiska Rails.
Oznacza to również, że silnik SCSS nawet nie analizuje pliku CSS; to tylko hosting linku do niego! Więc nie ma łatek małp hokey ani rażących obejść. Obsługujemy zasób CSS za pośrednictwem SCSS zgodnie z przeznaczeniem i używamy adresu URL do wspomnianego zasobu CSS zgodnie z przeznaczeniem Railsów. Słodkie!