Dart Sass是唯一支持现代CSS语法的选择,因Node Sass基于已弃用的libsass,无法解析calc()中的/、@container、color-mix()等特性,且@use、math.div()等语法在旧编译器中直接报错。

dart-sass 与 libsass/node-sass 的语法断层
SCSS 特性失效,根本原因是编译器实现不同——dart-sass(官方推荐)和已弃用的 libsass/node-sass 对语法的支持存在不可忽略的差异。比如除法运算:$col / 12 在 node-sass 中合法,但在 dart-sass 中直接报错,必须改用 math.div($col, 12)。
@use 和 @forward 在旧编译器中根本不存在
@use 和 @forward 是 dart-sass 1.23.0+ 引入的模块系统,libsass 完全不识别它们,遇到就报 Invalid CSS after "@use"。即使你只写了 @use "vars",旧版构建工具也会中断编译。迁移时不能只改语法,必须同步升级 sass 实现。
!default 行为在不同版本里逻辑一致,但加载时机更敏感
!default 本身语义没变,但 dart-sass 对变量加载顺序更严格:如果 additionalData 或 node_modules 中的文件提前定义了同名变量,你的 !default 就彻底跳过。而旧版 libsass 有时会因解析松散“偶然生效”,掩盖了实际作用域问题。
插值 #{} 在旧编译器中容错性高,反而埋下隐患
libsass 对 #{} 内部语法错误容忍度高(比如少括号、拼错变量名),可能静默输出空值;dart-sass 则倾向报错或明确提示。这导致同一段插值代码在旧环境“看似工作”,升级后立刻暴露——例如 --color: #{$prmiary}; 拼错变量名,在 libsass 下生成 --color: ;,浏览器忽略;dart-sass 直接报 Undefined variable "$prmiary"。
立即学习“前端免费学习笔记(深入)”;
真正容易被忽略的是:编译器版本不是“能跑就行”的选项,而是决定 SCSS 语法是否被识别的底层开关。哪怕只用了一个 @use 或一处 math.div(),整个项目就必须锁定 dart-sass 及其兼容的构建配置。


















