@forward 是为大型架构设计的模块暴露机制,不执行导入仅建立转发通道;必须置于@use之前,配合as前缀隔离命名、with传递默认配置,且不可逆。

@forward 不是“简化写法”,而是为大型架构提供可控的模块暴露机制——它不执行导入,只建立转发通道;用错顺序或漏掉 as/with 就会暴露不该暴露的变量、覆盖配置、甚至导致编译失败。
为什么 @forward 不能代替 @use 直接使用
@forward 本身不加载模块内容,它只是告诉“谁来用我,就能访问被转发的模块成员”。如果在转发文件里直接写 $primary-color,会报错:Undefined variable "$primary-color"。
- 转发文件(如
_index.scss)中只能写@forward "colors",不能访问colors里的任何变量或 mixin - 真正要读取或修改变量,必须在使用端(如
main.scss)通过@use "index"+ 命名空间访问 - 常见错误:把
@forward当成@use的缩写,在转发文件里尝试调用@include colors.reset—— 这行不通
as 前缀如何防止命名冲突和暴露路径细节
用 as 给转发成员加统一前缀,既能隐藏原始模块路径,又能避免下游误用未声明的内部名。
- 比如
@forward "utils/breakpoints" as bp-*;,下游只能写@include bp-max("md"),无法知道 breakpoint 实际在utils/下 - 若多个模块都导出
$radius,用@forward "buttons" as btn-*;和@forward "cards" as card-*;就天然隔离了btn-$radius和card-$radius - 注意:
as必须写在with前面,@forward "colors" with ($primary: red) as color-*;是非法语法
with 参数传递只影响被转发模块的默认值
with 不是给转发者自己设值,而是把配置透传给被转发的源模块——相当于“替使用者提前填好 !default 变量”。
- 源文件
_colors.scss中定义:$primary: #3b82f6 !default; - 转发文件
_design-system.scss写:@forward "colors" with ($primary: #ef4444); - 下游
@use "design-system";后,design-system.$primary就是#ef4444,不是默认的蓝色 - 但如果下游自己也带
with:@use "design-system" with ($primary: #8b5cf6);,则以它为准(with链路支持覆盖)
@forward 和 @use 的顺序影响配置优先级
同一个文件里混用 @forward 和 @use 时,@forward 必须写在 @use 前面,否则源模块的 !default 可能被意外覆盖。
- 错误顺序:
@use "colors"; @forward "colors" with ($primary: pink);→@use先加载,$primary已按默认值初始化,with失效 - 正确顺序:
@forward "colors" with ($primary: pink); @use "colors";→ 转发时已注入配置,@use加载的是已配置后的版本 - 更安全的做法:转发文件只做
@forward,不写@use;配置全留给下游@use时传
真正容易被忽略的是:@forward 的转发行为不可逆,一旦用了 as 或 with,下游就无法绕过它去访问原始未修饰的成员。如果你需要同时暴露带前缀和不带前缀的版本,得拆成两个独立的转发语句,或者改用组合式入口文件结构。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











