dart sass 2.0+ 彻底移除/除法运算符,因其与css分隔符语义冲突;所有非calc()上下文中的/若左右非纯数字(如font: 12px/24px sans-serif)均在词法层报错,不可禁用,必须改用引号、插值或math.div()。

SCSS 编译时把 CSS 里的 / 当成除法运算符,不是“解析失败”,而是“解析过度”——它本不该参与运算,却被强制当作数学表达式处理,最终报错或输出错误值。
为什么 font: 12px/24px sans-serif 会报 SassError: Invalid CSS after "px/24px": expected expression
Dart Sass 2.0+ 彻底移除了 / 作为隐式除法运算符的机制,但保留了对所有 / 的词法捕获。只要 / 出现在非 calc() 上下文中,且左右任一侧不是纯数字(比如 24px 是带单位的值,sans-serif 是关键字),Sass 就无法判定这是 CSS 分隔符还是除法,直接终止编译。
- 旧版 Sass(如 Node Sass)还会尝试“猜上下文”,但 Dart Sass 不再容忍歧义,错误发生在词法解析层,
// sass:disable-next-line无效 -
grid-template-columns: 1fr/2fr、border-radius: 50%/30%、aspect-ratio: 16/9同样高危——它们语法合法,但 Sass 会先尝试除法解析 -
url(./a.svg)、content: "/"、linear-gradient(to right, a, b)中的/安全,因为无数字参与,不触发除法路径
哪些地方的 / 必须显式处理
不是所有斜杠都出问题,但以下场景只要含数字 + / + 非数字,就大概率崩:
-
font简写:必须用引号或插值,如font: "12px/24px sans-serif"或font: #{"12px/24px sans-serif"} -
grid-area、grid-template-areas中的行列分隔:改用空格或拆解为grid-row/grid-column -
clip-path: polygon(0 0, 100% 0, 100%/2 100%):括号内/会被解析,应写成clip-path: polygon(0 0, 100% 0, calc(100% / 2) 100%) -
border-image的三段式语法(如url(x) 10 / 20 / 5):必须整体字符串化,或改用border-image-slice、border-image-width等独立属性
calc() 里的 / 为什么安全,而外面的不安全
calc() 是 CSS 原生函数,Dart Sass 对其内部内容完全透传,不做任何 Sass 运算解析——width: calc(100% / 3) 会原样输出到 CSS,由浏览器运行时计算。
- 但
width: 100% / 3(无 calc)会被 Sass 当作表达式,要求左侧可转为数值、右侧为纯数字;100%不是数字,直接报错 - 如果变量参与,比如
$gap: 12px; gap: $gap / 2;,这反而是合法的——因为变量触发了“除法上下文”,Sass 明确执行运算,输出gap: 6px - 真正危险的是“看起来像 CSS、实则被 Sass 拦截”的混合场景,比如
font-size: $base-font / 1.2;是合法除法,但font: $base-font / $line-height sans-serif;就非法,因整个值不是单一数值
迁移 Dart Sass 时最容易漏掉的三类 /
升级后只改 math.div() 不够,这些地方常被忽略:
- SCSS 文件里硬编码的
@import "../../vars";:Windows 下反斜杠\可能被误解析为转义,统一换/(如@import "../../vars";) - 第三方库 SCSS 源码中的
font或grid写法:不能指望作者已适配,需用postcss-sass-migrate类工具扫描,或手动加引号兜底 -
background: url(../img/x.png) center / cover;:这里的/是 CSS 分隔符,但 Sass 会尝试解析center / cover,必须写成background: url(../img/x.png) center / cover;→ 改为background: url(../img/x.png) "center / cover";或拆成background-position: center; background-size: cover;
最麻烦的不是报错,而是静默失效:比如 margin: 1rem / 2 在旧 Sass 里可能输出 margin: 0.5rem,在 Dart Sass 里直接编译失败;但若写成 margin: $r / 2 且 $r 是未定义变量,反而可能输出 margin: $r / 2 到 CSS,浏览器忽略——这种 bug 很难被测试覆盖到。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











