Sass 分部檔:底線開頭的檔名與 index 檔
分部檔(Partial)就是 檔名以底線開頭 的 .scss。它跟一般檔案唯一的差別是:編譯整個目錄時,Sass 不會 為它產生對應的 .css。
scss/
├── main.scss → 產出 main.css
├── _variables.scss → 不產出
├── _mixins.scss → 不產出
└── _button.scss → 不產出為什麼需要這個規則
回想 編譯整個目錄 的指令:
npx sass src/scss:dist/cssSass 會為每一個 .scss 產生一份 .css。但 _variables.scss 裡只有變數,編出來會是一個空檔案;_button.scss 只是整體樣式的一部分,單獨產出也沒有意義。
底線就是告訴編譯器:這個檔案是零件,不是成品。
載入時不寫底線
這是初學最容易困惑的地方,檔案叫 _variables.scss,載入時卻寫:
@use "variables";底線與副檔名都省略。Sass 會依序尋找:
variables.scss_variables.scss✅variables/_index.scss
寫了底線也能動,但不是慣例
@use "_variables.scss" 是合法的,但社群一致的寫法是省略。統一風格比較重要。
目錄的入口:_index.scss
分部檔一多,入口檔就會變成一長串載入:
// main.scss(載入很囉嗦)
@use "abstracts/variables";
@use "abstracts/mixins";
@use "abstracts/functions";
@use "components/button";
@use "components/card";在目錄裡放一個 _index.scss,用 @forward 把成員收攏:
// abstracts/_index.scss
@forward "variables";
@forward "mixins";
@forward "functions";其他檔案就只要載入目錄:
@use "abstracts" as a;
.card {
padding: a.$gap;
@include a.center;
}@use "abstracts" 會自動找到 abstracts/_index.scss。這是 7-1 架構 能運作的關鍵。
一個典型的目錄
scss/
├── main.scss ← 唯一不加底線的檔案
├── abstracts/
│ ├── _index.scss
│ ├── _variables.scss
│ ├── _mixins.scss
│ └── _functions.scss
├── base/
│ ├── _index.scss
│ ├── _reset.scss
│ └── _typography.scss
└── components/
├── _index.scss
├── _button.scss
└── _card.scss// main.scss
@use "abstracts";
@use "base";
@use "components";有些檔案不該加底線
會被單獨編譯成一份 CSS 的都不該加,例如:
main.scss:主要的進入點。print.scss:列印專用樣式,用<link media="print">單獨載入。admin.scss:後台頁面獨立的樣式包。
除了這些,專案裡幾乎每個 .scss 都應該是分部檔。
分部檔裡該放什麼
| 內容 | 載入後會產生 CSS 嗎 |
|---|---|
| 變數、混入、函式 的定義 | 不會 |
| CSS 規則(選取器與宣告) | 會 |
這個差別在 7-1 架構 裡很關鍵:abstracts 目錄下的檔案應該 只有定義、沒有規則,所以被載入幾次都不會多產生樣式;components 下的檔案則相反,載入就會輸出。
用建置工具時規則一樣
Vite、Webpack 只編譯你 import 的進入點,不會整個目錄掃描,所以底線在那裡不影響產出。但慣例還是要照著寫,它讓人一眼看出哪個是進入點,見 與建置工具整合。
常見問題
為什麼分部檔要用底線開頭?
因為編譯整個目錄時,Sass 會為每一個 .scss 產生對應的 .css,但變數檔、混入檔這類零件並不需要自己的 CSS。底線就是告訴編譯器跳過這個檔案,只讓它被別人載入。
載入時要不要寫底線?
不用。@use "variables" 就會找到 _variables.scss,副檔名也可以省略。寫了底線雖然也能運作,但不是慣例。
_index.scss 有什麼特別的?
載入一個目錄時,Sass 會自動去找該目錄下的 _index.scss。把該目錄所有分部檔用 @forward 收攏在裡面,其他檔案就只需要載入目錄名稱,不必逐一列出。
哪些檔案不該加底線?
會被編譯成獨立 CSS 檔的進入點不該加,例如 main.scss,或是為特定頁面、列印樣式單獨產出的檔案。除了這些之外,專案裡幾乎每個 .scss 都應該是分部檔。