Skip to content

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;
}

基于 MIT 许可发布