Strukturierung von Sass: Abschied von der Ambiguität des Atomdesigns
() translation by (you can also view the original English article)
Atomic Design ist eine Methode, die eine sinnvolle Codestruktur für Stylesheets beschreibt. Es hat eine große Anhängerschaft, aber ich finde, dass seine Namenskonventionen manchmal mehrdeutig sein können. Was ist ein Molekül? Was ist ein Organismus? Woher wissen wir, wo wir die Grenze zwischen den beiden ziehen sollen? Diese besonderen Fragen scheinen der größte Stolperstein für die Interpretation einer atomaren Architektur zu sein.
Heute werden wir diskutieren, was ich verwende, welche Facetten der Konventionen von Atomic Design, mit denen ich zu kämpfen habe, was ich getan habe, um meine Probleme zu lösen, und wie ich Sass derzeit beispielsweise anhand des 7-1-Musters organisiere.
Atomare Struktur
"Wir entwerfen keine Seiten, wir entwerfen Systeme von Komponenten." - Stephen Heu
Ich liebe atomares Design und seine Ideologien, aber ich habe festgestellt, dass sie zusammenbrechen können, wenn sie mit Teammitgliedern zusammenarbeiten, die nicht genau wissen, wie das alles funktioniert. In der Vergangenheit habe ich folgende Ordnerstruktur verwendet:
Ordnerorganisation: root/css/src/
1 |
- vars |
2 |
- functions |
3 |
- mixins |
4 |
- base |
5 |
- plugins |
6 |
- typography |
7 |
- atoms |
8 |
- molecules |
9 |
- organisms |
10 |
- templates |
11 |
- pages |
12 |
- states |
13 |
- utility |
14 |
style.scss |
Innerhalb von style.scss
werden Sass-Partials mit gulp-sass-glob-import importiert:
Sass-Importindexdatei: root/css/src/style.scss
1 |
// Config |
2 |
@import "vars/*"; |
3 |
@import "functions/*"; |
4 |
@import "mixins/*"; |
5 |
|
6 |
// Bower Components |
7 |
@import "../bower_components/normalize-scss/_normalize"; |
8 |
|
9 |
// General DOM selector styles |
10 |
@import "base/*"; |
11 |
|
12 |
// Fonts & General Type Styling |
13 |
@import "typography/*"; |
14 |
|
15 |
// 3rd Party Addons |
16 |
@import "plugins/*"; |
17 |
|
18 |
// Atomic Design |
19 |
@import "atoms/**/*"; |
20 |
@import "molecules/**/*"; |
21 |
@import "organisms/**/*"; |
22 |
@import "templates/**/*"; |
23 |
@import "pages/**/*"; |
24 |
|
25 |
// Variations thru Events |
26 |
@import "states/*"; |
27 |
|
28 |
// General UI Helpers |
29 |
@import "utility/*"; |
Die Reihenfolge mit diesem Setup ist ziemlich wichtig. Wenn ein "atom", ein "molecule" oder ein "organism" angepasst werden muss, überschreiben Deklarationen in Vorlagen oder Seiten die oben genannten Teile sowie alle anderen vorhergehenden Teile.
Die Reihenfolge ermöglicht zusätzlich das Überschreiben des Stils eines Plugins, falls dies erforderlich sein sollte (und dies ist meiner Erfahrung nach normalerweise der Fall).
Verzeichnisinhalt
Ein Großteil des Inhalts für jedes Atomverzeichnis (Atome, Moleküle, Organismen, Vorlagen, Seiten) enthält Teilbereiche, die theoretisch leicht zu finden und bei Bedarf leicht zu verwalten sind.
1 |
- atoms |
2 |
- _buttons.scss |
3 |
- _links.scss |
4 |
- _inputs.scss |
5 |
- molecules |
6 |
- _navigation.scss |
7 |
- _search-form.scss |
8 |
- _contact-form.scss |
9 |
- organisms |
10 |
- _header.scss |
11 |
- _footer.scss |
12 |
- _content.scss |
13 |
- templates |
14 |
- _sticky-footer.scss |
15 |
- _grid-2column.scss |
16 |
- _grid-3column.scss |
17 |
- pages |
18 |
- _home.scss |
19 |
- _about.scss |
20 |
- _contact.scss |
Die Organisation erscheint sinnvoll, wenn Sie mit Atomic Design vertraut sind, aber für jemanden, der mit dem Ansatz und der Nomenklatur nicht vertraut ist, zu kurz kommt. Ein Entwickler, der Atomic Design nicht kennt, hat keinen Sinn für die Tatsache, dass sich ein Suchformular im molecules
verzeichnis befindet, und kann die Suche in anderen Bereichen starten, um Änderungen vorzunehmen, oder einfach frustriert sein un eine neue Datei erstellen. Ich habe es gesehen.
Eine Komponentenstruktur
Zum Zeitpunkt dieses Schreibens verfolge ich einen Ansatz, bei dem Elemente vollständig als Komponenten wie Legoblöcke betrachtet werden, wodurch eine Benutzerfreundlichkeit für alle an der Codebasis Beteiligten geschaffen wird. Schauen Sie sich die folgende Verzeichnisstruktur an:
1 |
- vars |
2 |
- functions |
3 |
- mixins |
4 |
- base |
5 |
- typography |
6 |
- plugins |
7 |
- toolbox |
8 |
- components |
9 |
- layout |
10 |
- pages |
11 |
- states |
12 |
- utility |
13 |
style.scss |
Hoffentlich können Sie an diesem Beispiel erkennen, dass es ziemlich intuitiv ist, den Zweck jedes Ordners zu erfassen (mit Ausnahme der toolbox). In "Toolbox" können Helfer gespeichert werden, die nichts mit Dienstprogrammen zu tun haben, z. B. benutzerdefinierte Klassen für Layout- und Objektmuster, benutzerdefinierte Keyframe-Animationen usw. Diese Werkzeugbox-Elemente werden für mich normalerweise als Teile angezeigt, die ich möglicherweise überschreibe oder in Zukunft verwenden möchte, und warum sie vor dem Komponentenverzeichnis importiert werden.
Zu diesem Zeitpunkt werden Partials wie folgt in den Styles-Index geladen:
1 |
// Config |
2 |
@import "vars/**/**"; |
3 |
@import "functions/*"; |
4 |
@import "mixins/*"; |
5 |
|
6 |
// UI |
7 |
@import "../bower_components/normalize-scss/_normalize"; |
8 |
@import "base/*"; // general styling using DOM element selectors |
9 |
@import "typography/*"; |
10 |
@import "plugins/**/*"; // 3rd party add-ons |
11 |
@import "toolbox/**/*"; // Non-Utility Helpers |
12 |
@import "components/**/*"; // lego blocks |
13 |
@import "layout/**/*"; |
14 |
@import "pages/**/*"; |
15 |
@import "states/**/*"; |
16 |
@import "utility/**/*"; |
"Components" enthalten Teile der Benutzeroberfläche wie Schaltflächen, Eingaben, Logos, Avatare, Kopf- und Fußzeilen, Formulare und sogar Module wie Navigation. Komponenten können alles sein, solange sie eine Sache und nur eine Sache tun, wiederverwendbar, projektübergreifend wiederverwendet und vor allem unabhängig; Keine schlechte Definition, um allgemein verstanden zu werden, wenn Sie mich fragen. Dieser spezielle Ansatz implementiert auch verschiedene Ideen aus SMACSS (Status) und Atomic Design (Vorlagen - in diesem Beispiel Layout genannt - und Seiten).
In Bezug auf die Suche ist es viel einfacher, das Komponentenverzeichnis zu finden und den entsprechenden Schnittstellenteil zu finden, den ein Entwickler möglicherweise aufspürt. beispielsweise:
1 |
- components |
2 |
- _buttons.scss |
3 |
- _navigation.scss |
4 |
- _masthead.scss |
5 |
- _footer.scss |
6 |
- _logo.scss |
7 |
- _avatar.scss |
8 |
- _contact-form.scss |
9 |
- _sales-calculator.scss |
Komponenten sind im Wesentlichen ein One-Stop-Shop. Atomic Design funktioniert möglicherweise perfekt für ein Team von einem oder sogar für ein Team, das sehr vertraut ist, aber in einem größeren Team ist die Frustration zu spüren.
Abschluss
Atomic Design kann absolut verwendet werden, um das Design der Elemente auf ein Minimum zu beschränken und aussagekräftige und wiederverwendbare Schnittstellenkomponenten zu erstellen. Aber Sie können bestimmte Aspekte verwirrend finden. Entscheiden Sie selbst, was für Sie am besten funktioniert, und ziehen Sie daraus Schlussfolgerungen. Wie bei allem ist dies nur meine Erfahrung und andere mögen eine andere Haltung einnehmen.
Ich würde gerne hören, wie Sie sich diesem Szenario selbst nähern. Lassen Sie es mich in den Kommentaren wissen. Viel Spaß beim Codieren!