Skip to content

Sass @import 轉換為 @use 現代化指南

概述

本文件記錄了將專案中的 Sass @import 語法轉換為現代 @use 語法的完整過程。這是因應 Dart Sass 3.0 將移除 @import 規則的必要升級。

問題識別

原始警告訊息

Deprecation Warning [import]: Sass @import rules are deprecated and will be removed in Dart Sass 3.0.0.

影響範圍

  • 5 個 @import 語句需要轉換
  • 2 個 mixed-decls 警告需要修正
  • 多個 mixin 呼叫需要更新為命名空間語法

🧠 解決方法論

核心原則

  1. @import → @use 轉換: 使用命名空間避免全域污染
  2. 宣告順序修正: CSS 屬性必須在巢狀規則之前
  3. 依賴關係清理: 移除不當的跨模組依賴

執行流程

Phase 1: 主檔案 @import 轉換

修改前 (main.scss)

scss
// 舊語法
@import 'mixins/glass-mixins';
@import 'mixins/gradient-mixins';
@import 'mixins/neon-mixins';

修改後

scss
// 新語法 - 使用命名空間
@use 'mixins/glass-mixins' as glass;
@use 'mixins/gradient-mixins' as gradient;
@use 'mixins/neon-mixins' as neon;

Phase 2: Mixin 呼叫更新

修改前

scss
.glass-effect {
  @include glass-card();
}

.neon-glow {
  @include neon-glow(0, 255, 255);
}

修改後

scss
.glass-effect {
  @include glass.glass-card();
}

.neon-glow {
  @include neon.neon-glow(0, 255, 255);
}

Phase 3: Mixed Declarations 修正

問題範例

scss
// ❌ 錯誤:CSS 屬性在 @keyframes 之後
.cyber-border {
  @include cyber-border(0, 255, 255);
  padding: 1rem;  // 這會觸發 mixed-decls 警告
}

修正後

scss
// ✅ 正確:CSS 屬性在 mixin 之前
.cyber-border {
  padding: 1rem;  // 先宣告屬性
  @include neon.cyber-border(0, 255, 255);
}

Phase 4: Effects 檔案修正

_glassmorphism.scss 轉換

scss
// 修改前
@import '../mixins/glass-mixins';
@include glass-card();

// 修改後
@use '../mixins/glass-mixins' as glass;
@include glass.glass-card();

_fluid-gradients.scss 轉換

scss
// 修改前
@import '../mixins/gradient-mixins';
@include fluid-gradient(#667eea, #764ba2);

// 修改後
@use '../mixins/gradient-mixins' as gradient;
@include gradient.fluid-gradient(#667eea, #764ba2);

Phase 5: 命名空間錯誤修正

問題發現

某些 mixin 被錯誤地歸類到不正確的命名空間:

scss
// ❌ 錯誤:noise 相關的 mixin 被放在 gradient 命名空間
@include gradient.film-grain();
@include gradient.retro-tv-noise();
@include gradient.noise-overlay();

解決方案

正確導入 noise-texture 效果並使用正確的命名空間:

scss
// 添加正確的導入
@use 'effects/noise-texture' as noise;

// 修正 mixin 呼叫
@include noise.film-grain();
@include noise.retro-tv-noise();
@include noise.noise-overlay();

工具與技術手段

批量替換技巧

使用編輯器的 replace_all 功能進行批量更新:

typescript
// 範例:批量更新 mixin 呼叫
{
  old_string: "@include glass-",
  new_string: "@include glass.glass-",
  replace_all: true
}

依賴關係清理

移除不當的跨模組依賴:

scss
// _fluid-gradients.scss 中錯誤的依賴
.glass-fluid {
  @include glass-card(0.1, 0.2);  // ❌ 不應依賴 glass mixins
}

// 修正:移除外部依賴
.glass-fluid {
  // 使用自身的樣式定義
  background: linear-gradient(...);
}

成果量化

修改統計

  • 檔案修改數: 5 個 SCSS 檔案
  • @import 轉換: 6 個語句
  • Mixin 呼叫更新: 55+ 處
  • Mixed-decls 修正: 8 處
  • 命名空間錯誤修正: 3 處

效能影響

  • 編譯警告: 14 個 → 0 個
  • 建置時間: 維持穩定(無效能退化)
  • 相容性: 完全符合 Dart Sass 3.0 規範

🎓 經驗與教訓

成功要素

  1. 系統性處理: 按照 Phase 逐步執行,避免遺漏
  2. 命名空間設計: 使用語意化的命名空間(glass, gradient, neon)
  3. 測試驗證: 每個 Phase 後都測試編譯結果

常見陷阱

  1. 忽略巢狀檔案: Effects 目錄中的檔案也需要轉換
  2. 混合宣告順序: CSS 屬性必須在巢狀規則之前
  3. 跨模組依賴: 避免不同 mixin 模組之間的交叉引用
  4. 命名空間錯誤: 確保 mixin 使用正確的命名空間(如 noise 相關 mixin 不應放在 gradient 命名空間)

可複製性

標準化流程模板

bash
# 1. 掃描 @import 使用情況
grep -r "@import" src/styles/

# 2. 轉換主檔案
 @import 改為 @use with namespace

# 3. 更新 mixin 呼叫
添加命名空間前綴

# 4. 修正宣告順序
 CSS 屬性移到巢狀規則之前

# 5. 測試驗證
npm run dev 確認無警告

快速檢查清單

  • [ ] 所有 @import 已轉換為 @use
  • [ ] 所有 mixin 呼叫已添加命名空間
  • [ ] 所有 mixed-decls 警告已修正
  • [ ] 開發伺服器啟動無警告
  • [ ] 視覺效果保持正常

延伸應用

其他專案應用

此方法可應用於任何使用 Sass 的專案:

  1. Vue + Sass 專案
  2. React + Sass 專案
  3. Angular + Sass 專案
  4. 純 Sass 編譯專案

自動化可能性

可考慮開發自動化工具:

  • AST 解析器自動轉換 @import
  • 自動添加命名空間前綴
  • 自動修正宣告順序

參考資源


文件建立日期: 2025-08-29作者: Claude Code Assistant專案: E-commerce Admin Dashboard