Sass 7-1 檔案架構:七個目錄與一個入口
7-1 pattern 是 Sass 社群最廣為使用的目錄慣例:七個目錄放 分部檔,一個 main.scss 當入口。
它要解決的問題只有一個:新人打開專案,能不能三秒內知道一段樣式該放哪。
目錄結構
scss/
├── abstracts/ 變數、mixin、function(不產生任何 CSS)
├── base/ 重置、字型、全域元素樣式
├── components/ 按鈕、卡片、表單這類可重複使用的元件
├── layout/ 頁首、頁尾、側欄、柵格
├── pages/ 特定頁面才有的樣式
├── themes/ 深色模式、節慶主題
├── vendors/ 第三方套件的樣式與覆寫
└── main.scss 唯一不加底線的檔案| 目錄 | 判斷準則 |
|---|---|
abstracts | 只有定義,沒有規則,載入不會產生 CSS |
base | 沒有類別名,直接對 html、body、a 這類元素 |
components | 可以搬到別的專案照用的 UI 零件 |
layout | 頁面骨架,通常一個網站只有一份 |
pages | 只有某一頁會用到,例如登入頁的特殊背景 |
themes | 換膚時整組會變的東西 |
vendors | 不是自己寫的,以及對它們的覆寫 |
main.scss
// main.scss
@use "abstracts";
@use "vendors";
@use "base";
@use "layout";
@use "components";
@use "pages";
@use "themes";七行,把整個專案串起來。
載入順序很重要
CSS 是 層疊 的,同樣 優先權 時,後面的贏。所以順序不是隨便排的:
| 順位 | 目錄 | 為什麼 |
|---|---|---|
| 1 | abstracts | 後面每個檔案都要用到它的成員 |
| 2 | vendors | 第三方的先進來,才能被自己的覆寫 |
| 3 | base | 重置與元素預設要在最底層 |
| 4 | layout | 骨架 |
| 5 | components | 元件覆寫骨架的預設 |
| 6 | pages | 特例覆寫通則 |
| 7 | themes | 主題要蓋過前面所有 |
abstracts 排第一是因為相依,不是因為層疊
它不產生任何 CSS,所以在層疊上根本不參與。放最前面是因為別人要用它的變數與 混入。
工具類別若有獨立目錄,應該放在 最後,理由見 工具類別。
每個目錄一個 _index.scss
// components/_index.scss
@forward "button";
@forward "card";
@forward "form";
@forward "modal";有了它,main.scss 就只寫目錄名稱;之後在 components 加一個 _badge.scss,只要改這個檔案,不必回頭動 main.scss。
@forward 與 @use 的差別在這裡很關鍵,入口檔要 傳遞 成員,所以用 @forward。
每個元件檔要自己載入相依
// 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.scsslayout 併進 components、pages 與 themes 等到真的需要再開。空目錄比沒有目錄更礙事。
用元件框架的話
Vue、React 的元件樣式跟著元件檔走:
src/
├── styles/
│ ├── abstracts/ ← 還是要,全域共用
│ ├── base/ ← 還是要,重置與字型
│ └── main.scss
└── components/
└── Card.vue ← .card 的樣式寫在這裡面components 目錄多半會消失,但 abstracts 與 base 仍然需要。讓每個元件都能取用變數與混入的做法見 與建置工具整合。
判斷放哪裡的三個問題
- 它會產生 CSS 嗎? 不會 →
abstracts。 - 它有類別名嗎? 沒有,直接對元素 →
base。 - 它能搬到別的專案用嗎? 能 →
components;不能 →layout或pages。
沒有標準答案,一致比正確重要
.header 該放 layout 還是 components?兩種都說得通。選一種,寫進團隊文件,然後所有人照做。
常見問題
一定要湊滿七個目錄嗎?
不用。7-1 是慣例不是規範,小專案用三到四個目錄就夠了。重點是新人能立刻判斷一段樣式該放哪,湊出空目錄反而礙事。
為什麼載入順序很重要?
因為 CSS 是層疊的,同樣優先權時後面的贏。重置樣式必須最先、工具類別必須最後,否則會被元件樣式蓋過去。abstracts 則因為不產生 CSS,順序只影響相依關係。
用 Vue 或 React 的元件樣式還需要這個架構嗎?
components 目錄多半會消失,因為元件樣式跟著元件檔走。但 abstracts、base 與 layout 仍然需要,那些是全域的東西。
每個目錄都要有 _index.scss 嗎?
建議都要。有了它,入口檔就只需要載入目錄名稱,之後在目錄裡新增檔案也只要改該目錄的入口,不必回頭改 main.scss。