SASS 模組

本文將說明 SASS 模組。

我們將說明如何使用 @use@forward 來模組化 SASS,以及如何重複使用變數、混合、函式、主題設定和公開 API。

YouTube Video

SASS 模組

SASS 的模組系統有助於明確限定樣式範圍,並提供易於重用和維護的設計。

模組的基本概念

SASS 模組解決了舊有 @import 方式下的全域命名空間污染與相依性不明確等問題。每個檔案會作為一個模組載入,具有自己的命名空間,只有明確導出的項目才可被其他檔案存取。

範例檔案結構

首先,這是一個實際專案結構的範例。下面是小型設計系統的範例。

 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
  • 這樣的結構便於模組化,也利於測試和替換部分元件。
  • 部分(partial)檔案會在檔名開頭加底線。

@use 的基礎

@use 用來載入一個模組,並自動提供命名空間。這可以避免名稱衝突並明確指示來源模組。

1// _variables.scss
2$primary-color: #0a74da;
3$padding-base: 12px;
  • 這是一個只定義變數的簡單檔案。模組中發布的變數可以直接透過 @use 參照。
1// main.scss
2@use 'variables';
3
4.example {
5  color: variables.$primary-color;
6  padding: variables.$padding-base;
7}
  • 這裡以 variables. 這個命名空間來參照 variables 模組。這種方式可以明確顯示每個項目的來源。

縮短或別名命名空間

可以使用 as 來縮短命名空間。

1@use 'variables' as vars;
2
3.btn {
4  color: vars.$primary-color;
5}
  • 這是使用簡短別名 vars 匯入 variables 的範例。可根據是否重視可讀性或輸入效率來選擇命名。

混合(Mixin)定義

mixin 和函式也可以在模組中定義並使用。註解遵循專案慣例能提升清晰度。

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}
  • 本檔案定義了一個用於容器的 mixin。這個 mixin 可接收參數並提供預設值。
1// main.scss
2@use 'mixins' as m;
3
4.wrapper {
5  @include m.container(1000px);
6}
  • 這裡是用 @include 使用 mixin 的範例。

定義函式

函式用於回傳數值,可於模組中定義並重複使用。將設計數值的計算封裝於函式中,能讓樣式更穩定且更易維護。

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}
  • 此檔案定義了一個將像素值轉換為 rem 的函式。同時也指定了預設的基準值。
1// main.scss
2@use 'functions' as f;
3
4.title {
5  font-size: f.to-rem(24);
6}
  • 以下是透過 @use 呼叫函式並將結果應用到樣式的範例。

模組導出與 @forward(API 設計)

當需要將多個內部檔案公開時,可以用 @forward 建立一個「公開 API」。

1// _index.scss (module entry)
2@forward 'variables';
3@forward 'mixins';
4@forward 'functions';
  • 可以將多個內部檔案歸為單一進入點,集中提供公開 API。這樣消費者只需匯入一個進入點即可取得所需所有功能。
1// main.scss
2@use 'index' as ds; // ds = design system
3
4.button {
5  color: ds.$primary-color;
6  @include ds.container();
7}
  • variablesmixins 的內容可以統一經由 index 取得。@forwardindex 成為對外公開的界面。

@forwardshow / hide 來控制 API

若只想公開特定變數,可以使用 showhide 選項。

1// _variables.scss
2$internal-thing: 10px !default; // for internal use
3$primary-color: #0a74da !default;
4$secondary-color: #f5f5f5 !default;
  • 加上 !default 可以讓公開的值在外部進行覆寫。
1// _index.scss
2@forward 'variables' show $primary-color, $secondary-color;
3@forward 'mixins';
  • 結合 show@forward 可以僅公開必要的 API 項目。內部使用的變數與函式將不會對外暴露。

讓模組可設定(使用 with

如果在模組裡用 !default,匯入端可以透過 with 來覆寫預設值。

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}
  • 使用 !default 定義預設值的模組,可借由 with 傳入設定。
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}
  • @use 中的 with 可於匯入時複寫模組內的預設變數。這對於主題切換很實用。
  • 注意 with 只在匯入當下生效,之後無法再變更其值。

實際範例:按鈕元件(完整範例)

讓我們運用模組來設計按鈕樣式。首先,將變數及 mixin 區分成獨立模組。

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;
  • 這裡定義了按鈕的預設變數。利用 !default 讓使用者能自行覆寫這些值。
 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}
  • 按鈕基礎 mixin 於此定義。分離設計有助於重複使用。
 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}
  • 按鈕樣式使用 @use 命名空間參照來撰寫。一個變體為 .button--large 被定義。
1// main.scss
2@use 'button'; // or @use 'index' that forwards button, variables, mixins
  • 只要匯入 button 模組,即可直接使用按鈕樣式。

主題切換(使用多個主題檔)

主題可透過 with 設定切換,或建立個別主題模組並用 @use 選擇要套用的主題。

1// themes/_light.scss
2$brand-color: #0a74da !default;
1// themes/_dark.scss
2$brand-color: #111827 !default;
  • 可將品牌顏色等設定寫在多個主題檔內,於建置或匯入時切換。
1// main.scss (light theme)
2@use 'theme' with ($brand-color: #0a74da);
3@use 'button';
  • 可選擇用 with 或直接在建置時匯入,例如 @use 'themes/light',來切換主題。

私有與公開(底線前綴與 !default

在 SASS 中,檔名開頭加上底線表示這是一個部分檔案(partial)。但管理模組的導出可見性時,還是建議用 @forward 搭配 showhide 進行控制。

可利用 @forward 統整公開 API,也能隱藏內部實作避免外部存取。

實務最佳實踐建議

以下是實際使用 SASS 時很有用的一些基本概念。這些規範將幫助你在開發時避免混淆並保持程式碼有條理。

  • 若變數有機會成為主題設定,應加 !default。這樣使用者更容易覆寫數值。
  • 模組應按職責分工,聚焦單一用途。將變數、混合及元件分離能讓管理變得更容易。
  • @forward 管理公開內容,必要時搭配 showhide 控制。明確界定對外公開項目可提升設計安全性。
  • 利用命名空間明確歸屬每一個功能。可以防止與其他程式碼混淆。
  • 記得 with 僅於 @use 匯入時有效。因為事後不能再改,匯入時務必設定好。
  • 將檔名加底線讓其成為部分檔案,以避免個別被編譯。這樣方便合併檔案組成更大架構。
  • index 模組內加入範例,有助於測試與文件說明。這使得使用者更容易理解實際行為。

牢記以上重點,將有助於團隊協作管理大型專案並保持程式碼可讀性。

總結

SASS 模組系統透過命名空間、公開 API 及簡化設定來組織樣式碼。靈活運用 @use@forward,能讓團隊開發、主題切換和函式庫設計都變得更容易。

您可以在我們的 YouTube 頻道上使用 Visual Studio Code 來跟隨上述文章一起學習。 請也查看我們的 YouTube 頻道。

YouTube Video