# Sass 废弃警告修复记录

> 项目运行 `pnpm serve` 时，Dart Sass 输出了多类废弃 API 警告。本文档记录问题现象、根因及修复方案。

---

## 1. `legacy-js-api` — Sass Loader 旧 JS API 警告

### 问题现象

```
Deprecation Warning [legacy-js-api]: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0.
```

### 根因

`sass-loader` 旧版本默认通过旧版 JS API 调用 Dart Sass。Dart Sass 计划在 2.0 中移除该 API。

### 修复

**文件：`package.json`**

将 `sass-loader` 升级到 `10.5.2`（v10 最后一个稳定版，兼容 Webpack 4），该版本支持 `silenceDeprecations` 选项。

```diff
- "sass-loader": "^10.3.1",
+ "sass-loader": "~10.5.2",
```

**文件：`vue.config.js`**

在 `css.loaderOptions.sass` 中添加 `silenceDeprecations` 配置。

```js
sass: {
  additionalData: '@use "@/assets/style/public.scss" as *;',
  sassOptions: {
    silenceDeprecations: ['legacy-js-api', 'import']
  }
},
```

---

## 2. `import` — Sass `@import` 废弃警告

### 问题现象

```
DEPRECATION WARNING [import]: Sass @import rules are deprecated and will be removed in Dart Sass 3.0.0.

  ╷
1 │ @import '~@/assets/style/unit/color.scss';
  │         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  ╵
    src\assets\style\public.scss 1:9          @use
```

### 根因

`public.scss` 通过 `@import '~@/assets/style/unit/color.scss'` 引入颜色变量文件。Dart Sass 正在推动从 `@import` 迁移到 `@use` / `@forward` 模块系统。

### 为何不改成 `@use`

该 `@import` 使用了 Webpack 专有的 `~` 前缀做模块路径解析（`~@/assets/...`），`@use` 对此机制支持不稳定，直接替换可能导致构建失败。

### 修复

在上述 `silenceDeprecations` 数组中追加 `'import'`，静默该警告。

---

## 3. `global-builtin` — 全局内置函数 `nth()` 废弃警告

### 问题现象

```
Deprecation Warning [global-builtin]: Global built-in functions are deprecated and will be removed in Dart Sass 3.0.0.
Use list.nth instead.

   ╷
42 │   .#{$prefix}-m-#{nth($sizes, $index)} { margin: #{nth($sizes, $index)}px !important; }
   │                   ^^^^^^^^^^^^^^^^^^^
   ╵
    src\assets\style\public-class.scss 42:19  @import
    src\App.vue 3:9                           root stylesheet
```

### 根因

Dart Sass 正在将全局内置函数迁移到命名空间模块。`nth()` 属于 `sass:list` 模块，不应再作为全局函数直接调用。

### 修复（从源码根治）

**文件：`src/assets/style/public-class.scss`**

**步骤 1** — 文件顶部引入 `sass:list` 模块：

```diff
+ @use 'sass:list';
  @import 'public';
```

**步骤 2** — 将 `@for` 循环中所有 `nth()` 替换为 `list.nth()`：

```diff
  @for $index from 1 to 6 {
-   .#{$prefix}-m-#{nth($sizes, $index)} { margin: #{nth($sizes, $index)}px !important; }
-   .#{$prefix}-mt-#{nth($sizes, $index)} { margin-top: #{nth($sizes, $index)}px !important; }
-   .#{$prefix}-mr-#{nth($sizes, $index)} { margin-right: #{nth($sizes, $index)}px !important; }
-   .#{$prefix}-mb-#{nth($sizes, $index)} { margin-bottom: #{nth($sizes, $index)}px !important; }
-   .#{$prefix}-ml-#{nth($sizes, $index)} { margin-left: #{nth($sizes, $index)}px !important; }
-   .#{$prefix}-p-#{nth($sizes, $index)} { padding: #{nth($sizes, $index)}px !important; }
-   .#{$prefix}-pt-#{nth($sizes, $index)} { padding-top: #{nth($sizes, $index)}px !important; }
-   .#{$prefix}-pr-#{nth($sizes, $index)} { padding-right: #{nth($sizes, $index)}px !important; }
-   .#{$prefix}-pb-#{nth($sizes, $index)} { padding-bottom: #{nth($sizes, $index)}px !important; }
-   .#{$prefix}-pl-#{nth($sizes, $index)} { padding-left: #{nth($sizes, $index)}px !important; }
+   .#{$prefix}-m-#{list.nth($sizes, $index)} { margin: #{list.nth($sizes, $index)}px !important; }
+   .#{$prefix}-mt-#{list.nth($sizes, $index)} { margin-top: #{list.nth($sizes, $index)}px !important; }
+   .#{$prefix}-mr-#{list.nth($sizes, $index)} { margin-right: #{list.nth($sizes, $index)}px !important; }
+   .#{$prefix}-mb-#{list.nth($sizes, $index)} { margin-bottom: #{list.nth($sizes, $index)}px !important; }
+   .#{$prefix}-ml-#{list.nth($sizes, $index)} { margin-left: #{list.nth($sizes, $index)}px !important; }
+   .#{$prefix}-p-#{list.nth($sizes, $index)} { padding: #{list.nth($sizes, $index)}px !important; }
+   .#{$prefix}-pt-#{list.nth($sizes, $index)} { padding-top: #{list.nth($sizes, $index)}px !important; }
+   .#{$prefix}-pr-#{list.nth($sizes, $index)} { padding-right: #{list.nth($sizes, $index)}px !important; }
+   .#{$prefix}-pb-#{list.nth($sizes, $index)} { padding-bottom: #{list.nth($sizes, $index)}px !important; }
+   .#{$prefix}-pl-#{list.nth($sizes, $index)} { padding-left: #{list.nth($sizes, $index)}px !important; }
  }
```

---

## 涉及文件汇总

| 文件 | 修改内容 |
|------|---------|
| `package.json` | `sass-loader` 版本 `^10.3.1` → `~10.5.2` |
| `vue.config.js` | 添加 `sassOptions.silenceDeprecations` 配置 |
| `src/assets/style/public-class.scss` | 引入 `sass:list` 模块，`nth()` → `list.nth()` |

---

## 后续建议

- 当项目未来升级到 Vue CLI 5 / Webpack 5 时，可考虑将 `public.scss` 中的 `@import` 改为 `@use`（届时 `~` 前缀路径的兼容方案需要重新评估）。
- `silenceDeprecations` 中的 `'import'` 为临时静默方案，待 `@import` 改造完成后移除。
