换用 Dart Sass 是唯一可行路径——node-sass 已于 2023 年 10 月 EOL,其 C++ 原生模块因 ABI 不匹配、缺失预编译 binding、工具链依赖等问题导致安装失败或运行时报错,而 sass-loader 等构建工具需同步升级配置以适配。

直接换掉 node-sass,用 sass(Dart Sass)是唯一可行路径——它不是“升级”,而是替换;node-sass 已于 2023 年 10 月 EOL,所有安装失败、ABI 不匹配、CSS 不输出、新语法报错,根源都在于它根本跑不起来。
为什么 npm install node-sass 总是卡在 binding 阶段
node-sass 是 C++ 编写的原生模块,必须为当前 Node 版本和 OpenSSL 组合预编译一个 .node 文件(比如 win32-x64-115_binding.node)。Node v20 的 ABI 是 115,但官方早已停止发布对应 binding,npm install 只能 fallback 到本地编译,这时就暴露 Python、gyp、C++ 工具链缺失等问题。Mac M1/M2 用户更惨:node-sass@4.x 根本没有 darwin-arm64 binding,装了也白装。
- 报错含
Cannot find module '...binding.node'或Module did not self-register,说明 loader 连初始化都没过,压根没进 SCSS 解析环节 - 即使
npm install node-sass显示 success,运行时仍报Missing binding:JS 层装上了,但二进制层根本没拉下来 - 国内用户常见失败原因:postinstall 脚本默认从 GitHub Releases 下载 binding,实际托管在 s3.amazonaws.com,直连超时后才尝试编译,此时再装工具链已晚
为什么装了 sass 还报 “To import Sass files, you first need to install node-sass”
这不是 sass 没装好,而是构建链里某个环节还在硬依赖 node-sass。最常见的是 sass-loader 版本太低(如 @10.x),或配置里残留了 implementation: require('node-sass'),导致它无视已安装的 sass 包,坚持去找旧 binding。
- Webpack 用户:检查
sass-loader配置中是否写了implementation字段,删掉或注释掉——sass-loader@^13默认用require('sass') - Vue CLI 用户:确认
vue.config.js中无css.loaderOptions.sass.nodeSass字段,该字段会强制注入node-sass - 若项目混用
.sass(缩进语法)和.scss,注意sass包默认只处理.scss;必须先统一后缀,否则 loader 仍会 fallback 到node-sass处理.sass文件
迁移后 SCSS 文件开始报错,是 Dart Sass 更严格了
Dart Sass 不是 LibSass 的兼容层,它是官方语言规范的唯一实现。原来被 node-sass 宽容忽略的语法问题,现在直接暴露:除法写法、@import 路径、深度选择器、变量作用域,全都会变成真实错误。
立即学习“前端免费学习笔记(深入)”;
-
10px / 2报错?必须写成(10px / 2),Dart Sass 默认把/当 CSS 除法(如font: 12px/1.5 Arial) -
@import "utils/mixins"失败?Dart Sass 不自动补.scss后缀,且 Windows 下路径中的\被当转义符,一律改用正斜杠/ -
/deep/ .foo或::v-deep .bar报expected selector?这不是 Sass 语法,是 Vue scoped 机制与 Dart Sass 解析器冲突;Vue 2 升级vue-loader@15.9+后可用>>>,Vue 3 改用:deep() - 变量未定义?Dart Sass 作用域更严:
@use必须在文件顶部,不能嵌套或条件加载;@import已废弃,@use "path" as *才能全局引入变量
真正容易被忽略的点是:CI 环境里缓存的 node_modules、IDE 自动恢复的旧依赖、甚至某处 postcss-loader 插件悄悄覆盖了 sass-loader 输出顺序——这些都不会报错,但会让 sass 始终不生效。删 node_modules 和 package-lock.json 再重装,比反复调试配置更快。


















