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 呼叫需要更新為命名空間語法
🧠 解決方法論
核心原則
- @import → @use 轉換: 使用命名空間避免全域污染
- 宣告順序修正: CSS 屬性必須在巢狀規則之前
- 依賴關係清理: 移除不當的跨模組依賴
執行流程
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 規範
🎓 經驗與教訓
成功要素
- 系統性處理: 按照 Phase 逐步執行,避免遺漏
- 命名空間設計: 使用語意化的命名空間(glass, gradient, neon)
- 測試驗證: 每個 Phase 後都測試編譯結果
常見陷阱
- 忽略巢狀檔案: Effects 目錄中的檔案也需要轉換
- 混合宣告順序: CSS 屬性必須在巢狀規則之前
- 跨模組依賴: 避免不同 mixin 模組之間的交叉引用
- 命名空間錯誤: 確保 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 的專案:
- Vue + Sass 專案
- React + Sass 專案
- Angular + Sass 專案
- 純 Sass 編譯專案
自動化可能性
可考慮開發自動化工具:
- AST 解析器自動轉換 @import
- 自動添加命名空間前綴
- 自動修正宣告順序
參考資源
文件建立日期: 2025-08-29作者: Claude Code Assistant專案: E-commerce Admin Dashboard