Właściwa struktura aktywów SCSS w Rails

Więc mam app/assets/stylesheets/ strukturę katalogów, która wygląda mniej więcej tak:

   |-dialogs
   |-mixins
   |---buttons
   |---gradients
   |---vendor_support
   |---widgets
   |-pages
   |-structure
   |-ui_elements

W każdym katalogu znajduje się wiele częściowych sass (Zwykle *.css.scss, ale jeden lub dwa *.css.scss.erb).

Mogę zakładać wiele, ale rails powinien automatycznie kompilować wszystkie pliki w tych katalogach z powodu *= require_tree . w aplikacji.css, tak?

Ostatnio próbowałem zrestrukturyzować te pliki, usuwając wszystkie zmienne kolorów i umieszczając je w pliku w katalogu głównym app/assets/stylesheets folder (_colors.css.scss). Następnie utworzyłem plik w katalogu głównym app/assets/stylesheets o nazwie master.css.scss który wygląda tak:

// Color Palette 
@import "colors";

// Mixins
@import "mixins/buttons/standard_button";
@import "mixins/gradients/table_header_fade";
@import "mixins/vendor_support/rounded_corners";
@import "mixins/vendor_support/rounded_corners_top";
@import "mixins/vendor_support/box_shadow";
@import "mixins/vendor_support/opacity";

Nie bardzo rozumiem, jak rails radzi sobie z kolejnością kompilacji aktywów, ale oczywiście nie jest to na moją korzyść. Wygląda na to, że żaden z plików nie zdaje sobie sprawy, że mają jakieś zmienne lub mixiny importowane, a więc rzuca błędy i nie mogę skompilować.

Undefined variable: "$dialog_divider_color".
  (in /home/blah/app/assets/stylesheets/dialogs/dialog.css.scss.erb)

Undefined mixin 'rounded_corners'.
  (in /home/blah/app/assets/stylesheets/widgets.css.scss)

Zmienna $dialog_divider_color jest jasno zdefiniowana w _colors.css.scss, a _master.css.scss importuje kolory i wszystkie moje mixiny. Ale widocznie rails nie dostali tej notki.

Czy Jest jakiś sposób, aby naprawić te błędy, czy będę musiał uciekać się do umieszczania wszystkich definicji zmiennych z powrotem w każdym pojedynczym pliku, jak również wszystkich importów Mixin?

Niestety, ten facet nie myśli, że to możliwe, ale mam nadzieję, że się myli. Wszelkie myśli są bardzo mile widziane.
Author: Community, 2012-02-04

5 answers

Problem z CSS polega na tym, że nie chcesz automatycznie dodawać wszystkich plików. Kolejność wczytywania i przetwarzania arkuszy przez przeglądarkę jest niezbędna. Tak więc zawsze będziesz wyraźnie importować cały swój css.

Jako przykład, powiedzmy, że masz normalizować.arkusz css , aby uzyskać domyślny wygląd zamiast wszystkich okropnych różnych implementacji przeglądarki. Powinien to być pierwszy plik wczytany przez przeglądarkę. Jeśli przypadkowo umieścisz ten arkusz gdzieś w Twój css importuje, wtedy nie tylko nadpisuje domyślne style przeglądarki, ale także wszelkie style zdefiniowane we wszystkich plikach css, które zostały załadowane przed nim. To samo dotyczy zmiennych i mieszanin.

Po obejrzeniu prezentacji przez Roy Tomeij na Euruko2012 zdecydowałem się na następujące podejście, jeśli masz dużo CSS do zarządzania.

Generalnie stosuję takie podejście:

  1. Zmień nazwę wszystkich istniejących .pliki css do .scss
  2. Usuń całą zawartość z podanie.scss

Zacznij dodawać dyrektywy @ import do application.scss.

Jeśli używasz Twittera Bootstrap i kilku własnych arkuszy css, musisz najpierw zaimportować bootstrap, ponieważ ma arkusz do resetowania stylów. Więc dodajesz @import "bootstrap/bootstrap.scss"; do swojego application.scss.

Bootstrap.plik scss wygląda następująco:

// CSS Reset
@import "reset.scss";

// Core
@import "variables.scss";
@import "mixins.scss";

// Grid system and page structure
@import "scaffolding.scss";

// Styled patterns and elements
@import "type.scss";
@import "forms.scss";
@import "tables.scss";
@import "patterns.scss";

A Twój application.scss Plik wygląda następująco:

@import "bootstrap/bootstrap.scss";

Ze względu na kolejność importu, możesz teraz używać zmiennych, ładowanych z @import "variables.scss"; w dowolnym innym .scss plik zaimportowany po nim. Więc mogą być używane w type.scss w folderze bootstrap, ale także w my_model.css.scss.

Następnie utwórz folder o nazwie partials lub modules. To będzie miejsce większości innych plików. Możesz po prostu dodać import do pliku application.scss, aby wyglądał następująco:

@import "bootstrap/bootstrap.scss";
@import "partials/*";

Teraz, jeśli zrobisz trochę css do stylu artykułu na swojej stronie głównej. Wystarczy utworzyć partials/_article.scss i zostanie ona dodana do skompilowanego application.css. Ze względu na kolejność importu możesz również użyć dowolnych mixinów bootstrap i zmiennych we własnych plikach scss.

Jedyną wadą tej metody, jaką do tej pory znalazłem, jest to, że czasami trzeba wymusić przekompilowanie częściowego/*.pliki scss, ponieważ rails nie zawsze robi to za Ciebie.

 121
Author: Benjamin Udink ten Cate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-28 16:46:49

Utwórz następującą strukturę folderów:

+ assets
|
--+ base
| |
| --+ mixins (with subfolders as noted in your question)
|
--+ styles
  |
  --+ ...

W folderze base Utwórz plik " globals.css.scss". W tym pliku zadeklaruj wszystkie importowane pliki:

@import 'base/colors';
@import 'base/mixins/...';
@import 'base/mixins/...';

W aplikacji.css.scss, powinieneś wtedy mieć:

*= require_self
*= depends_on ./base/globals.css.scss
*= require_tree ./styles

I jako ostatni krok (jest to ważne) zadeklaruj @import 'base/globals' w każdym pliku stylu, w którym chcesz użyć zmiennych lub mieszanin. Możesz wziąć to pod uwagę, ale podoba mi się pomysł, że musisz deklarować zależności swoich stylów w każdym pliku. Z oczywiście ważne jest, aby importować tylko mixiny i zmienne w globalach.css.scss, ponieważ nie dodają definicji stylów. W przeciwnym razie definicje stylów będą zawarte wiele razy w wstępnie skompilowanym pliku ...

 7
Author: emrass,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-08 13:18:42

Aby używać zmiennych i takich między plikami, musisz użyć dyrektywy @ import. pliki są importowane w określonej kolejności.

Następnie użyj aplikacji.css wymaga pliku deklarującego import. to jest sposób na osiągnięcie pożądanej kontroli.

Wreszcie, w twoim układzie.plik erb, możesz określić, którego pliku css użyć

Przykład będzie bardziej pomocny:

Załóżmy, że masz dwa moduły w swojej aplikacji, które wymagają różnych zestawów css: "aplikacja" i "admin"

Pliki

|-app/
|-- assets/
|--- stylesheets/
|     // the "master" files that will be called by the layout
|---- application.css
|---- application_admin.css
|
|     // the files that contain styles
|---- config.scss
|---- styles.scss
|---- admin_styles.scss
|
|     // the files that define the imports
|---- app_imports.scss
|---- admin_imports.scss
|
|
|-- views/
|--- layouts/
|---- admin.html.haml
|---- application.html.haml

Oto jak wyglądają pliki w środku:

-------- THE STYLES

-- config.scss
// declare variables and mixins
$font-size: 20px;

--  app_imports.scss
// using imports lets you use variables from `config` in `styles`
@import 'config'
@import 'styles'

-- admin_imports.scss
// for admin module, we import an additional stylesheet
@import 'config'
@import 'styles'
@import 'admin_styles'

-- application.css
// in the master application file, we require the imports
*= require app_imports
*= require some_other_stylesheet_like_a_plugin
*= require_self

-- application_admin.css
// in the master admin file, we require the admin imports
*= require admin_imports
*= require some_other_stylesheet_like_a_plugin
*= require_self


-------- THE LAYOUTS

-- application.html.haml
// in the application layout, we call the master css file
= stylesheet_link_tag "application", media: "all"

--  admin.html.haml
// in the admin layout, we call the admin master css file
= stylesheet_link_tag "application_admin", media: "all"
 6
Author: Doug Lee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-17 20:51:30

Zgodnie z to pytanie , można tylko używać application.css.sass w celu zdefiniowania importu i współdzielenia zmiennych między szablonami.

= > wydaje się, że to tylko kwestia nazwy.

Innym sposobem może być dołączenie wszystkiego i wyłączenie tego potoku .

 3
Author: Coren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:37

Miałem bardzo podobny problem. Pomogło mi umieszczenie podkreślenia do instrukcji @ import podczas importowania częściowego. Więc

@import "_base";

Zamiast

@import "base";
To może być dziwny błąd...
 1
Author: Bernát,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-13 08:20:42