@import
1、运行时语法:
css
@import url('xxxxxx.css');
// 编译后
@import url('xxxxxx.css');
2、编译时语法:
编译后:生成的css文件就会包含common.scss里面的代码,自然可以使用common里面的css变量
css
// common.scss
$color: red
@import "./common.scss"
.foo{
color: $color
}
- 混淆:需要通过import后面是否有url()来判断是编译时还是运行时。
- 污染:容易造成污染,在一个项目中我们肯定会抽离很多个scss模块,模块里可能会定义不同的变量,这些变量极易导致名称冲突。比如上面引入两个scss文件,都定义了$color变量,那么后一个会覆盖前一个,并且不会报错。这个存在很大隐患。
- 私有:不存在私有,没有导入 、导出。
@use
1、命名空间
使用@use导入的scss文件,具有命名空间,不论导入的文件层级有多深,默认就是一最后文件名为命名空间。该模块的所有成员都需要通过这个命名空间去访问。
css
// common.scss
$color: red
@use "./common.scss"
.foo{
color: common.$color
}
2、自定义命名空间
当多个文件名相同,且路径不同时,可以使用as自定义命名空间
css
// common.scss
$color: red
// a/common.scss
$color: #000
@use "./common.scss" as a
@use "./a/common.scss" as b
.foo{
color: a.$color
}
// 得到foo的color值为red
3、全局导出
还用一种方式是 as * 这种代表将该scss文件里面所有成员全部全局导出,那么也就不存在命名空间了。(不太建议这种搞,最好还是用带有命名空间的方式)
css
@use "./common.scss" as *
4、私有变量
在变量$符号和名字之间加- 或者_ 都可以(本身下划线这种命名方式在前端就是表示内部使用、私有的)
css
//common.scss
$_n : 6;
//或者
$-n : 6;
错误使用:
css
@use './common.scss' as a;
.foo{
color : a.$_n;
}
// 如果在外部使用了这个私有变量 编译时会报错