Tôi đã tìm ra một cách thanh lịch, giống như Rails để làm điều đó. Đầu tiên, đổi tên .scss
tệp của bạn thành .scss.erb
, sau đó sử dụng cú pháp như thế này (ví dụ cho nội dung CSS gem_js-rails4 ):
@import "<%= asset_path("highlight_js/github") %>";
Tại sao bạn không thể lưu trữ tệp trực tiếp qua SCSS :
Thực hiện @import
trong SCSS hoạt động tốt cho các tệp CSS miễn là bạn sử dụng rõ ràng đường dẫn đầy đủ theo cách này hay cách khác. Trong chế độ phát triển, rails s
phục vụ tài sản mà không cần biên dịch chúng, vì vậy một đường dẫn như thế này hoạt động ...
@import "highlight_js/github.css";
... bởi vì đường dẫn được lưu trữ theo nghĩa đen /assets/highlight_js/github.css
. Nếu bạn nhấp chuột phải vào trang và "xem nguồn", sau đó nhấp vào liên kết cho biểu định kiểu với ở trên @import
, bạn sẽ thấy một dòng trong đó trông giống như:
@import url(highlight_js/github.css);
Công cụ SCSS dịch "highlight_js/github.css"
sang url(highlight_js/github.css)
. Điều này sẽ hoạt động một cách bơi lội cho đến khi bạn quyết định thử chạy nó trong sản xuất, nơi các tài sản được biên dịch trước có một hàm băm được chèn vào tên tệp. Tệp SCSS vẫn sẽ phân giải thành một tĩnh /assets/highlight_js/github.css
không được biên dịch trước và không tồn tại trong sản xuất.
Giải pháp này hoạt động như thế nào:
Đầu tiên, bằng cách di chuyển .scss
tệp đến .scss.erb
, chúng tôi đã biến SCSS thành một khuôn mẫu cho Rails một cách hiệu quả. Bây giờ, bất cứ khi nào chúng tôi sử dụng <%= ... %>
thẻ mẫu, bộ xử lý mẫu Rails sẽ thay thế các đoạn mã này bằng đầu ra của mã (giống như bất kỳ mẫu nào khác).
Nói rõ asset_path("highlight_js/github")
trong .scss.erb
tập tin có hai điều:
- Kích hoạt
rake assets:precompile
tác vụ để biên dịch trước tệp CSS thích hợp.
- Tạo một URL phản ánh thích hợp tài sản bất kể môi trường Rails.
Điều này cũng có nghĩa là công cụ SCSS thậm chí không phân tích tệp CSS; nó chỉ lưu trữ một liên kết đến nó! Vì vậy, không có bản vá khỉ khỉ hoặc cách giải quyết khác. Chúng tôi đang phục vụ một tài sản CSS thông qua SCSS như dự định và sử dụng URL để nói tài sản CSS như Rails dự định. Ngọt!