SASS-moduler
Denne artikel forklarer SASS-moduler.
Vi forklarer, hvordan man modulariserer SASS ved hjælp af @use og @forward, og hvordan man genbruger variable, mixins, funktioner, temaindstillinger og offentlige API'er.
YouTube Video
SASS-moduler
SASS’ modul-system hjælper med at afgrænse stilarter tydeligt og giver et design, der er nemt at genbruge og vedligeholde.
Grundlæggende begreber for moduler
SASS-moduler løser problemer med global navnerumsforurening og uklare afhængigheder, som var til stede med den gamle @import. Hver fil indlæses som et modul med sit eget navnerum, og kun de elementer, der eksplicit eksporteres, er tilgængelige fra andre filer.
Eksempel på filstruktur
Her er først et eksempel på en realistisk projektstruktur. Herunder ses et eksempel på et lille designsystem.
1styles/
2├─ _variables.scss
3├─ _mixins.scss
4├─ _functions.scss
5├─ components/
6│ ├─ _button.scss
7│ └─ _card.scss
8├─ utilities/
9│ └─ _helpers.scss
10└─ main.scss- Denne struktur gør det nemt at modulopdele, teste og udskifte dele.
- Partial-filer har en understregning i begyndelsen af filnavnet.
Grundlæggende om @use
@use indlæser et modul og giver et navnerum. Dette forhindrer navnekollisioner og gør kilde-modulet tydeligt.
1// _variables.scss
2$primary-color: #0a74da;
3$padding-base: 12px;- Denne fil er simpel og definerer kun variabler. Variabler udgivet fra et modul kan tilgås direkte ved hjælp af
@use.
1// main.scss
2@use 'variables';
3
4.example {
5 color: variables.$primary-color;
6 padding: variables.$padding-base;
7}- Her refereres
variables-modulet medvariables.-navnerummet. Denne tilgang gør oprindelsen af hvert element tydelig.
Forkortelse eller alias af navnerum
Brug af as giver dig mulighed for at forkorte navnerummet.
1@use 'variables' as vars;
2
3.btn {
4 color: vars.$primary-color;
5}- Dette er et eksempel på at importere
variablesved brug af det kortere aliasvars. Vælg navne baseret på, om du prioriterer læsbarhed eller nem indtastning.
Mixin-definition
Mixins og funktioner kan også defineres og bruges i moduler. At holde kommentarer i overensstemmelse med projektets konventioner hjælper med klarheden.
1// _mixins.scss
2// Create a simple responsive container mixin
3@mixin container($max-width: 1200px) {
4 width: 100%;
5 margin-left: auto;
6 margin-right: auto;
7 max-width: $max-width;
8}- Denne fil definerer en mixin til containere. Den tager argumenter og giver standardværdier.
1// main.scss
2@use 'mixins' as m;
3
4.wrapper {
5 @include m.container(1000px);
6}- Dette er et eksempel på at bruge en mixin med
@include.
Definering af funktioner
Funktioner bruges til at returnere værdier og kan defineres og genbruges inden for moduler. Ved at kapsle beregninger til designværdier ind i funktioner bliver stilarter mere stabile og lettere at vedligeholde.
1// _functions.scss
2@use 'sass:math';
3
4// Create a simple px-to-rem converter function
5@function to-rem($px, $base: 16) {
6 @return math.div($px, $base) * 1rem;
7}- Denne fil definerer en funktion, der konverterer pixelværdier til rem. En standard basisværdi er også angivet.
1// main.scss
2@use 'functions' as f;
3
4.title {
5 font-size: f.to-rem(24);
6}- Her er et eksempel på at kalde en funktion via
@useog anvende resultatet på en stil.
Moduleksport og @forward (API-design)
Når du vil gøre flere interne filer tilgængelige eksternt, kan du bruge @forward til at skabe en 'offentlig API'.
1// _index.scss (module entry)
2@forward 'variables';
3@forward 'mixins';
4@forward 'functions';- Flere interne filer kan samles i et enkelt entry point, der dermed udgør den offentlige API. Dette gør det muligt for brugere at tilgå alle nødvendige funktioner ved kun at importere ét entry point.
1// main.scss
2@use 'index' as ds; // ds = design system
3
4.button {
5 color: ds.$primary-color;
6 @include ds.container();
7}- Indholdet af
variablesogmixinstilgås samlet viaindex.@forwardgørindextil det offentlige lag.
Styring af API'en med @forward-mulighederne show/hide
Hvis du kun vil eksponere specifikke variabler, skal du bruge show- eller hide-mulighederne.
1// _variables.scss
2$internal-thing: 10px !default; // for internal use
3$primary-color: #0a74da !default;
4$secondary-color: #f5f5f5 !default;- Ved at tilføje
!defaultkan du udgive en værdi, der kan overskrives.
1// _index.scss
2@forward 'variables' show $primary-color, $secondary-color;
3@forward 'mixins';- Ved at bruge
showsammen med@forwardkan du begrænse den eksponerede API til kun de nødvendige elementer. Variabler og funktioner anvendt internt vil ikke kunne ses udefra.
Gør moduler konfigurerbare (med with)
Hvis du bruger !default i modulet, kan værdier overskrives med with ved import.
1// _theme.scss
2$brand-color: #ff6600 !default;
3$radius: 4px !default;
4
5@mixin button-style() {
6 background-color: $brand-color;
7 border-radius: $radius;
8}- Et modul med standardværdier defineret med
!defaultkan acceptere konfigurationer viawith.
1// main.scss
2@use 'theme' with (
3 $brand-color: #2288ff,
4 $radius: 8px
5);
6
7.my-btn {
8 @include theme.button-style();
9}withi@usegør det muligt at tilsidesætte standardvariabler i et modul under import. Dette er nyttigt til themeswitching.- Bemærk, at
withkun virker under import, og du kan ikke ændre værdierne senere.
Praktisk eksempel: Knapkomponent (fuldstændigt eksempel)
Lad os prøve at designe knapstilarter med moduler. Først opdeles variabler og mixins i deres egne moduler.
1// _variables.scss
2$btn-padding-y: 8px !default;
3$btn-padding-x: 16px !default;
4$btn-font-size: 14px !default;
5$btn-primary-bg: #0a74da !default;
6$btn-primary-color: #fff !default;- Standardvariabler for knapper defineres her. Ved at bruge
!defaultkan brugere overskrive disse værdier.
1// _mixins.scss
2@use "variables" as v;
3
4@mixin btn-base() {
5 display: inline-flex;
6 align-items: center;
7 justify-content: center;
8 padding: v.$btn-padding-y v.$btn-padding-x;
9 font-size: v.$btn-font-size;
10 border: none;
11 cursor: pointer;
12}- Basis-mixinen for knapper defineres her. De er adskilt for nem genanvendelse.
1// _button.scss
2@use 'variables' as v;
3@use 'mixins' as m;
4
5.button {
6 @include m.btn-base();
7 background: v.$btn-primary-bg;
8 color: v.$btn-primary-color;
9 border-radius: 4px;
10 transition: opacity 0.15s ease;
11 &:hover { opacity: 0.9; }
12}
13
14.button--large {
15 padding: calc(v.$btn-padding-y * 1.5) calc(v.$btn-padding-x * 1.5);
16 font-size: v.$btn-font-size * 1.25;
17}- Knapstilarter oprettes ved brug af navnerumsreferencer med
@use. En variant defineres som.button--large.
1// main.scss
2@use 'button'; // or @use 'index' that forwards button, variables, mixins- Ved at importere
button-modulet kan du straks bruge knapstilarterne.
Themeskift (brug af flere theme-filer)
Themeskift kan håndteres via konfiguration med with eller ved at oprette separate moduler og ændre hvilket, der bruges med @use.
1// themes/_light.scss
2$brand-color: #0a74da !default;1// themes/_dark.scss
2$brand-color: #111827 !default;- Definer brandfarver og andre indstillinger i flere theme-filer, og skift dem under bygning eller import.
1// main.scss (light theme)
2@use 'theme' with ($brand-color: #0a74da);
3@use 'button';- Vælg temaet enten ved at bruge
witheller ved at importere f.eks.@use 'themes/light'under build-processen.
Privat og offentligt (præfiks _ og !default)
I SASS markeres en fil som en partial ved at tilføje en understregning i begyndelsen af filnavnet. Dog bør du ved styring af modulers eksport-synlighed bruge show og hide med @forward for at styre, hvad der eksporteres.
Du kan bruge @forward til at organisere den offentlige API og skjule interne implementeringer udefra.
Bedste praksis til brug i virkeligheden
Nedenfor er nogle grundlæggende begreber, som er nyttige, når du bruger SASS i praksis. Alle disse retningslinjer hjælper med at mindske forvirring under udvikling og holder din kode organiseret.
- Hvis variabler kan forventes at ændre sig som del af et tema, tilføj da
!default. Dette gør det lettere for brugere at overskrive værdier. - Moduler bør opdeles efter ansvar og fokusere på ét formål. Det bliver lettere at administrere ved at adskille variable, mixins og komponenter.
- Styr offentligt indhold med
@forwardog brugshowellerhideefter behov. At definere omfanget af det offentlige fører til et mere sikkert design. - Brug navnerum for at gøre det tydeligt, hvilket modul hver funktion hører til. Dette forhindrer forveksling med anden kode.
- Husk at
withkun virker på tidspunktet for@use. Da du ikke kan ændre dem senere, skal du sætte konfigurationer ved import. - Brug en understregning i starten af filnavne for at gøre dem til partials, så de ikke kompileres individuelt. Det gør det lettere at kombinere filer i en større struktur.
- At inkludere brugseksempler i
index-modulet hjælper med test og dokumentation. Det bliver lettere for brugerne at forstå adfærden.
Hvis du holder disse ting for øje, bliver det nemmere at styre store projekter og fastholde læsbar kode som et team.
Sammendrag
SASS’ modul-system organiserer stilekode gennem navnerum, offentlige API’er og forenklet konfiguration. Dygtig brug af @use og @forward gør teamudvikling, themeswitching og biblioteksdesign meget nemmere.
Du kan følge med i ovenstående artikel ved hjælp af Visual Studio Code på vores YouTube-kanal. Husk også at tjekke YouTube-kanalen.