主题
Modules 模块化
Sass Modules 能提供更好的命名空间管理和模块隔离,避免命名冲突,并支持更好的性能优化。
关于 @import 导入
Sass Modules 是一种通过 @use 和 @forward 关键字实现的模块化系统,旨在 替代旧的 @import 方法。
命名空间
默认命名空间
- 使用
@use引入模块时,默认会使用文件名作为命名空间。 - 这可以避免不同文件中同名变量、函数和混合宏的冲突。
scss
@use 'variables';
@use 'mixins';
.button {
background-color: variables.$primary-color;
@include mixins.border-radius(5px);
}scss
$primary-color: #3498db;scss
@mixin border-radius($radius) {
-webkit-border-radius: $radius;
-moz-border-radius: $radius;
border-radius: $radius;
}自定义命名空间
使用 as 关键字,可以为引入的模块指定自定义命名空间
scss
@use 'variables' as vars;
@use 'mixins' as mx;
.button {
background-color: vars.$primary-color;
@include mx.border-radius(5px);
}scss
$primary-color: #3498db;scss
@mixin border-radius($radius) {
-webkit-border-radius: $radius;
-moz-border-radius: $radius;
border-radius: $radius;
}全局命名空间
使用 *,可以在引入模块时不使用命名空间。
scss
@use 'variables' as *;
.button {
background-color: $primary-color;
}scss
$primary-color: #3498db;需要注意的是,这种做法会将所有引入的内容直接暴露在全局作用域中,可能会引发 命名冲突。
私有成员
在模块中,可以通过前缀 _ 将变量或混合宏标记为私有成员,这样它们就不会被 @use 引入。
scss
@use 'variables';
.button {
background-color: variables.$primary-color;
// variables.$_private-color; // 会报错,$_private-color 是私有的,不能被访问
}scss
$primary-color: #3498db;
$_private-color: #ff0000;with
@use with 是 Sass 中的一个功能,用于在使用 @use 引入模块时,修改或重命名模块中的变量。它允许你在加载模块的同时,传递自定义的配置选项,如变量值,或者改变变量的默认值。
修改模块中的变量
scss
@use 'variables' with (
$primary-color: red,
$secondary-color: blue
);
.button {
background-color: variables.$primary-color;
}scss
$primary-color: #3498db !default;
$secondary-color: #2ecc71 !default;编译后的 styles.scss:
css
.button {
background-color: red;
}重命名变量
还可以使用 with 来重命名模块中的变量。
例如,如果你不想使用原本的变量名,可以通过重命名来避免命名冲突:
scss
@use 'variables' with (
$primary-color as $my-primary-color
);
.button {
background-color: variables.$my-primary-color;
}编译后的 styles.scss:
scss
.button {
background-color: #3498db; /* 原始的 $primary-color 的值 */
}@forward
使用 @forward 转发模块时,可以控制导出的命名空间和内容:
scss
@use 'base';
.button {
background-color: base.$primary-color;
@include base.border-radius(5px);
}scss
@forward 'variables';
@forward 'mixins';scss
$primary-color: #3498db;scss
@mixin border-radius($radius) {
-webkit-border-radius: $radius;
-moz-border-radius: $radius;
border-radius: $radius;
}也可以在转发时选择性导出特定内容:
scss
@use 'base';
.button {
background-color: base.$primary-color;
// @include base.border-radius(5px); // 会报错,因为 border-radius 没有被转发
}scss
@forward 'variables' show $primary-color;
@forward 'mixins' hide border-radius;scss
$primary-color: #3498db;scss
@mixin border-radius($radius) {
-webkit-border-radius: $radius;
-moz-border-radius: $radius;
border-radius: $radius;
}