iT邦幫忙

2026 iThome 鐵人賽

DAY 12
0
佛心分享-IT 人自學之術

學過一點 React,卻被撈進 C#:新手用 AI 硬啃 MVC 企業專案的 3 個月實錄系列 第 12

Day 12|`compilerconfig.json` 是什麼?怎麼把 SCSS 編譯成 CSS?

  • 分享至 

  • xImage
  •  

上一篇已經把 SCSS 的資料夾和主要入口整理好了:

scss
├── _variables.scss
├── _buttons.scss
├── _layout.scss
├── _theme.scss
└── styles.scss

styles.scss 再把其他 Partial 引入:

@import "variables";
@import "buttons";
@import "layout";
@import "theme";

做到這裡時,我原本以為 Web Compiler 已經安裝完成,接下來應該就會自動幫我產生 CSS。

結果回到專案裡看,什麼都沒有發生。

因為 Web Compiler 雖然已經裝好了,但它還不知道:

要編譯哪一個 SCSS?
編譯後的 CSS 要放在哪裡?

這兩件事就要透過 compilerconfig.json 告訴它。

compilerconfig.json 是什麼?

看到這個檔名時,我先把它拆開理解:

compiler
編譯器

config
設定

json
設定檔的資料格式

所以 compilerconfig.json 可以先理解成:

Web Compiler 的編譯設定檔。

最基本的設定可能會長這樣:

[
  {
    "inputFile": "scss/styles.scss",
    "outputFile": "wwwroot/css/styles.css",
    "minify": {
      "enabled": true
    }
  }
]

它是在告訴 Web Compiler:

讀取 scss/styles.scss
↓
編譯成 CSS
↓
輸出到 wwwroot/css/styles.css
↓
同時壓縮輸出的內容

https://ithelp.ithome.com.tw/upload/images/20260805/20181499B5UrCxPEfU.png

inputFile 是什麼?

先看這一行:

"inputFile": "scss/styles.scss"

inputFile 是要交給 Web Compiler 編譯的來源檔案。

這裡指定的是:

scss/styles.scss

也就是 SCSS 的主要入口。

因為 styles.scss 裡已經引入其他 Partial:

@import "variables";
@import "buttons";
@import "layout";
@import "theme";

所以 Web Compiler 編譯 styles.scss 時,也會一起處理這些檔案。

_variables.scss
_buttons.scss
_layout.scss
_theme.scss
        ↓
被 styles.scss 引入
        ↓
styles.scss 成為 inputFile
        ↓
交給 Web Compiler 編譯

這也是為什麼不需要把每一個 Partial 都分別寫進 compilerconfig.json

Partial 主要是讓我們拆開管理樣式,真正交給編譯器的通常還是主要入口。

outputFile 是什麼?

再來是:

"outputFile": "wwwroot/css/styles.css"

outputFile 是編譯完成後,要把 CSS 放到哪裡。

這裡代表:

scss/styles.scss
↓
Web Compiler
↓
wwwroot/css/styles.css

前面 Day 7 已經整理過,wwwroot 是 ASP.NET Core MVC 專案放靜態檔案的地方。

例如:

CSS
JavaScript
圖片
字型

瀏覽器最後要取得的是 CSS,所以編譯完成的檔案會放進 wwwroot

不過每個專案的路徑不一定相同,也可能是:

Styles/site.scss
↓
wwwroot/assets/css/site.css

或:

scss/admin.scss
↓
wwwroot/css/admin.css

所以不能只看到教學範例,就直接把相同路徑貼進公司專案。

還是要先確認原本的資料夾和命名方式。

minify 是什麼?

設定裡還有:

"minify": {
  "enabled": true
}

minify 可以先理解成「壓縮」。

啟用後,Web Compiler 會盡量移除不影響 CSS 執行的內容,例如:

多餘的空格
縮排
換行
部分註解

原本比較容易閱讀的 CSS:

.test-button {
    padding: 8px 16px;
    color: white;
    background-color: #3366ff;
}

壓縮後可能會變成:

.test-button{padding:8px 16px;color:#fff;background-color:#36f}

所以編譯完成後,如果看到 CSS 全部擠在一起,不一定是壞掉。

有可能只是因為開啟了壓縮。

平常要修改樣式,還是回到 SCSS 原始檔,不需要直接閱讀壓縮後的 CSS。

為什麼最外面有一組 []

完整設定外面會有一組中括號:

[
]

例如:

[
  {
    "inputFile": "scss/styles.scss",
    "outputFile": "wwwroot/css/styles.css"
  }
]

中括號代表這裡可以放不只一組編譯設定。

假設專案有前台和後台兩個主要入口,就可能寫成:

[
  {
    "inputFile": "scss/site.scss",
    "outputFile": "wwwroot/css/site.css"
  },
  {
    "inputFile": "scss/admin.scss",
    "outputFile": "wwwroot/css/admin.css"
  }
]

代表:

site.scss → site.css
admin.scss → admin.css

所以一個專案不一定只會有一份 CSS。

有些專案會按照前台、後台、登入頁或列印樣式,分成不同入口。

怎麼建立 compilerconfig.json

我使用的是 Visual Studio 2022,而且前面已經安裝 Web Compiler。

實際操作時,可以先在方案總管找到主要入口:

styles.scss

接著按右鍵,查看有沒有 Web Compiler 相關的編譯選項。

不同版本的 Web Compiler,右鍵選單名稱和操作畫面可能不完全一樣。

有些版本可以直接從 SCSS 檔案建立設定,也有可能是專案原本就已經存在 compilerconfig.json

https://ithelp.ithome.com.tw/upload/images/20260805/20181499VpIfEhSgDg.png

如果公司專案原本就有 compilerconfig.json,不要急著再建立一份。

應該先打開原本的設定,確認裡面已經編譯哪些檔案。

不然同一個專案出現兩套不同設定,之後反而更難追。

建立完成後,方案總管可能會變成:

WebProject
├── scss
│   ├── _variables.scss
│   ├── _buttons.scss
│   └── styles.scss
├── wwwroot
│   └── css
│       └── styles.css
└── compilerconfig.json

https://ithelp.ithome.com.tw/upload/images/20260805/20181499Yxga7YSi2I.png

設定完成就代表成功了嗎?

還不算。

compilerconfig.json 只是告訴 Web Compiler 要做什麼,還要實際確認它有沒有執行。

我會先在 _buttons.scss 加一段容易辨認的測試樣式:

.test-button {
    padding: 8px 16px;
    border: 0;
    color: white;
    background-color: #3366ff;

    &:hover {
        opacity: 0.8;
    }
}

接著儲存並執行編譯。

不同版本或設定下,有些會在儲存時自動編譯,有些則要從右鍵選單手動執行。

所以不要只看到設定檔出現,就直接認定已經成功。

編譯完成後,再到:

wwwroot/css/styles.css

確認檔案有沒有產生或更新。

怎麼確認 SCSS 真的有被編譯?

只看到 styles.css 出現還不夠。

因為它可能是之前就存在的舊檔案。

我會直接打開編譯後的 CSS,搜尋剛剛新增的:

.test-button

原本 SCSS 寫的是:

.test-button {
    &:hover {
        opacity: 0.8;
    }
}

編譯後應該可以看到類似:

.test-button:hover {
    opacity: 0.8;
}

如果有開啟 minify,它也可能變成:

.test-button:hover{opacity:.8}

雖然格式不同,但只要能找到對應的規則,就代表 Web Compiler 確實有處理這份 SCSS。

不要直接修改編譯後的 CSS

看到 styles.css 成功產生後,很容易直接打開它修改。

例如按鈕顏色不對,就直接改:

.test-button {
    background-color: red;
}

當下重新整理後,可能真的有效。

但下一次 SCSS 重新編譯時,Web Compiler 會重新產生 styles.css,剛剛手動改的內容就可能被蓋掉。

因為:

SCSS
是開發時修改的原始檔

CSS
是編譯後產生的結果

所以要修改按鈕樣式,應該回到:

_buttons.scss

而不是直接改:

styles.css

這一點要認真記住,不然辛苦改完,下一次編譯又全部消失,真的會以為 Visual Studio 在跟我作對 XD

修改 SCSS 後,CSS 沒更新怎麼辦?

如果修改 _buttons.scss 後,styles.css 沒有更新,我會先照這個順序檢查。

1. Partial 有沒有被主要入口引入?

確認 styles.scss 裡有:

@import "buttons";

如果沒有引入,編譯 styles.scss 時就不會處理 _buttons.scss

2. inputFile 有沒有寫對?

確認 compilerconfig.json 指向真正的入口:

"inputFile": "scss/styles.scss"

路徑或檔名寫錯,Web Compiler 就找不到來源。

3. Web Compiler 有沒有真的執行?

儲存 SCSS 不代表每一個環境都會自動編譯。

可以查看右鍵選單、Output 視窗或錯誤訊息,確認編譯是否有執行。

4. SCSS 有沒有語法錯誤?

例如少了一個大括號:

.test-button {
    background-color: blue;

就可能造成編譯失敗。

5. outputFile 是不是自己正在看的 CSS?

設定可能輸出到:

wwwroot/css/styles.css

但我卻一直查看:

wwwroot/css/site.css

那當然會覺得 CSS 沒有更新。

我先把排查順序記成:

Partial 有沒有被引入?
↓
inputFile 有沒有寫對?
↓
Web Compiler 有沒有執行?
↓
SCSS 有沒有語法錯誤?
↓
outputFile 有沒有更新?

至少不會一看到畫面沒變,就開始瘋狂重新整理。

這份設定要不要和團隊共用?

compilerconfig.json 記錄的是專案的編譯方式。

其他人抓下專案後,如果也需要使用相同的 SCSS 入口和 CSS 輸出路徑,這份設定通常會需要團隊共用。

但實際要不要提交 Git,還是要先確認專案原本的規範,例如:

  • compilerconfig.json 有沒有被版本控制
  • .gitignore 有沒有排除它
  • 編譯後的 CSS 要不要一起提交
  • 團隊成員是否都使用 Web Compiler
  • 部署環境會不會重新編譯 SCSS

而且只有 compilerconfig.json 還不夠。

它比較像是工作單,Web Compiler 才是真正執行工作的人。

compilerconfig.json
=
告訴工具要做什麼

Web Compiler
=
實際負責編譯

所以其他人的開發環境也要有能讀取這份設定的工具。

在公司既有專案裡,先照團隊原本的做法,比自己突然改一套流程安全多了。

這篇先記住什麼?

compilerconfig.json 是 Web Compiler 使用的編譯設定檔。

最基本的內容可能是:

[
  {
    "inputFile": "scss/styles.scss",
    "outputFile": "wwwroot/css/styles.css",
    "minify": {
      "enabled": true
    }
  }
]

其中:

inputFile
=
要編譯的主要 SCSS

outputFile
=
編譯後產生的 CSS

minify
=
是否壓縮輸出的內容

完整流程是:

Partial
↓
styles.scss
↓
compilerconfig.json
↓
Web Compiler
↓
styles.css
↓
_Layout.cshtml
↓
瀏覽器

還有一件很重要的事:

不要直接修改編譯後的 CSS。

因為下一次重新編譯時,手動修改的內容很可能會被蓋掉。

下一篇就來處理更現實的問題:

SCSS 到底怎麼跑到畫面上?從編譯、CSS 到瀏覽器一次追完


上一篇
Day 11|CSS 已經能寫樣式,為什麼還要 SCSS?React 和 MVC 又差在哪裡?
下一篇
Day 13|SCSS 到底怎麼跑到畫面上?從編譯、CSS 到瀏覽器一次追完
系列文
學過一點 React,卻被撈進 C#:新手用 AI 硬啃 MVC 企業專案的 3 個月實錄14
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言