Skip to content

Sass 分部檔:底線開頭的檔名與 index 檔

Sass 分部檔:底線開頭的檔名

分部檔(Partial)就是 檔名以底線開頭.scss。它跟一般檔案唯一的差別是:編譯整個目錄時,Sass 不會 為它產生對應的 .css

scss/
├── main.scss          → 產出 main.css
├── _variables.scss    → 不產出
├── _mixins.scss       → 不產出
└── _button.scss       → 不產出

為什麼需要這個規則

回想 編譯整個目錄 的指令:

bash
npx sass src/scss:dist/css

Sass 會為每一個 .scss 產生一份 .css。但 _variables.scss 裡只有變數,編出來會是一個空檔案;_button.scss 只是整體樣式的一部分,單獨產出也沒有意義。

底線就是告訴編譯器:這個檔案是零件,不是成品。

載入時不寫底線

這是初學最容易困惑的地方,檔案叫 _variables.scss,載入時卻寫:

scss
@use "variables";

底線與副檔名都省略。Sass 會依序尋找:

  1. variables.scss
  2. _variables.scss
  3. variables/_index.scss

寫了底線也能動,但不是慣例

@use "_variables.scss" 是合法的,但社群一致的寫法是省略。統一風格比較重要。

目錄的入口:_index.scss

分部檔一多,入口檔就會變成一長串載入:

scss
// main.scss(載入很囉嗦)
@use "abstracts/variables";
@use "abstracts/mixins";
@use "abstracts/functions";
@use "components/button";
@use "components/card";

在目錄裡放一個 _index.scss,用 @forward 把成員收攏:

scss
// abstracts/_index.scss
@forward "variables";
@forward "mixins";
@forward "functions";

其他檔案就只要載入目錄:

scss
@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
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 都應該是分部檔。

延伸閱讀