dart sass 2.0 彻底移除对非标准css行为的容忍,严格遵循规范:calc()内/合法,sass层除法须用math.div();::v-deep必须带空格(如::v-deep .foo),/deep/和>>>完全失效;legacy-js-api警告需升级sass-loader至v14+并指向require('sass')。

Dart Sass 2.0 不是“弃用某些旧语法”,而是彻底移除了对非标准 CSS 行为的容忍——比如把 / 当作除法运算符无条件处理,或允许 :::v-deep 这类不合规选择器写法。它不再迁就历史包袱,只严格遵循 CSS 规范。
calc() 里的 / 报错不是 bug,是规范回归
Node Sass 和早期 Dart Sass 允许 width: calc(100% / 3) 直接通过,是因为它们把所有 / 都当 Sass 运算符;Dart Sass 2.0 要求你显式使用 math.div(100%, 3),而 calc() 内部的 / 则交由原生 CSS 解析器处理。
- 错误写法:
width: calc(100% / 3);→SassError: Invalid CSS after "100%": expected expression - 正确写法:
width: calc(100% / 3);(仅当使用现代 CSS parser,即 Dart Sass 2.0+) - 注意:是否报错取决于你用的是哪层解析器——Dart Sass 2.0 默认启用分层解析,
calc()内的/是合法除法,无需改写;但 Sass 层面的除法必须用math.div()
::v-deep 必须带空格,否则直接解析失败
Vue 2 项目迁移时最常卡在这里:Dart Sass 2.0 按真实 CSS 伪类规则解析,不再容错。
- 错误写法:
:::v-deep.foo→Unknown pseudo-class selector "::v-deep.foo" - 正确写法:
::v-deep .foo(注意冒号数量和空格) -
/deep/和>>>已完全失效,无法靠sass-loader降级兼容 - Vue 3 中应优先改用
:deep(.foo),这是标准插槽样式穿透语法
legacy-js-api 警告背后是构建工具链适配问题
看到 Deprecation [legacy-js-api] 警告,说明你项目里某个 loader 或插件仍在调用老接口,比如 sass.renderSync()。这不是你写的代码出错,而是工具链没跟上。
- Vite 4.5+、Webpack 5.75+ 默认已切到现代 API,但旧版
sass-loader或自定义插件可能仍用老方式 - 临时方案:在
vite.config.ts中加silenceDeprecations: ['legacy-js-api'],但只是掩盖问题 - 根本解法:升级
sass-loader到 v14+,并确认其implementation指向require('sass')(不是node-sass) - uniapp 等封闭生态目前仍卡在
sass@1.77.8,强行升到 2.x 会触发警告甚至编译中断
真正难的不是语法改写,而是意识到:Dart Sass 2.0 的“报错”不是限制你,而是把 CSS 应该有的边界还给你——它不再帮你猜意图,只确保你写的每行样式都经得起浏览器检验。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











