Dart Sass能正确编译calc()等现代CSS特性,因它将原生CSS交标准parser处理;而Node Sass基于已弃用的libsass,把calc(100% / 3)中的/一律当Sass除法运算符,在词法层即报错,无法识别CSS原生函数。

为什么 calc(100% / 3) 突然编译失败?
这不是 Dart Sass “变严格”,是 libsass 根本没能力识别 calc() 是 CSS 原生函数。它把所有 / 都当 Sass 除法运算符处理,连词法层就崩了:SassError: Invalid CSS after "100%": expected expression。Dart Sass 则把 calc() 交给标准 CSS parser 处理,/ 在里面就是字面斜杠,不会触发除法逻辑。
- 加
// sass:disable-next-line没用——错误发生在注释解析之前 - 改写成
math.div(100%, 3)可以绕过,但更推荐保留calc(),这才是现代 CSS 的正确用法 - 如果项目大量使用
/做单位除法(比如16px / 2),Dart Sass 会警告:Using / for division is deprecated,需迁移到math.div()
@import 变量突然 undefined 怎么办?
Dart Sass 默认启用模块系统(legacy: false),@import 不再全局注入变量/函数,这是设计变更,不是 bug。旧写法 @import "variables" 必须改为:
-
@use "./variables" as *(全局注入,最接近原行为) -
@use "./variables"+variables.$primary(显式命名空间,推荐) - 路径必须带
./或../,@use "variables"会失败,除非你在includePaths显式声明 - 文件名要匹配:想
@use "./variables",就得有_variables.scss;私有文件如_mixins.scss不能直接@use,得重命名或用@forward
为什么 ::v-deep 报 Unknown pseudo-class selector?
错误行通常是 :::v-deep .foo 这种写法。Dart Sass 严格按 CSS 规范解析伪类:::v-deep 是伪元素,:v-deep 才是伪类,且必须带空格才能表示后代选择器。
- 错:
/deep/ .foo、:::v-deep.foo、>>>—— 全部被当成非法选择器名 - 对:
::v-deep .foo(注意冒号数量和空格) -
/deep/和>>已被完全移除,无法通过sass-loader降级兼容 - Vue 3 中应优先用
:deep(.foo)(CSS v-bind 语法),更语义化


















