sass的模块化,@import的编译时和运行时详解

sass如同css一样 可以模块化。

css中通过import来实现模块化, 但是两者有些不同,css是会参与到运行时的,也就是说运行的过程中有多个css文件,通过import指令导入进来。但是sass并不是个运行时态,sass是一个编译时态。也就是说在运行之前把它分为多个模块。编译之后就变成一个文件了,以上就是css和sass模块化的区别!

在sass中实现模块化有两种方式:一种是用@import 一种是@use

首先我们来说@import,其中分为运行时语法和编译时语法

运行时语法

scss代码:

编译后的css代码:

 

 因为@import url(“xxx”)这种写法就是运行时态,换句话说就是css代码,所以编译后还是css代码

 编译时语法:

//common.scss

$color:red
//index.scss

@import "./common.scss"

.foo{
color:$color
}

编译后:index.scss生成的css文件就会包含common.scss里面的代码,自然可以使用common里面的css变量.

因为@import "xxxxx" 这种方式写是编译文件时生效。

scss官方并不建议使用import,并说在之后会废弃这个用法,

第一个原因是import去做运行时用 无所谓,因为本身就是css自带的,但是用作编译时就容易产生混淆,因为需要通过import后面是否有url()来判断是编译时还是运行时。

第二个原因是容易造成污染,在一个项目中我们肯定会抽离很多个scss模块,模块里可能会定义不同的变量,这些变量极易导致名称冲突。比如上面引入两个scss文件,都定义了$color变量,那么后一个会覆盖前一个,并且不会报错。这个存在很大隐患。

第三个原因是不存在私有,没有导入 、导出。

所以因为以上原因建议编译时使用@use

@use使用方法:

使用@use导入的scss文件,是有命名空间的,不论导入的文件层级有多深,默认就是一最后文件名为命名空间。该模块的所有成员都需要通过这个命名空间去访问。 

 加入通过@use按照下面这种方式导入 该如何应对,虽然两个common.scss文件是在不同目录,但是命名空间默认是以文件名命名,所以这个时候需要自定义命名空间。

@use "./common.scss"
@use "./a/b/common.scss"
@use "./common.scss" as a
@use "./a/b/common.scss" as b

还用一种方式是 as *  这种代表将该scss文件里面所有成员全部全局导出,那么也就不存在命名空间了。(不太建议这种搞,最好还是用带有命名空间的方式)

@use "./common.scss" as *

@use写法下设置私有变量

在变量$符号和名字之间加- 或者_ 都可以(本身下划线这种命名方式在前端就是表示内部使用、私有的)

//common.scss

$-n : 6;//或者 $_n : 6;

如果在外部使用了这个私有变量  编译时会报错

@use './common.scss' as a;

.foo{
color : a.$_n;
}

猜你喜欢

转载自blog.csdn.net/m0_57033755/article/details/132056197