SASS模块化

294 阅读2分钟

前置

使用场景:在 scss 文件中引入其他的scss文件

运行时

指的是:写的是什么编译出来的就是什么,可直接在浏览器中运行,如:

有这么一个跟SASS文件同目录的common.css文件,需要在SASS文件中引入

// common.css
body {margin: 0;}

// 在其他文件中引入
@import url("./common.css");

编译结果(vscode Live Sass Compiler 插件编译):

@import url("./common.css");

编译时

指的是:引入的css文件,最终会在引入的文件中编译成对应具体的css,如:

@import "./common.css"

编译结果:

body { margin: 0; }

不同版本的引入方式

1.23.0 以前

  • 运行时:@import url("");
  • 编译时:@import "";

1.23.0 +

  • 运行时:@import "";
  • 编译时:@use "";

旧版引入方式导致的问题

  • 混淆: import承载着两个作用(运行时 和 编译时),只看@import比较难一下子就反应过来这是 运行时 的引入还是 编译时 的
  • 污染: 假如有两个不同的SASS文件,里面都有一个相同变量名的$color: red;,如果同时引入这两个文件的话,后引入的SASS文件中的 $color: green;就会替换掉之前引入的。因为变量的调用方式只能用$color,无法区分是否是不同的模块文件
  • 没有私有

新版本对应的处理方式

使用方式

要使用某个模块内的变量,需要带上 文件名 或者是 自定义的名称 ,例:

// common.scss
$color: red;

// 在其他文件中引入
@use "./common.scss";
body { color: common.$color; }

混淆

使用不同的导入方式做区分,具体:[1.23.0+](#1.23.0 +)

污染

例:有两个同级目录的scss文件,两个文件里都定义了变量$color,使用方式如下:

  • 文件名不同的情况【common.scss、var.scss】,使用文件名去调用对应文件里的变量
@use "./common.scss";
@use "./var.scss";

body {
	color: common.$color;
	// color: var.$color; 
}
  • 有两个文件名一样,但不同目录的scss文件,使用自定义的命名空间名称
@use "./a/var.scss" as a;
@use "./b/var.scss" as b;

body {
	color: a.$color;
	// color: b.$color;
}

私有变量

  1. 官方文档写法(推荐写法):用$-定义变量,如:$-color: red
  2. 约定俗成的写法:用$_定义变量,如$_color: red。虽是约定的写法,但sass的检测工具也是将这种写法识别为私有
  3. 在 @function 或 @mixin 中定义的变量
@mixin private-mixin {
  $mixin-var: 10px; // 仅在 mixin 内可用
  padding: $mixin-var;
}

// 错误:无法在外部访问 $mixin-var
.box { margin: $mixin-var; }
  1. 在代码块中定义的变量,仅在该块内有效
.container {
  $local-size: 16px; // 仅在 .container 内可访问

  .item {
    font-size: $local-size; // 正确
  }
}

// 错误:此处无法访问 $local-size
.other { font-size: $local-size; }

PS: 第1点的写法 为1.23.0后的写法 可以给代码添加对应的文档注释 /// @access private(or public),或者给文件名前添加下划线_common以做区分,但实际起作用的还是 @use$-

参考资料