Skip to content

@use

作用

从其他 Sass 样式表加载 mixinfunction变量,并将来自多个样式表的 CSS 组合在一起,@use 加载的样式表被称为“模块”,多次引入只包含一次。

@use 也可以看作是对@import 的增强

语法

scss
@use "<url>" [as alias|namespace];

加载普通 SCSS、CSS

use 下面的common.scss

scss
$font-size: 14px !default;
* {
  margin: 0;
  padding: 0;
  font-size: $font-size;
  color: #333;
}

@function column-width($col, $total) {
  @return percentage($col/$total);
}

@mixin bgColor($bg-color: #f2f2f2) {
  background-color: $bg-color;
}

use 下面的 about.css

css
h1 {
  font-size: 24px;
}

使用

scss
@use "use/common";
@use "use/about";

加载模块

新增_global.scss

scss
$font-size: 28px;
@mixin base($color: #f00) {
  color: $color;
}

.gclass {
  background-color: #f00;
}

@import 的方式

scss
@import "use/common";
@import "use/global";
@import "use/global";
body {
  font-size: $font-size;
  @include base("#FFF");
  @include base("#000");
  width: column-width(3, 12);
  @include bgColor("#F00");
}

@use 的方式

scss
@use "use/common";
@use "use/global" as g1;
@use "use/global" as g2;
body {
  font-size: common.$font-size;
  @include g1.base("#FFF");
  @include g2.base("#000");
  width: common.column-width(3, 12);
  @include common.bgColor("#F00");
}

通过@use 引入的样式默认把文件名作为模块名使用,你可以通过 as 的形式重新取一个别名

@use 取消别名

可能@use "<url>" as * 来取消命名空间,这种方式加载的模块被提升为全局模块

注意:这种方式慎用

scss
@use "use/common";
@use "use/global" as *;
@use "use/global" as g2;
body {
  font-size: $font-size;
  @include base("#FFF");
  @include g2.base("#000");
  width: common.column-width(3, 12);
  @include common.bgColor("#F00");
}

定义私有成员

如果加载的模块内部有变量只想在模块内使用,可使用-或_定义在变量头即可

例如:

scss
$-font-size: 14px;
* {
  margin: 0;
  padding: 0;
  font-size: $-font-size;
  color: #333;
}
scss
@use "use/common";
@use "use/global" as *;
@use "use/global" as g2;
body {
  font-size: common.$-font-size; // 报错 Error: Private members can't be accessed from outside their modules.
  @include base("#FFF");
  @include g2.base("#000");
}

定义默认值

通过!default 能变量定义默认值

scss
$font-size: 14px !default;
* {
  margin: 0;
  padding: 0;
  font-size: $font-size;
  color: #333;
}

@use 引入时可通过 with(...)修改默认值

scss
@use "use/common" with (
  $font-size: 16px
);
@use "use/global" as *;
@use "use/global" as g2;
common.$font-size: 28px; // 也可能通过这种方式覆盖
body {
  font-size: common.$font-size;
  @include base("#FFF");
  @include g2.base("#000");
}

默认加载 index.scss

创建_index.scss

scss
@use "common" with (
  $font-size: 16px
);
@use "global" as *;
@use "global" as g2;
common.$font-size: 28px; // 也可能通过这种方式覆盖
body {
  font-size: common.$font-size;
  @include base("#FFF");
  @include g2.base("#000");
}

使用

scss
@use "use/index";

@use 使用总结

  • @use 引入同一个文件多次,不会重复引入,而@import 会重复引入
  • @use 引入的文件都是一个模块,默认以文件名作为模块名,可通过 as alias 取别名
  • @use 引入多个文件时,每个文件都是单独的模块,相同变量名不会覆盖,通过模块名访问,而@import 变量会被覆盖
  • @use 方式可通过 @use 'xxx' as *来取消命名空间,建议不要这么做
  • @use 模块内可通过$- 或$来定义私有成员,也就是说或者-开头的 Variables mixins functions 不会被引入
  • @use 模块内变量可通过!default 定义默认值,引入时可通用 with(...)的方式修改
  • 可定义-index.scss 或_index.scss 来合并多个 scss 文件,它@use 默认加载文件

技巧:

1、查看 Live Sass Compiler 使用的是哪种 sass 编译模式

C:\Users\Administrator.vscode\extensions\ritwickdey.live-sass-3.0.0\node_modules\sasslib 自己的安装目录视情况而定

2、查看当前你的命令行 sass 编辑器是哪种编译模式

sass --version

vs code 使用 Easy Sass Autocompile 插件

配置

json
{
  "easySassAutocompile.sassBinLocation": "D:\\node-v13.12.0-win-x64\\node_modules\\sass\\sass.dart.js",
  "easySassAutocompile.subFolder": "../css",
  "easySassAutocompile.sourceMap": false
}