问题出在除法基数还是单位剥离?必须在编译期用@debug在关键节点打点:输入时、单位剥离后、除法前分别调试,配合type-of()确认类型,利用Dart Sass多参数与路径定位精准追溯。

@debug 必须在编译期插在计算链路的关键节点
你写了一个 rem-calc() 函数,输入 16 却输出了 0.875rem 而不是预期的 1rem,问题出在除法基数还是单位剥离?@debug 不能等 CSS 生效后再看,必须在函数内部每一步都“打点”。它不生成 CSS,只向终端吐值,是唯一能穿透编译阶段看到中间态的手段。
常见错误是只在函数末尾 @debug $result,但此时变量已被转换、截断或隐式类型提升,原始线索已丢失。真正有效的做法是:
- 在参数进入函数时立刻
@debug 'input:', $value - 在单位剥离后(如
$num: unitless($value))加@debug 'unitless:', $num - 在除法前检查基准值:
@debug 'base:', $rem-base - 避免在
@if分支外直接@debug $local-var,局部变量作用域外调用会报Undefined variable
嵌套结构必须用 map-get() 或 nth() 逐层展开
@debug $breakpoints 只显示 (sm: 480px, md: 768px),但你真正想确认的是 md 是否被后续 @import 覆盖——这种“表面正常实则失效”的情况最危险。Sass 终端对 map 和 list 做了深度截断,不会递归展开。
正确做法是明确提取你要验证的路径:
立即学习“前端免费学习笔记(深入)”;
- 查 map 某个键:
@debug 'md breakpoint:', map-get($breakpoints, md) - 查 list 第二项:
@debug 'second item:', nth($z-index-stack, 2) - 查嵌套 map:
@debug 'dark theme bg:', map-get(map-get($themes, dark), background) - 配合
type-of()确认类型,防止number被当string拼接:@debug 'type:', type-of($val)
Dart Sass 的多参数和路径定位让调试可追溯
旧版 Node Sass 输出像 DEBUG: #333,连在哪行写的都不知道;Dart Sass(当前标准)默认输出带完整路径、行号、列号,例如:
src/base/_typography.scss:42:3 DEBUG: "font-size:", 1.125rem
这个信息足够你双击跳转到 VS Code 对应位置。更重要的是,它支持逗号分隔多参数:
@debug 'line-height calc:', $base-line-height, '/', $font-size, '=', $result- 不要写
@debug $a + $b——表达式求值不被允许,会直接报错;必须先$sum: $a + $b再@debug $sum - CI 或 Vite 构建中看不到输出?检查
sassOptions.verbose = true是否启用,某些 loader 默认屏蔽@debug
别让 @debug 污染日志,加开关和前缀是底线
多个组件同时开 @debug,watch 模式下保存一次刷屏十几行,关键信息瞬间淹没。这不是功能问题,是使用方式问题。
最小成本控制输出的方法只有两个:
- 加描述性前缀:
@debug '[grid] cols:', $grid-columns,方便grep过滤 - 用变量开关包裹:
@if $debug-mode { @debug 'scale factor:', $scale; },上线前只需改一个$debug-mode: false - 切忌在公共
@mixin或@function内无条件@debug,这会让复用者被迫继承调试噪音 - VS Code 用户建议装 “Sass Lint” 插件,它能自动高亮未删除的
@debug行,避免上线遗漏
最常被忽略的一点:如果 @debug 的变量是 null 或未定义,Dart Sass 会中断编译并报错,而不是静默跳过——这意味着它既是探测器,也是潜在的构建阻断点。你得清楚自己是在查值,还是在查“有没有值”。


















