当参数缺失、类型错误或值超出合理范围导致逻辑必然崩溃时必须用 @error 中断编译;@warn 仅用于可继续运行但建议优化的场景,如过时单位。

什么时候该用 @error 而不是 @warn
当参数缺失、类型错误或值超出合理范围,导致后续样式无法生成或逻辑必然崩溃时,必须用 @error 中断编译;@warn 只适用于“还能继续跑,但建议你改”的场景,比如传了过时的单位、非推荐的取值。Sass 一旦遇到 @error 就立刻停止,不会输出任何 CSS;而 @warn 只在终端打印提示,编译照常进行。
-
@error "Expected a color, got #{$value}";—— 类型不匹配,停编译 -
@warn "Unitless numbers for `font-size` are deprecated.";—— 兼容性提醒,不中断 - 误把
@warn当@error用,会导致无效值悄悄渗入生成的 CSS,排查困难
校验变量是否为合法颜色值的可靠写法
Sass 没有内置 color.is-valid() 这类函数,得靠组合判断:先用 type-of() 排除非 color 类型,再用 red()/green()/blue() 等函数反向验证(对合法 color 值调用这些函数不会报错,对非 color 值会触发运行时错误)——所以要用 @if + type-of() 兜底,避免直接调用崩溃。
- 正确姿势:
@if type-of($color) == color { ... },再做后续处理 - 错误姿势:
@if red($color) { ... }—— 若 $color 是字符串"invalid",编译直接 crash,且错误堆栈不指向你的校验逻辑 - 可加一层防御:
@if type-of($color) != color or not (red($color) >= 0) { @error "Invalid color: #{$color}"; }
校验数字参数的边界与单位(比如 $z-index 或 $spacing)
纯数字和带单位的数值在 Sass 中是不同类型,type-of(12) 返回 number,type-of(12px) 也是 number,但 unit(12px) 返回 px,unit(12) 返回空字符串。校验重点在「是否允许无单位」和「是否越界」。
- 检查是否为无单位数字:
@if unit($value) == "" and $value - 允许带单位但只接受
rem或em:@if not index("rem" "em", unit($value)) { @warn "Only rem/em units allowed for #{$name}"; } - 注意:
unit(1.5)是"",不是"unitless",别写成== "unitless"
为什么 @error 消息里不要拼接复杂表达式
因为 @error 触发时 Sass 不会执行其消息字符串里的函数调用或插值运算——它只做字面量展开。如果你写 @error "Got #{to-upper-case($input)}";,而 $input 是 null,to-upper-case(null) 本身就会先报错,掩盖你原本想抛出的语义化提示。
- 安全做法:所有计算提前做,再传给
@error,例如:$safe-input: if($input, $input, "none"); @error "Invalid input: #{$safe-input}"; - 调试技巧:在
@error前加@debug $value;,能看清原始值类型,比猜强得多 - 最易忽略的一点:
@error的字符串里不能含未定义变量,哪怕它被包裹在#{}中——Sass 会尝试求值,失败即终止,且错误位置指向@error行,不是变量定义处
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











