dart sass是唯一能正确编译现代css语法的实现——node sass因依赖已弃用的libsass,在词法层将calc(100% / 3)中的/误判为sass除法而崩溃,且无法识别@container、color-mix()等新特性;dart sass通过分层解析,将css原生部分交标准parser处理,确保新特性无损透出。

不用 Dart Sass,calc(100% / 3)、@container、color-mix() 这类写法直接编译失败——不是“推荐用”,是“唯一能过”。Node Sass 依赖已终止维护的 libsass,词法层就崩,连注释都绕不过去。
Node Sass 解析 calc() 中的 / 就报错
Node Sass 把所有 / 当作 Sass 除法运算符,哪怕它出现在 CSS 原生函数里:
-
width: calc(100% / 3);→ 报SassError: Invalid CSS after "100%": expected expression -
// sass:disable-next-line无效:错误发生在词法解析阶段,根本没走到注释处理逻辑 - 你不能靠加空格或换行绕过,libsass 压根不识别
calc()是标准函数
Dart Sass 能原样透出 @container 和 color-mix()
它把 CSS 原生语法交给标准 parser,Sass 扩展逻辑再叠加,所以新特性不翻译、不降级、不丢:
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
-
@container (min-width: 400px) { .card { } }→ 输出合法 CSS,Node Sass 直接报Unknown at rule -
background: color-mix(in srgb, red 50%, blue);→ 正常通过,Node Sass 认不出这个 token -
@use "sass:color"和@use "sass:math"可调用hwb()、color.adjust()等相对颜色函数
::v-deep 写法必须带空格,否则样式丢失
这不是 Dart Sass “变严格”,而是它终于按 CSS 规范解析伪元素:
- 错误写法:
::v-deep.foo→ Dart Sass 当成未知伪类,报Invalid selector - 正确写法:
::v-deep .foo(注意空格)→ 表示后代选择器,样式生效 -
/deep/和>>>已完全移除,loader 无法降级兼容
迁移只需两步,但工具链残留配置最易踩坑
卸载和安装只是表象,真正卡住的是构建工具里的隐式引用:
- 卸载:
yarn remove node-sass或npm uninstall node-sass - 安装:
yarn add sass -D(不是dart-sass,该包早已重定向弃用) - 检查
sass-loader配置:若手动写了implementation: require('node-sass'),会触发Module build failed: SassError: Invalid CSS after "" - Vite / Vue CLI 默认用
require('sass'),但旧项目常有手写覆盖
真正难的不是换包,是接受一个事实:Node Sass 的“兼容”其实是容忍非法 CSS;Dart Sass 的“报错”才是规范本该有的样子。尤其当你在 calc() 里写 /、在组件里用 @container、或依赖 ::v-deep 时,容错性归零,没得绕。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










