Sass中@use导入后下级样式表出现上级编译代码的原因咨询
问题原因解析
核心:@use的「成员作用域隔离」和「样式输出传递」是独立机制
你碰到的现象完全符合Sass @use的设计逻辑,关键要分清两个不同的规则:
- 成员(变量/函数/混合宏)的作用域限制:这是文档明确强调的部分——通过
@use加载的成员仅在当前样式表内可见,其他样式表必须显式@use对应模块才能访问。所以你在project.scss里直接调用$colors会报错,因为这个变量的作用域只覆盖_b.scss和导入它的a.scss,project.scss没直接@use _b.scss,自然拿不到这个变量。 - 样式输出的层级传递:
@use不仅会引入模块的成员,还会把模块里的**可输出CSS代码(比如类选择器、属性声明)**编译到当前样式表的结果中。当a.scss通过@use导入_b.scss时,_b.scss里@each生成的.bg-类已经被整合进a.scss的临时编译产物;而project.scss通过@use导入a.scss时,会把a.scss的所有编译内容(包括来自_b.scss的样式)一并打包到最终的project.css里。
对应你的文件结构拆解
_b.scss:定义$colors变量,同时通过@each生成.bg-类(属于会输出到CSS的代码)a.scss:@use '_b'→ 此时$colors在a.scss中可用,同时_b.scss的.bg-类被编译进a.scss的临时结果project.scss:@use '../a'→ 只能访问a.scss主动暴露的成员(如果a.scss没通过@forward传递_b的成员,就拿不到$colors),但会把a.scss的所有编译内容(包括来自_b的.bg-类)输出到最终的project.css
总结
文档里说的「仅在加载它们的样式表中可见」特指变量、函数、混合宏这类成员,而模块里的可输出CSS代码会随着@use的层级传递被编译到最终产物中,这是正常的设计行为,和作用域隔离规则不冲突。
内容的提问来源于stack exchange,提问作者scorpian111
相关产品推荐
相关产品推荐

