Dart Sass是当前唯一能正确编译现代CSS语法的实现——Node Sass因依赖已弃用的libsass,无法解析calc(100% / 3)、@container、color-mix()等特性,错误发生在词法层且不可绕过;Dart Sass通过分层解析严格遵循CSS规范,支持新特性原样透出,并要求::v-deep等写法符合标准。

sass 不是“首选”,而是当前唯一能正确编译现代 CSS 语法的实现——不用它,calc(100% / 3)、@container、color-mix() 这类写法直接报错,构建失败。
Node Sass 解析 / 就崩溃,不是 bug 是能力缺失
Node Sass 基于已终止维护的 libsass(2020 年底官方弃用),它的词法解析器把所有 / 都当 Sass 除法运算符处理:
-
width: calc(100% / 3);→ 报错SassError: Invalid CSS after "100%": expected expression - 加
// sass:disable-next-line没用——错误发生在词法层,根本没走到注释处理逻辑 - 哪怕你只在 CSS 函数里用
/,它也认不出来
Dart Sass 能原样透出 @container 和 color-mix()
它把 CSS 原生部分交给标准 parser,Sass 扩展逻辑再叠加,所以新特性不经过“翻译”就直出:
-
@container (min-width: 400px) { .card { ... } }→ 输出合法 CSS -
background: color-mix(in srgb, red 50%, blue);→ 正常编译,不报Unknown at rule - 配合
@use "sass:color"和@use "sass:math",还能用hwb()、color.adjust()等相对颜色函数
::v-deep 写法必须带空格,否则样式丢失
这不是 Dart Sass “变严格”,而是它终于按 CSS 规范解析伪元素:
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
- 错误写法:
::v-deep.foo→ Dart Sass 当成一个伪类名,报Unknown pseudo-class selector "::v-deep.foo" - 正确写法:
::v-deep .foo(注意空格)→ 表示后代选择器,样式生效 -
/deep/已被完全移除,loader 无法降级兼容;>>>同样失效
迁移只需两步,但工具链配置最容易漏
看似简单,实操中常因残留配置导致构建失败:
立即学习“前端免费学习笔记(深入)”;
- 卸载:
yarn remove node-sass或npm uninstall node-sass - 安装:
yarn add sass -D(不是dart-sass,该包早已重定向弃用) - 检查
sass-loader配置:Vite / Vue CLI 默认已设implementation: require('sass'),但若项目手动写了implementation: require('node-sass'),就会触发Module build failed: SassError: Invalid CSS after ""
calc() 里写 /、在组件里用 @container、或依赖 ::v-deep 时,容错性归零,没得绕。

















