Den `@forward` i SASS
Denne artikkelen forklarer om @forward i SASS.
Vi skal forklare @forward på en lettfattelig måte, inkludert praktiske eksempler.
YouTube Video
Den @forward i SASS
Hva er @forward?
I SASS sitt modulsystem bruker du @use og @forward i stedet for @import. @forward er en viktig funksjon for å holde arkitekturen din ryddig. Det er en direktiv som brukes til å 'eksponere' variabler, mikser og funksjoner definert i andre filer. I stedet for å bruke det alene, fungerer det som et inngangspunkt som spesifiserer, 'Bruk dette modulen herfra.'.
1@forward "variables";- Denne koden betyr 'gjøre innholdet i
variables.scsstilgjengelig for bruk fra andre filer.'.
Forskjellen mellom @use og @forward
@use og @forward er begge syntakser for å håndtere moduler, men formålet deres er tydelig forskjellige. @use er en direktiv for å bruke elementer innenfor filen, og @forward er en direktiv for å gjøre elementer tilgjengelig for andre filer.
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";@userepresenterer avhengighetene som er nødvendige for implementeringen av den nåværende filen, mens@forwardfår filen til å fungere som et offentlig API-inngangspunkt. Å forstå denne forskjellen vil hjelpe deg å avgjøre hvor du skal bruke@forward.
Hvorfor er @forward nødvendig?
Når du legger til flere Sass-filer, må du kanskje skrive mange @use-setninger. Ved å bruke @forward kan du sentralisere alt til én enkelt inngangsfil.
1styles/
2├─ foundation/
3│ ├─ _variables.scss
4│ ├─ _mixins.scss
5│ └─ _index.scss
6└─ main.scss- I denne strukturen fungerer
_index.scsssom det 'offentlige API-et.'.
Grunnleggende bruk av @forward
La oss se på grunnleggende bruk av @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;- I stedet for å bruke denne variabelen direkte med
@use, grupperer du dem med@forward.
1// _index.scss
2@forward "variables";- På dette tidspunktet inneholder
_index.scssingenting; det er bare en reléfil.
Bruke moduler som har blitt @forwardet
I stedet for å bruke enkelte filer direkte med @use, bruker du bare indeksfilen som har gruppert @forwardene på konsumentsiden. Dette gjør at du kan bruke det som et stabilt grensesnitt uten å måtte kjenne til den interne strukturen.
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}- Med dette designet, selv om plasseringen av definerte variabler eller mixins endres, kan du endre den interne strukturen uten å måtte endre kode på konsumentsiden.
Kombinere flere moduler med @forward
I faktisk utvikling er det vanlig å dele opp variabler, mikser og funksjoner etter deres roller. @forward kan skrives flere ganger, noe som gjør det mulig å samle separate moduler i én offentlig API.
Nedenfor gir vi eksempler på mikser og funksjoner og viser et design som eksponerer dem utad som et enkelt grensesnitt.
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";- Ved å eksponere bare denne
index-filen utad, kan du skjule den interne strukturen og gi et brukervennlig grensesnitt for konsumenter.
Unngå navnekonflikter (as)
Hvis de samme variabel- eller mixin-navnene er definert i flere moduler, kan du bruke as med @forward for å legge til et prefiks ved eksponering for å unngå navnekonflikter.
1// Add a prefix when re-exporting to avoid name collisions
2@forward "variables" as var-*;Med denne koden vil $primary-color i variables bli eksponert med følgende navn:.
1// foundation.$var-primary-color- Denne metoden er en måte å tydelig definere designregler og skalere trygt på, og det er en essensiell teknikk, spesielt i store prosjekter eller delte biblioteker.
Skjule unødvendige medlemmer (hide)
Moduler kan inneholde variabler eller mixins kun ment for intern implementering. Ved å bruke hide kan du ekskludere dem når du videreeksponerer og hindre ekstern tilgang.
1// Re-export everything except internal debug variables
2@forward "variables" hide $debug-color;Med denne konfigurasjonen er $debug-color bare gyldig inne i modulen, noe som hjelper å forhindre utilsiktet bruk av konsumenter.
Spesifisere hvilke medlemmer som skal eksponeres (show)
Hvis du kun vil eksponere spesifikke mixins eller funksjoner, bruk show. Ved å begrense hva som eksponeres, kan du tydeliggjøre formålet med modulen og dens designintensjon.
1// Explicitly expose only selected mixins as the public API
2@forward "mixins" show button-reset, clearfix;- Ved å bruke
showpå denne måten, blir det tydelig ved første øyekast hvilke API-er som offisielt er tilgjengelige.
@forward kan ikke brukes alene
En viktig ting å merke seg er at variabler som er @forwardet ikke kan brukes i den samme filen.
1@forward "variables";
2
3.test {
4 color: $primary-color; // Error
5}@forwarder kun for 'videreeksponering,' og 'bruk' er rollen til@use.
Et eksempel på korrekt rollefordeling
I moduldesign for Sass er det ideelt å tydelig skille mellom det offentlige laget (API) og implementasjonslaget. @forward definerer det offentlige API-et, og @use bruker det fra implementasjonssiden.
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}- Med denne strukturen blir det tydelig hvilke deler som er offentlige grensesnitt og hvilke som er intern implementering, noe som gir bedre designgjennomskinnelighet.
Den avgjørende forskjellen fra @import
@import utvider alle importerede definisjoner til globalt scope. På den annen side eksponerer @use og @forward elementene eksplisitt og gir tilgang via namespaces.
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}- På grunn av denne forskjellen kan du forbedre vedlikeholdbarhet og sikkerhet betraktelig ved å hindre utilsiktet overskriving og avhengighetsforvirring.
Sammendrag
@forward er en viktig funksjon som støtter vedlikeholdbart design. Ved å være bevisst på 'hva som skal eksponeres og hva som skal skjules som intern implementering', blir stilstrukturen din sikrere og mer lesbar. Ved å bruke @use og @forward på riktig måte, kan du klargjøre avhengigheter og oppnå et design som er robust mot endringer.
Du kan følge med på artikkelen ovenfor ved å bruke Visual Studio Code på vår YouTube-kanal. Vennligst sjekk ut YouTube-kanalen.