scss变量名前缀下划线(\_)非私有标识,仅是命名约定;真正作用域控制依赖@use命名空间与partial文件规则(\_开头文件不被单独编译),而非变量名本身。

SCSS 变量名里加下划线(_)不是私有标记,只是普通命名
SCSS 本身没有“私有变量”概念,$_color 和 $color 在编译器眼里完全等价,都属于全局可访问的变量。所谓“私有”,是团队约定+文件组织实现的逻辑隔离,不是语法特性。
常见错误现象:$_primary-color 被当成“仅供内部用”,结果在别的模块里直接 @use 'theme'; 后写了 color: $_primary-color; —— 它真能用,而且没人拦得住。
- SCSS 变量名中
-和_可互换:定义$border_color,读取时写$border-color也合法 - 真正起作用的是文件位置和引入方式,不是变量名前缀
- 想限制访问,得靠
@use命名空间 + 不导出(不写export),而不是靠$_
_button.scss 这种下划线是文件级 partial 标识,和变量无关
你看到的 _colors.scss、_mixins.scss 开头的下划线,是 Sass 编译器识别「局部文件」的硬性规则,和里面写的变量叫 $primary 还是 $_primary 没半毛钱关系。
使用场景:你要把按钮样式抽成复用模块,就该命名为 _button.scss,然后在主文件里 @use 'button';(注意:没下划线、没扩展名)。
- 错写成
button.scss→ 构建工具可能单独编译出button.css,内容为空或报错 - 错写成
_btn-group.scss→ Sass 不认,报File not found -
@use 'button' as btn;后,变量必须通过btn.$primary访问,这才是实际的“封装”
React + CSS Module 场景下,CSS 变量(--xxx)才真有“私有”语义
你在 Header.module.scss 里写的 --_nav-item-color,这个 --_ 前缀才是现代前端实践中被广泛接受的“内部变量”约定 —— 它不被 CSS 自身执行,但能被 JS 或其他 CSS 读取,且靠命名表明“别碰我”。
关键点在于:这是 CSS Custom Property 的命名惯例,不是 SCSS 的。
- 必须配默认值:
var(--_nav-item-color, #007bff),否则未设置时会失效 - 对外只暴露
--nav-item-color这类无下划线的,--_开头的只在本文件内用 - JS 里改主题色:
element.style.setProperty('--nav-item-color', '#ff6b6b');,不影响--_变量
什么时候该用 $_,什么时候不该用
纯 SCSS 层面,$_ 前缀唯一合理用途是:避免和外部传入的同名变量冲突,尤其在 mixin 或函数参数里。
比如你写一个可配置的边框 mixin:
@mixin bordered($color: #000, $width: 1px) {
$color: $color !default; // 允许覆盖
$_internal-color: darken($color, 10%); // 避免意外覆盖调用方的 $color
border: $width solid $_internal-color;
}
但注意:这仍是“防误操作”,不是语言级私有。如果你在同一个作用域又写了 $color: red;,它照样会覆盖上面那行。
容易被忽略的地方:很多人以为 $_ 能让变量只在当前文件生效,其实不能;真正控制作用域的是 @use 命名空间和文件是否被当作 partial 编译 —— 变量名前缀只是人肉注释。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











