@forward 是统一暴露接口而非导入,只建立下游访问通道,不注入变量;当前文件需额外 @use 才能使用变量,且 @forward 必须为首条语句,转发文件禁定义新内容。

@forward 不是“统一导出”,而是“统一暴露接口”——它不加载、不执行、不注入变量,只决定外部能看见什么、以什么命名空间看见。
为什么 @forward 后当前文件用不了变量
常见错误现象:@forward "colors" 写完立刻写 color: $primary-color,报错 Undefined variable "$primary-color"。
这不是路径或拼写问题,而是误以为 @forward 会把变量“搬进当前作用域”。它不会。它只建立一条“下游可访问通道”。
- 想在当前文件使用变量?必须额外加一行
@use "colors"(且@use要写在@forward之后) -
@forward必须是文件第一个有效语句:前面不能有注释、空行、@charset以外的任何内容 - 转发文件(如
_index.scss)里禁止定义新变量或@mixin,否则这些内容既不会被转发,又会破坏模块边界
如何避免多个模块转发同名变量冲突
典型错误:@forward "buttons" 和 @forward "cards" 都含 $radius-sm,编译直接报错 "$radius-sm" is already used。
这是 Sass 的保护机制,不是 bug。解决方式只有两个:
- 用
as隔离命名空间:@forward "buttons" as btn-*→ 外部用btn-$radius-sm;@forward "cards" as card-*→ 用card-$radius-sm - 把共用变量(如
$spacing-md)统一收口到基础层(如core/variables),其他模块只@use不转发 - 若必须精简暴露,可用
show显式限定:@forward "utils" show $spacing-xs, $z-index-base
如何让入口文件同时支持 @use "kit" 和 @use "kit" as *
单靠 @forward "colors" 不行。入口文件(如 index.scss)必须组合 @use + @forward,且自身不定义任何逻辑。
正确写法:
@use "core/variables" as core;<br>@use "utils/mixins" as utils;<br>@forward "core/variables" as core-*;<br>@forward "utils/mixins" as utils-*;
这样使用者才有两种选择:
-
@use "index" as i;→ 写i.core-primary-color -
@use "index" as *;→ 直接用$primary-color和@include text-truncate
关键点:入口只是中转站,所有变量、函数、mixin 必须下沉到子模块;一旦你在 index.scss 里加了 $tmp: 12px,它既不会被转发,又会干扰依赖链。
@forward 的 with 参数改名后函数调用失败怎么办
错误写法:@forward "color" with ($primary as $brand);,然后外部调用 color.scale-lightness() 报 Undefined function。
原因不是改名失败,而是函数内部仍依赖未被重映射的原始变量(比如它内部用了 $colors,但 with 没一并声明)。
-
with只改名,不重绑定作用域 —— 原函数运行时仍查找它所在模块的变量 - 调试技巧:先删掉
with,用原始名称测试是否能跑通,确认问题是出在改名还是依赖缺失 - 若必须改名且保留功能,需在
with中显式重映射全部依赖项:@forward "color" with ($colors as $colors, $primary as $brand)
真正容易被忽略的是:转发文件里的 @use 关系必须完整,@forward 不会帮你补依赖。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











