SCSS 技術詳解:優勢、與 CSS 的區別及在 React TypeScript 項目中的應用

作者: Calpa Liu
字數:1585
出版:2025年3月25日

SCSS 作為現代 Web 開發中日益流行的樣式預處理器,為前端開發人員提供了比傳統 CSS 更強大的功能和更高效的工作流程。本文將深入探討 SCSS 的優勢、與 CSS 的主要區別,以及如何在 React TypeScript 項目中有效地使用它,幫助開發者提升樣式編寫效率和代碼可維護性。

SCSS 簡介與核心優勢

SCSS(Sassy CSS)是 CSS 的超集,它擴展了標準 CSS 的功能,為開發者提供了更多的工具和技術來編寫和管理樣式表。SCSS 是 Sass(Syntactically Awesome Style Sheets)的一種語法,由 Hampton Catlin 開發,並由 Chris Eppstein 和 Natalie Weizenbaum 進一步完善。

嵌套選擇器

SCSS 最顯著的優勢之一是支持嵌套選擇器,這使得樣式表結構可以更直觀地映射 HTML 結構。這種特性幫助開發者編寫更具組織性和可讀性的代碼。

.header {
  background-color: #333;
  
  .navigation {
    display: flex;
    
    .nav-item {
      margin: 0 10px;
      
      &:hover {
        color: blue;
      }
    }
  }
}

上述代碼在傳統 CSS 中需要寫成多個獨立的選擇器,而 SCSS 的嵌套方式更符合人類思維邏輯。

變量系統

SCSS 支持變量,可以將常用的值如顏色、字體大小或間距定義為變量,在整個樣式表中重複使用。這不僅提高了代碼的一致性,還使得全局樣式變更變得極為簡單。

$primary-color: #6fda44;
$font-stack: Neuemontreal, sans-serif;
$base-font-size: 16px;

body {
  color: $primary-color;
  font-family: $font-stack;
  font-size: $base-font-size;
}

.button {
  background-color: $primary-color;
  padding: $base-font-size / 2;
}

這種方式可以確保樣式一致性,並且當需要更改主題時,只需修改變量值即可。

Mixins 和繼承

SCSS 提供了 mixins 功能,允許開發者定義可重用的樣式塊,並在多個選擇器中包含這些樣式。這減少了代碼冗餘,並提高了樣式表的可維護性。

@mixin flex-center {
  display: flex;
  justify-content: center;
  align-items: center;
}

.container {
  @include flex-center;
  background-color: #f5f5f5;
}

.modal {
  @include flex-center;
  position: fixed;
}

此外,SCSS 還支持繼承,可以通過@extend指令共享一組 CSS 屬性,進一步提高代碼復用性。

模塊化與部分文件

SCSS 允許將樣式表分割成更小的模塊化文件(partials),然後將它們導入到主 SCSS 文件中。這種方法使大型項目的樣式組織變得更加清晰和可管理。

// _variables.scss
$primary-color: #6fda44;

// _reset.scss
body, h1, h2 {
  margin: 0;
  padding: 0;
}

// main.scss
@use 'variables';
@use 'reset';

body {
  color: variables.$primary-color;
}

這種模塊化結構使團隊合作更加順暢,因為不同開發者可以專注於不同的模塊。

CSS 與 SCSS 的關鍵區別

雖然 SCSS 是 CSS 的超集,但兩者之間存在一些關鍵區別,了解這些區別有助於開發者在項目中做出明智的技術選擇。

語法與預處理

CSS 是瀏覽器原生支持的標準樣式語言,可以直接被瀏覽器解釋和渲染。而 SCSS 則是一種需要預處理的語言,必須先編譯成標準 CSS 才能被瀏覽器使用。

// SCSS 代碼
$bg-color: #f0f0f0;

.container {
  background-color: $bg-color;
  
  .item {
    padding: 10px;
  }
}

編譯後的 CSS:

/* 編譯後的 CSS 代碼 */
.container {
  background-color: #f0f0f0;
}

.container .item {
  padding: 10px;
}

值得注意的是,所有有效的 CSS 代碼也都是有效的 SCSS 代碼,但反之則不成立。

編程能力

SCSS 引入了編程元素,如變量、條件語句、循環和函數,這使得樣式表編寫更加靈活和強大。CSS 雖然在近年來增加了一些類似功能(如自定義屬性),但仍缺乏 SCSS 提供的全面編程能力。

// SCSS 中的循環
@for $i from 1 through 5 {
  .col-#{$i} {
    width: 20% * $i;
  }
}

這在純 CSS 中是無法實現的高級功能。

開發效率與可維護性

SCSS 通過提供更簡潔的語法和更強大的功能,顯著提高了開發效率。特別是在大型項目中,SCSS 的模塊化和變量系統可以大幅減少代碼重複和維護成本。

在 React TypeScript 項目中使用 SCSS

將 SCSS 整合到 React TypeScript 項目中非常直接,現代開發工具鏈提供了良好的支持。

項目設置

安裝 sass 依賴:

npm install --save sass
# 或
yarn add sass

基本使用方法

在 React 組件中使用 SCSS 文件非常簡單,可以像導入普通 CSS 一樣導入 SCSS 文件:

// App.tsx
import React from 'react';
import './App.scss';

const App: React.FC = () => {
  return (
    <div className="app-container">
      <h1>Hello, SCSS in React TypeScript!</h1>
    </div>
  );
};

export default App;

SCSS

將 SCSS 文件命名為[name].scss格式:

// App.scss
$primary-color: #6fda44;

.app-container {
  padding: 20px;
  background-color: #f5f5f5;
  
  h1 {
    color: $primary-color;
    font-size: 24px;
  }
}

CSS 模塊

為了避免樣式衝突,可以使用 CSS 模塊功能,將 SCSS 文件命名為[name].module.scss格式:

// Button.tsx
import React from 'react';
import styles from './Button.module.scss';

const Button: React.FC = () => {
  return <button className={styles.button}>Click Me</button>;
};

export default Button;

SCSS 模塊

將 SCSS 文件命名為[name].module.scss格式:

// Button.module.scss
.button {
  background-color: #6fda44;
  border: none;
  padding: 10px 15px;
  border-radius: 4px;
  
  &:hover {
    background-color: darken(#6fda44, 10%);
  }
}

這種方式會自動為類名生成唯一的標識符,防止樣式污染。

共享變量與主題

在大型應用中,可以使用 Sass 的@use規則在不同文件間共享變量,實現主題化系統:

// _variables.scss
$theme-colors: (
  primary: #6fda44,
  secondary: #333,
  danger: #dc3545
);

// Button.module.scss
@use 'variables' as vars;

.button {
  $colors: vars.$theme-colors;
  background-color: map-get($colors, primary);
  
  &.secondary {
    background-color: map-get($colors, secondary);
  }
  
  &.danger {
    background-color: map-get($colors, danger);
  }
}

在 TypeScript 組件中類型安全地使用 SCSS 模塊

為了在 TypeScript 中更安全地使用 SCSS 模塊,可以添加類型聲明:

// 在 src 目錄中創建 custom.d.ts 文件
declare module '*.module.scss' {
  const classes: { [key: string]: string };
  export default classes;
}

這樣在使用 SCSS 模塊時就能獲得類型檢查和自動完成功能。

結論

SCSS 作為 CSS 的強大擴展,通過變量、嵌套、mixins 等功能大大提升了樣式表的開發效率和可維護性。相比傳統 CSS,SCSS 提供了更多的編程能力和組織結構,特別適合中大型 Web 項目的開發需求。在 React TypeScript 項目中集成 SCSS 非常簡單,不僅能夠享受 TypeScript 的類型安全保障,還能利用 SCSS 的強大功能構建更加模塊化和可維護的前端樣式系統。

雖然 CSS 本身也在不斷發展和增強功能,但 SCSS 提供的工具和工作流程仍然具有顯著優勢,是現代前端開發中值得掌握的重要技術之一。隨著 Web 應用複雜度的增加,SCSS 在可預見的未來仍將是前端開發者的寶貴工具。

感謝您閱讀我的文章。歡迎隨時分享你的想法。
關於 Calpa

Calpa 擅長使用 TypeScriptReact.jsVue.js 建立 Responsive Website。

他積極參與開源社區,曾在 2019 年的香港開源大會上擔任講者,提供工作經驗和見解。此外,他也在 GitHub 上公開分享個人博客程式碼,已獲得超過 300 顆星星和 60 個分支的支持。

他熱愛學習新技術,並樂意分享經驗。他相信,唯有不斷學習才能跟上快速演變的技術環境。