统一spacing scale需定义、取用、约束三者协同,否则组件中仍会出现margin: 12px硬编码;须封装轻量mixin、强制命名参数、编译期校验及CI拦截,方能落地。

统一 spacing scale 不是写几个变量就能落地的,关键在于变量怎么定义、怎么取用、怎么约束调用方行为——三者缺一,就会在组件里冒出 margin: 12px 这种硬编码。
为什么 $spacers map 定义了却没人用
常见现象是 $spacers 文件写了,但业务组件里仍直接写像素值。根本原因不是大家不配合,而是调用成本高:每次写 margin-top: map-get($spacers, "sm") 太啰嗦,且没报错机制兜底。
- 必须封装
@mixin m()和@mixin mt()等快捷写法,否则开发者自然退回手写数值 - 变量文件要
@use "abstracts/spacers" as s;,调用时写s.m("sm")或@include s.m("sm"),命名空间强制可见,避免误用旧变量 - 在 CI 流程中加 lint 规则:禁止匹配
/margin[^{]*:\s*\d+px/i这类硬编码样式,从构建层拦截
单位混用导致 math 运算失败
map-get($spacers, "md") + 8px 能跑,但 map-get($spacers, "md") + 0.5rem 会直接编译报错——Sass 不允许隐式单位混合。很多人以为“都用 rem 就安全”,结果设计稿给的是 px,开发顺手写了 "sm": 8px,主题色模块却用 rem 基准,一做乘法就崩。
- 全项目统一用
px定义$spacers,最稳;rem 适配交给根字体尺寸或 CSS 自定义属性,不在 Sass 数学层介入 - 所有加减乘除运算前,显式转换单位:
map-get($spacers, "md") * 2可行,map-get($spacers, "md") + 2必须写成map-get($spacers, "md") + 2px - 别在
@mixin内部做单位转换(如自动把"sm"转成0.5rem),这会让调用方失去对输出单位的控制权
参数传错或漏传却不报错
@mixin m($top, $right, $bottom, $left) 这种纯位置参数,一旦调用时少传一个,Sass 不报错,但 $left 会变成 undefined,后续参与计算就产出 margin: 8px 16px 24px null,浏览器静默忽略整条规则——你只看到“间距没了”,找不到源头。
立即学习“前端免费学习笔记(深入)”;
- 全部改用带默认值的命名参数:
@mixin m($top: null, $right: $top, $bottom: $top, $left: $right) - 在 mixin 开头加校验:
@if not map-has-key($spacers, $top) { @error "Invalid spacer key: #{$top}" } - 调用时必须用命名形式:
@include m($top: "sm", $right: "md"),顺序无关,也跳过中间参数
真正卡住落地的,从来不是“该不该统一”,而是没人愿意为多敲几个字符承担维护成本。所以封装必须轻量(一行调用)、校验必须前置(编译期报错)、错误必须明确(告诉你是哪个键名错了)。否则它就只是个放在 abstracts 目录里的漂亮文件。


















