Files
mes-ui-d2/docs/sass-deprecation-fixes.md
sheng 3eaea3116d
Some checks failed
Release pipeline / publish (push) Has been cancelled
Release pipeline / Always run job (push) Has been cancelled
feat: 新增工厂区域管理页面,修复Sass废弃警告
1. 新增生产配置-工厂模型-工厂区域完整CRUD页面
2. 新增通用表格、弹窗表单、i18n工具组件
3. 升级sass-loader并修复Sass废弃警告
4. 添加文档记录Sass迁移修复细节
2026-05-26 18:32:57 +08:00

147 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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` 改造完成后移除。