@forward 是接口门禁而非导出开关,只建立下游访问通道而不注入变量到当前作用域;需配合 @use 才能在本文件使用变量,且 @forward 必须位于文件首行。

@forward 不是导出开关,而是接口门禁——它不加载变量、不执行样式、不注入作用域,只决定“外部能看见什么”。
为什么 @forward 后本文件里用不了 $color-primary
常见错误现象:@forward "tokens" 后直接写 color: $color-primary,编译报 Undefined variable "$color-primary"。这不是路径或拼写问题,是根本误解了 @forward 的行为:它只建立一条“下游可访问通道”,不会把变量搬进当前作用域。
- 想在当前文件使用变量?必须额外加一行
@use "tokens" as t,且@use要写在@forward之后 -
@forward必须是文件第一个有效语句,前面不能有空行、注释或任何其他内容 - 转发文件(如
_index.scss)里禁止定义新变量或@mixin,否则这些内容既不会被转发,还会破坏模块边界
怎样让 @use "kit" 同时获得 CSS 和变量
入口文件不能只写 @forward。必须组合 @use + @forward,且所有样式规则必须下沉到子模块中。
- 在
_kit.scss顶部先@use "buttons"、@use "forms"→ 确保它们的 CSS 被实际加载并参与编译 - 再写
@forward "buttons"、@forward "forms"→ 把它们的变量、@mixin、占位符等成员统一导出 - 路径必须带下划线和
.scss后缀:@forward "./components/_buttons.scss"✅,@forward "buttons"❌(除非配置了 load path) - 若多个组件都依赖
_reset.scss,别让每个子模块都@use "reset",而是在_kit.scss里@use "reset"一次,再@forward "reset"
如何避免多模块转发同名变量导致冲突
Sass 编译器会直接报 "$radius-sm" is already used,这不是 bug,是作用域保护机制。比如 buttons 和 cards 都转发了 $radius-sm,就会失败。
- 最稳妥的解法:统一由基础层(如
_foundations.scss)提供$radius-sm,其他模块只@use不转发 - 若必须保留各自定义,就用
as隔离命名空间:@forward "buttons" as btn-*、@forward "cards" as card-*,外部调用时自然区分成btn-$radius-sm和card-$radius-sm - 用
with改名要小心:@forward "buttons" with ($radius-sm as $btn-radius)可行,但函数内部仍依赖原模块的其他未转发变量,容易报Undefined function
怎样支持 @use "kit" as * 和 @use "kit" as k 两种用法
单靠一个 @forward 不行。入口文件(如 _index.scss)必须组合 @use + @forward,且自身不能定义任何新逻辑。
- 正确写法:
@use "core/variables" as core;+@forward "core/variables" as core-*; - 这样使用者可选:
@use "index" as i;→ 用i.core-primary-color;或@use "index" as *;→ 直接用$primary-color - 关键点:入口只是中转站,所有变量、函数、
@mixin必须下沉到子模块;一旦你在_index.scss里加了$tmp: 12px;,它既不会被转发,又会干扰依赖链 - 所有
@forward语句必须放在文件最顶部,不能在@mixin内或条件块里
真正难的不是写对第一组 @use + @forward,而是让每个新增组件都严格遵守“子模块定义 → 入口 @use/@forward → 分层变量 → 命名空间访问”这条链路。松动一次,模块边界就从代码里消失,变成靠文档和人肉记忆维系的脆弱约定。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











