相信各位同学最近使用sass
时会遇到控制台警告问题,这是因为随着CSS发展,sass
将升级导入文件的语法,@import
语法因为全局作用域,依赖关系混乱等原因将被@use
语法取代。
在 Sass 中,@import
和 @use
都用于模块化代码,但二者有显著区别。以下是主要差异和具体案例说明:
核心区别对比
特性 | @import (旧版) | @use (新版) |
作用域 | 全局作用域(变量/混合易冲突) | 局部作用域(需通过命名空间访问) |
重复加载 | 可能多次加载同一文件 | 自动保证单例加载(仅加载一次) |
命名空间 | 无命名空间(直接访问成员) | 默认文件名作为命名空间(可自定义) |
私有成员 | 不支持(所有成员可被外部访问) | 支持(- 或_ 前缀变量为私有) |
跨文件依赖 | 依赖关系混乱 | 显式依赖关系(更易维护) |
案例说明
1. 基础使用对比
@import方式
//variables.scss
$primary-color: #3498db;
//main.scss
@import 'variables';
.button { color: $primary-color; }
@use 方式
//variables.scss
$primary-color: #3498db;
// main.scss
@use 'variables' as vars;
.button { color: vars.$primary-color; }
2. 命名空间冲突解决
首先在两个scss文件定义相同的变量
// theme.scss
$color: red;
// utils.scss
$color: blue;
@import语法:当两个文件定义了相同的变量会产生冲突,之前加载的变量值将被覆盖
// ❌ @import 的冲突
@import 'theme';
@import 'utils';
.text { color: $color; } // 输出 blue(后者覆盖前者)
@use语法:导入将使用文件名称为默认的命名空间,使用变量时需要按命名空间.变量方式引用!
// ✅ @use 的隔离
@use 'theme';
@use 'utils';
.text {
color: theme.$color; // red
background: utils.$color; // blue
}
使用 as语法可以修改命名空间
@use 'theme' as t;
@use 'utils' as u;
.text {
color: t.$color; // red
background: u.$color; // blue
}
3. 私有成员保护
@import语法时代通常命名变量时不区分私有和共有变量,所有导入文件都可以访问。
@use语法增加了私有变量命名规则,只需要在变量前加上“-”或者“_”,
// _config.scss
$-private-var: 10px; // 私有变量(仅文件内可用)
$public-var: 20px; // 公共变量
// ❌ @import 无法隐藏
@import 'config';
.element { margin: $-private-var; } // 仍可访问
// ✅ @use 保护私有
@use 'config';
.element {
margin: config.$public-var; // 正常
// padding: config.$-private-var; // 报错找不到变量!
}
注意!这将带来一个问题,在以往使用@import语法时常常使用“–”开头来给变量取名,一旦迁移升级到@use语法,导出的变量将不可访问!!因为此时变量已成私有了,只能在文件内部访问!
# sass报错:[sass] Undefined variable. @import升级@use语法注意事项
4. 按需加载机制
@import多次引用同一文件时,会重复加载
// ❌ @import 重复加载
@import 'module';
@import 'module'; // 重复编译
@use导入文件将只会加载一次!
// ✅ @use 单例
@use 'module';
@use 'module'; // 无重复问题
迁移建议
- 逐步替换:优先在新增文件中使用
@use
,逐步替换旧@import
- 命名空间简化:通过
@use 'module' as *;
省略命名空间(慎用,可能引发冲突) - 结合 ****
@forward
:使用@forward
直接转发模块(适合工具库开发) - 注意私有变量规则: 使用@use时需要注意 -或者_ 表示私有变量,@import旧代码可能会定义-或者_开头的变量。使用@use引入时会报错
总结
- 弃用 ****
@import
:Sass 官方已计划逐步弃用@import
,推荐使用@use
- 模块化优势:
@use
通过作用域隔离和显式依赖,提升代码可维护性 - 未来兼容性:新项目应直接采用
@use
+@forward
体系