Das `@forward` in SASS
Dieser Artikel erklärt das @forward in SASS.
Wir erklären @forward auf verständliche Weise, einschließlich praktischer Beispiele.
YouTube Video
Das @forward in SASS
Was ist @forward?
Im Modulsystem von SASS verwendet man @use und @forward anstelle von @import. @forward ist eine wichtige Funktion, um Ihre Architektur sauber zu halten. Es ist eine Direktive, mit der Variablen, Mixins und Funktionen, die in anderen Dateien definiert sind, 'exponiert' werden. Statt es alleine zu verwenden, dient es als Einstiegspunkt, der angibt: 'Dieses Modul ab hier verwenden.'.
1@forward "variables";- Dieser Code bewirkt, dass der Inhalt von
variables.scssvon anderen Dateien aus nutzbar gemacht wird.
Unterschied zwischen @use und @forward
@use und @forward sind beides Syntaxen zur Handhabung von Modulen, aber ihre Zwecke sind eindeutig verschieden. @use ist eine Direktive, um Elemente innerhalb einer Datei zu verwenden, und @forward ist eine Direktive, um Elemente für andere Dateien verfügbar zu machen.
1// @use: import the module for use in this file
2@use "variables";
3
4// @forward: re-export the module for other files to consume
5@forward "variables";@usezeigt die für die Implementierung der aktuellen Datei notwendigen Abhängigkeiten an, während@forwarddie Datei als öffentlichen API-Einstiegspunkt nutzbar macht. Dieses Verständnis hilft Ihnen zu entscheiden, wo Sie@forwardeinsetzen sollten.
Warum ist @forward notwendig?
Wenn Sie mehr Sass-Dateien hinzufügen, müssen Sie möglicherweise viele @use-Anweisungen schreiben. Durch die Nutzung von @forward können Sie alles in einer einzigen Einstiegsdatei zentralisieren.
1styles/
2├─ foundation/
3│ ├─ _variables.scss
4│ ├─ _mixins.scss
5│ └─ _index.scss
6└─ main.scss- In dieser Struktur dient
_index.scssals öffentliche API.
Grundlegende Verwendung von @forward
Schauen wir uns die grundlegende Anwendung von @forward an.
1// _variables.scss
2// Color definitions used across the project
3
4$primary-color: #006ab1;
5$secondary-color: #e0f0ff;
6
7// Internal use only (will be hidden via @forward hide)
8$debug-color: magenta;- Statt diese Variable direkt mit
@useeinzubinden, gruppieren Sie sie mittels@forward.
1// _index.scss
2@forward "variables";- Zu diesem Zeitpunkt enthält
_index.scssnichts; es ist nur eine Weiterleitungsdatei.
Verwenden von Modulen, die mit @forward weitergegeben wurden
Anstatt einzelne Dateien direkt mit @use einzubinden, verwenden Sie auf der Konsumentenseite nur die Indexdatei, die die @forwards gruppiert hat. So können Sie es als stabile Schnittstelle benutzen, ohne die interne Struktur kennen zu müssen.
1// main.scss
2// Import the public API of the foundation layer
3@use "foundation";
4
5.button {
6 background-color: foundation.$primary-color;
7}- Mit diesem Design können Sie selbst dann, wenn sich die Definitionen von Variablen oder Mixins ändern, die interne Struktur austauschen, ohne Code bei den Konsumenten anpassen zu müssen.
Kombinieren mehrerer Module mit @forward
In der tatsächlichen Entwicklung ist es üblich, Variablen, Mixins und Funktionen entsprechend ihrer Rollen aufzuteilen. @forward kann mehrfach verwendet werden, wodurch Sie getrennte Module zu einer einzigen öffentlichen API zusammenfassen können.
Unten geben wir Beispiele für Mixins und Funktionen und zeigen ein Design, das sie nach außen als einzige Schnittstelle zugänglich macht.
1// _mixins.scss
2// Reusable mixins for layout and components
3
4// Reset default button styles
5@mixin button-reset {
6 appearance: none;
7 background: none;
8 border: none;
9 padding: 0;
10 margin: 0;
11 font: inherit;
12 color: inherit;
13}
14
15// Clearfix utility
16@mixin clearfix {
17 &::after {
18 content: "";
19 display: table;
20 clear: both;
21 }
22}
23
24// Internal mixin (not intended to be part of the public API)
25@mixin debug-outline {
26 outline: 2px dashed red;
27} 1// _functions.scss
2// Utility functions for consistent styling
3
4@use "sass:math";
5
6// Convert px to rem based on a 16px root size
7@function rem($px) {
8 @return math.div($px, 16) * 1rem;
9}
10
11// Clamp a value between a minimum and maximum
12@function clamp-value($value, $min, $max) {
13 @return math.max($min, math.min($value, $max));
14}1// _index.scss
2// Re-export variables, mixins, and functions as a single public API
3@forward "variables";
4@forward "mixins";
5@forward "functions";- Indem Sie nur diese
index-Datei nach außen freigeben, können Sie die interne Struktur verbergen und eine benutzerfreundliche Schnittstelle für Konsumenten bieten.
Vermeidung von Namenskonflikten (as)
Wenn in mehreren Modulen dieselben Variablen- oder Mixin-Namen definiert sind, können Sie bei @forward mit as einen Präfix beim Exponieren hinzufügen, um Namenskonflikte zu vermeiden.
1// Add a prefix when re-exporting to avoid name collisions
2@forward "variables" as var-*;Mit diesem Code wird $primary-color aus variables unter folgendem Namen bereitgestellt:.
1// foundation.$var-primary-color- Diese Methode ist eine klare Möglichkeit, Designregeln zu definieren und sicher zu skalieren, und eine wesentliche Technik, insbesondere bei großen Projekten oder gemeinsam genutzten Bibliotheken.
Ausblenden unnötiger Mitglieder (hide)
Module können Variablen oder Mixins enthalten, die nur für die interne Implementierung gedacht sind. Mit hide können Sie diese beim erneuten Exponieren ausschließen und verhindern, dass darauf extern zugegriffen wird.
1// Re-export everything except internal debug variables
2@forward "variables" hide $debug-color;Mit dieser Konfiguration ist $debug-color nur im Modul selbst gültig, was hilft, eine versehentliche Nutzung durch Konsumenten zu vermeiden.
Festlegen, welche Mitglieder exponiert werden sollen (show)
Wenn Sie nur bestimmte Mixins oder Funktionen exponieren möchten, verwenden Sie show. Indem Sie beschränken, was exponiert wird, können Sie den Zweck des Moduls und die Absicht des Designs klarstellen.
1// Explicitly expose only selected mixins as the public API
2@forward "mixins" show button-reset, clearfix;- Indem Sie
showauf diese Weise verwenden, wird auf einen Blick klar, welche APIs offiziell verfügbar sind.
@forward kann nicht alleine verwendet werden
Ein wichtiger Punkt ist, dass Variablen, die mit @forward weitergegeben werden, nicht innerhalb derselben Datei verwendet werden können.
1@forward "variables";
2
3.test {
4 color: $primary-color; // Error
5}@forwardist nur zum Weitergeben da; das 'Verwenden' ist die Aufgabe von@use.
Ein Beispiel für eine sinnvolle Arbeitsteilung
Im Moduldseign für Sass ist es ideal, die öffentliche Ebene (API) klar von der Implementierungsebene zu trennen. @forward definiert die öffentliche API, und @use verwendet sie auf der Implementierungsseite.
1// _index.scss (public API)
2@forward "variables";
3@forward "mixins";1// _component.scss
2// Consume the public API of the foundation layer
3@use "foundation";
4
5.card {
6 color: foundation.$primary-color;
7}- Mit dieser Struktur ist klar erkennbar, welche Teile öffentlich und welche intern implementiert sind, was zu besserer Design-Transparenz führt.
Der grundlegende Unterschied zu @import
@import fügt alle importierten Definitionen dem globalen Geltungsbereich hinzu. Andererseits stellen @use und @forward Elemente gezielt bereit und greifen über Namespaces darauf zu.
1// @import (deprecated)
2// Everything is injected into the global scope
3$color: red;
4
5.button-import {
6 color: $color;
7}
8
9// @use + @forward (recommended)
10// Access values explicitly through a namespace
11@use "foundation";
12
13.button-use {
14 color: foundation.$primary-color;
15}- Aufgrund dieses Unterschieds können Sie die Wartbarkeit und Sicherheit erheblich verbessern, da unbeabsichtigte Überschreibungen und Abhängigkeitsverwechslungen verhindert werden.
Zusammenfassung
@forward ist eine wichtige Funktion zur Unterstützung eines gut wartbaren Designs. Wenn Sie sorgfältig entscheiden, 'was exponiert und was als interne Implementierung versteckt wird', wird Ihre Struktur sicherer und besser lesbar. Mit dem korrekten Einsatz von @use und @forward können Sie Abhängigkeiten klar darstellen und ein gegen Änderungen robustes Design erreichen.
Sie können den obigen Artikel mit Visual Studio Code auf unserem YouTube-Kanal verfolgen. Bitte schauen Sie sich auch den YouTube-Kanal an.