Il `@forward` in SASS
Questo articolo spiega il @forward in SASS.
Spiegheremo @forward in modo semplice e comprensibile, includendo esempi pratici.
YouTube Video
Il @forward in SASS
Cos'è @forward?
Nel sistema a moduli di SASS, si usano @use e @forward invece di @import. @forward è una funzionalità importante per mantenere pulita l'architettura. È una direttiva utilizzata per 'esporre' variabili, mixin e funzioni definite in altri file. Piuttosto che essere usato da solo, funge da punto di ingresso specificando 'Usa questo modulo da qui.'.
1@forward "variables";- Questo codice significa 'rendere il contenuto di
variables.scssdisponibile per l’uso da altri file.'.
Differenza tra @use e @forward
@use e @forward sono entrambe sintassi per la gestione dei moduli, ma i loro scopi sono chiaramente diversi. @use è una direttiva per usare elementi all’interno del file, mentre @forward è una direttiva per rendere elementi disponibili ad altri file.
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";@userappresenta le dipendenze necessarie per l’implementazione del file corrente, mentre@forwardfa sì che il file funga da entry point API pubblica. Capire questa differenza ti aiuterà a decidere dove usare@forward.
Perché @forward è necessario?
Aggiungendo più file Sass, potresti dover scrivere molte istruzioni @use. Usando @forward, puoi centralizzare tutto in un unico file di ingresso.
1styles/
2├─ foundation/
3│ ├─ _variables.scss
4│ ├─ _mixins.scss
5│ └─ _index.scss
6└─ main.scss- In questa struttura,
_index.scssfunge da 'API pubblica.'.
Uso di base di @forward
Vediamo l’uso di base di @forward.
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;- Invece di usare direttamente questa variabile con
@use, le raggruppi con@forward.
1// _index.scss
2@forward "variables";- A questo punto,
_index.scssnon contiene nulla; è solo un file di passaggio.
Utilizzare i moduli che sono stati @forwardati
Invece di usare direttamente i singoli file con @use, dal lato consumatore usi solo il file index che ha raggruppato i vari @forward. Questo permette di usarlo come un’interfaccia stabile senza preoccuparsi della struttura interna.
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}- Con questo design, anche se cambiano le posizioni delle definizioni di variabili o mixin, puoi cambiare la struttura interna senza modificare il codice lato consumatore.
Combinare più moduli con @forward
Nello sviluppo reale, è comune suddividere variabili, mixin e funzioni in base ai loro ruoli. @forward può essere utilizzato più volte, consentendo di raggruppare moduli separati in una sola API pubblica.
Di seguito, forniamo esempi di mixin e funzioni e mostriamo un design che li espone all’esterno come un'unica interfaccia.
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";- Esporre solo questo file
indexverso l’esterno permette di nascondere la struttura interna e fornire un’interfaccia intuitiva ai consumatori.
Prevenire conflitti di nome (as)
Se gli stessi nomi di variabili o mixin sono definiti in moduli diversi, si può specificare as su @forward per aggiungere un prefisso durante l’esposizione ed evitare conflitti di nome.
1// Add a prefix when re-exporting to avoid name collisions
2@forward "variables" as var-*;Con questo codice, $primary-color in variables sarà esposto con il seguente nome:.
1// foundation.$var-primary-color- Questo metodo è un modo per definire chiaramente le regole di design e scalare in sicurezza, ed è una tecnica essenziale soprattutto in progetti su larga scala o librerie condivise.
Nascondere membri non necessari (hide)
I moduli possono contenere variabili o mixin destinati solo all’implementazione interna. Usando hide, puoi escluderli durante la ri-esposizione ed evitare che siano accessibili all’esterno.
1// Re-export everything except internal debug variables
2@forward "variables" hide $debug-color;Con questa configurazione, $debug-color è valido solo all’interno del modulo, impedendo un uso accidentale da parte dei consumatori.
Specificare quali membri esporre (show)
Se vuoi esporre solo determinati mixin o funzioni, usa show. Limitando ciò che viene esposto, è possibile chiarire lo scopo del modulo e l’intento del design.
1// Explicitly expose only selected mixins as the public API
2@forward "mixins" show button-reset, clearfix;- Usando
showin questo modo, diventa subito chiaro quali API sono disponibili ufficialmente.
@forward non può essere usato da solo
È importante ricordare che le variabili @forwardate non possono essere usate all’interno di quel file.
1@forward "variables";
2
3.test {
4 color: $primary-color; // Error
5}@forwardserve solo a 'ri-esporre', mentre 'usare' è il ruolo di@use.
Un esempio di corretta separazione dei ruoli
Nel design a moduli per Sass, è ideale separare chiaramente il livello pubblico (API) dal livello di implementazione. @forward definisce l’API pubblica, mentre @use la consuma dal lato implementazione.
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}- Con questa struttura, diventa chiaro quali parti sono interfacce pubbliche e quali implementazioni interne, migliorando la trasparenza del design.
La differenza definitiva rispetto a @import
@import espande tutte le definizioni importate nello scope globale. Al contrario, @use e @forward espongono esplicitamente elementi e li rendono accessibili tramite namespace.
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}- Grazie a questa differenza, puoi migliorare notevolmente la manutenibilità e la sicurezza evitando sovrascritture involontarie e confusione tra dipendenze.
Riepilogo
@forward è una funzionalità importante che supporta un design manutenibile. Essendo attento a 'cosa esporre e cosa nascondere come implementazione interna', la tua struttura di stile diventa più sicura e leggibile. Usando correttamente @use e @forward, puoi chiarire le dipendenze e ottenere un design robusto ai cambiamenti.
Puoi seguire l'articolo sopra utilizzando Visual Studio Code sul nostro canale YouTube. Controlla anche il nostro canale YouTube.