@use 是 Sass 唯一推荐的模块导入方式,取代已弃用的 @import;它强制命名空间、要求下划线 partial 文件、禁止混用且路径必须精确匹配文件系统。

@use 是当前 Sass 开发中唯一推荐的模块导入方式,@import 已被 Dart Sass 官方标记为 deprecated(自 3.5 起),v2.0+ 将彻底移除。这不是风格偏好问题,而是作用域、可维护性与构建稳定性的硬性分水岭。
为什么 @use 导入后所有变量都报 “Undefined variable”?
这不是 bug,是设计强制你面对命名空间——@use 默认不把任何成员提升到全局,所有变量、混入、函数必须显式加前缀访问。
-
@use "colors"→ 必须写colors.$primary,写$primary直接报错 -
@use "colors" as c→ 只能用c.$primary,colors.$primary反而非法 - 连字符变量名保持原样:
colors.$text-sm不能写成colors.$textSm(Sass 不做驼峰转换) - 路径必须指向下划线开头的 partial 文件:
@use "variables"✅(自动匹配_variables.scss),@use "variables.scss"❌ 报No module with the name
@import 的静默覆盖到底有多危险?
@import 是纯文本拼接,没有作用域边界。一旦两个文件定义同名变量,后导入的会无提示覆盖前者,且你在使用处完全看不出值来自哪。
-
@import "theme/dark"定义$bg: #111,紧接着@import "theme/light"定义$bg: #fff→ 全局$bg永远是#fff - 第三方库(如 Bootstrap)和你自己的
_mixins.scss都导出@mixin clearfix→ 编译器只认最后一个,行为不可控 - 重复
@import "utils"五次?Sass 就解析五次,生成冗余 CSS,热更新变慢,HMR 失效
@use 路径写错就编译失败,怎么确保路径正确?
@use 的路径解析极其严格:不自动补扩展名、不猜文件名、不搜子目录,必须精确匹配文件系统中带下划线的 partial 文件。
- 相对路径从当前文件算起,不是项目根目录:
@use "../theme/colors"表示上一级再进theme/colors.scss - 若实际路径是
src/scss/_colors.scss,而在src/components/button.scss中写@use "colors"→ 失败;应写@use "../../scss/colors"或配置 CLI 的--load-path=src/scss - 不能
@use "normalize.css":纯 CSS 文件不支持,必须新建_normalize-wrapper.scss,内容仅有一行:@import "node_modules/normalize.css/normalize.css";,再@use "normalize-wrapper" - 路径中含空格或中文?Dart Sass 直接拒绝解析,不报具体错误,只卡在编译中断
迁移时最容易忽略的三个硬性限制
把 @import 全局替换为 @use 一定会失败。真正卡住的是这些底层规则:
立即学习“前端免费学习笔记(深入)”;
-
@use必须位于文件最顶部,不能包在@media、@if或选择器里,否则报Invalid CSS after "@use" -
!default在@use下只生效一次:旧写法$primary: red !default在多个@import中可被反复“回退赋值”,但@use加载后值就固定了 - 不能混用:
@use和@import同在一个文件里,Sass 会直接拒绝编译(2026 年起已成铁律)
_xxx.scss 是必须遵守的命名规范,@use 路径不是字符串,而是对文件系统的一次精确寻址。漏掉一个下划线、写错一级目录、或者试图绕过命名空间直接用裸变量,都会让编译器立刻停下。


















