dart sass不是node-sass升级版,而是全新实现,严格校验语法:/在calc中报错、@import将被移除、深度选择器需改用:deep();推荐用sass-migrator自动迁移除法和模块导入,并统一路径分隔符为/。

直接换掉 node-sass 不等于迁移完成——很多项目升级后立刻报错,不是因为编译器换了,而是旧写法在 Dart Sass 下被严格校验了。
为什么 node-sass 项目一换就崩?
Dart Sass 不是 node-sass 的“升级版”,它是另一套实现:不兼容 LibSass 的宽松解析逻辑,也不容忍语法歧义。常见崩点集中在三类地方:
-
/在数学表达式中被当成除法(比如10px / 2),Dart Sass 1.33+ 开始警告,2.0+ 直接报错 -
@import仍能用,但已被标记为 deprecated,未来版本(Dart Sass 3.0+)会彻底移除 - Vue 项目里
/deep/、::v-deep或>>>等深度选择器,在 scoped style 中触发SassError: expected selector
用 sass-migrator 自动处理除法和 @import
官方工具能覆盖 80% 以上基础语法迁移,别手改——尤其当项目有几百个 SCSS 文件时。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- 先全局安装:
npm install -g sass-migrator - 跑一遍除法迁移(dry-run 先看效果):
sass-migrator division --dry-run src/**/*.scss - 确认无误后执行:
sass-migrator division src/**/*.scss,所有10 / 2会变成math.div(10, 2) - 再处理模块导入:
sass-migrator module src/**/*.scss,把@import "vars"转成@use "vars"并补上命名空间
Vue 项目里深度选择器怎么救?
这不是 Sass 的问题,是 Vue 编译器对 scoped style 的解析逻辑变了。Dart Sass 本身不处理 /deep/,但 Vue CLI 或 vue-loader 会把它传给 Sass,而新 Sass 解析器拒绝识别这种非标准语法。
- 最稳妥的解法:改用
:deep()函数,这是 Vue 3.2+ 官方支持的写法,例如::deep(.el-button) { color: red; } - Vue 2 项目无法升级?可在
vue.config.js中降级sass版本(不推荐)或加一层包装:.my-comp :global { .el-button { ... } } - 别用
!important硬顶——它可能掩盖真正的作用域泄漏问题
迁移后构建变慢?检查 sass 和 sass-loader 组合
Dart Sass 默认是同步编译,但 sass-loader 若配置不当,可能退化成单线程串行处理,反而比旧版 node-sass 还慢。
- 确保装的是最新稳定版:
npm install --save-dev sass@latest sass-loader@latest - Webpack 项目中,
sass-loader配置里加implementation: require('sass'),避免 loader 自己 fallback 到旧实现 - 大型项目启用缓存:
options: { implementation: require('sass'), additionalData: '@use "@/styles/vars" as *;' },减少重复解析
最容易被忽略的一点:Dart Sass 对路径分隔符更敏感。Windows 下用 \ 或混合 / 和 \ 写 @use 路径,会直接报 File to import not found——统一用正斜杠 /,哪怕在 Windows 上也别碰反斜杠。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










