Skip to content

Sass 7-1 檔案架構:七個目錄與一個入口

Sass 的 7-1 pattern 檔案架構

7-1 pattern 是 Sass 社群最廣為使用的目錄慣例:七個目錄放 分部檔,一個 main.scss 當入口。

它要解決的問題只有一個:新人打開專案,能不能三秒內知道一段樣式該放哪。

目錄結構

scss/
├── abstracts/     變數、mixin、function(不產生任何 CSS)
├── base/          重置、字型、全域元素樣式
├── components/    按鈕、卡片、表單這類可重複使用的元件
├── layout/        頁首、頁尾、側欄、柵格
├── pages/         特定頁面才有的樣式
├── themes/        深色模式、節慶主題
├── vendors/       第三方套件的樣式與覆寫
└── main.scss      唯一不加底線的檔案
目錄判斷準則
abstracts只有定義,沒有規則,載入不會產生 CSS
base沒有類別名,直接對 htmlbodya 這類元素
components可以搬到別的專案照用的 UI 零件
layout頁面骨架,通常一個網站只有一份
pages只有某一頁會用到,例如登入頁的特殊背景
themes換膚時整組會變的東西
vendors不是自己寫的,以及對它們的覆寫

main.scss

scss
// main.scss
@use "abstracts";
@use "vendors";
@use "base";
@use "layout";
@use "components";
@use "pages";
@use "themes";

七行,把整個專案串起來。

載入順序很重要

CSS 是 層疊 的,同樣 優先權 時,後面的贏。所以順序不是隨便排的:

順位目錄為什麼
1abstracts後面每個檔案都要用到它的成員
2vendors第三方的先進來,才能被自己的覆寫
3base重置與元素預設要在最底層
4layout骨架
5components元件覆寫骨架的預設
6pages特例覆寫通則
7themes主題要蓋過前面所有

abstracts 排第一是因為相依,不是因為層疊

它不產生任何 CSS,所以在層疊上根本不參與。放最前面是因為別人要用它的變數與 混入

工具類別若有獨立目錄,應該放在 最後,理由見 工具類別

每個目錄一個 _index.scss

scss
// components/_index.scss
@forward "button";
@forward "card";
@forward "form";
@forward "modal";

有了它,main.scss 就只寫目錄名稱;之後在 components 加一個 _badge.scss,只要改這個檔案,不必回頭動 main.scss

@forward@use 的差別在這裡很關鍵,入口檔要 傳遞 成員,所以用 @forward

每個元件檔要自己載入相依

scss
// components/_card.scss
@use "../abstracts" as a;

.card {
  padding: a.space(3);
  border-radius: a.$radius;

  @include a.respond-to(md) {
    padding: a.space(4);
  }
}

模組系統沒有全域這回事,用到什麼就自己載入什麼。這行看起來重複,但它讓每個檔案的相依關係一目了然。

小專案不必湊滿七個

scss/
├── abstracts/
├── base/
├── components/
└── main.scss

layout 併進 componentspagesthemes 等到真的需要再開。空目錄比沒有目錄更礙事。

用元件框架的話

Vue、React 的元件樣式跟著元件檔走:

src/
├── styles/
│   ├── abstracts/     ← 還是要,全域共用
│   ├── base/          ← 還是要,重置與字型
│   └── main.scss
└── components/
    └── Card.vue       ← .card 的樣式寫在這裡面

components 目錄多半會消失,但 abstractsbase 仍然需要。讓每個元件都能取用變數與混入的做法見 與建置工具整合

判斷放哪裡的三個問題

  1. 它會產生 CSS 嗎? 不會 → abstracts
  2. 它有類別名嗎? 沒有,直接對元素 → base
  3. 它能搬到別的專案用嗎? 能 → components;不能 → layoutpages

沒有標準答案,一致比正確重要

.header 該放 layout 還是 components?兩種都說得通。選一種,寫進團隊文件,然後所有人照做。

常見問題

一定要湊滿七個目錄嗎?

不用。7-1 是慣例不是規範,小專案用三到四個目錄就夠了。重點是新人能立刻判斷一段樣式該放哪,湊出空目錄反而礙事。

為什麼載入順序很重要?

因為 CSS 是層疊的,同樣優先權時後面的贏。重置樣式必須最先、工具類別必須最後,否則會被元件樣式蓋過去。abstracts 則因為不產生 CSS,順序只影響相依關係。

用 Vue 或 React 的元件樣式還需要這個架構嗎?

components 目錄多半會消失,因為元件樣式跟著元件檔走。但 abstractsbaselayout 仍然需要,那些是全域的東西。

每個目錄都要有 _index.scss 嗎?

建議都要。有了它,入口檔就只需要載入目錄名稱,之後在目錄裡新增檔案也只要改該目錄的入口,不必回頭改 main.scss

延伸閱讀