You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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里。

对应你的文件结构拆解

  1. _b.scss:定义$colors变量,同时通过@each生成.bg-类(属于会输出到CSS的代码)
  2. a.scss:@use '_b' → 此时$colors在a.scss中可用,同时_b.scss的.bg-类被编译进a.scss的临时结果
  3. project.scss:@use '../a' → 只能访问a.scss主动暴露的成员(如果a.scss没通过@forward传递_b的成员,就拿不到$colors),但会把a.scss的所有编译内容(包括来自_b的.bg-类)输出到最终的project.css

总结

文档里说的「仅在加载它们的样式表中可见」特指变量、函数、混合宏这类成员,而模块里的可输出CSS代码会随着@use的层级传递被编译到最终产物中,这是正常的设计行为,和作用域隔离规则不冲突。

内容的提问来源于stack exchange,提问作者scorpian111

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:39:50