先看项目用的是node-sass还是sass;node-sass已弃用且不支持node 16+,而sass(dart sass)是纯js实现、全版本兼容,ci/cd中应强制统一使用sass并清除旧缓存。

CI/CD里SCSS编译失败,先看node-sass还是sass
绝大多数CI/CD构建中断不是因为SCSS语法错,而是Sass运行时根本没装上。关键第一步:确认项目用的是node-sass还是sass(Dart Sass)。两者不能共存,且对Node.js版本、构建工具链要求完全不同。
检查package.json的devDependencies,或直接运行:
npm list node-sass sass
如果输出里同时出现两个包,立刻删掉node-sass——它在Node.js 16+已彻底失效,而当前CI环境大概率是Node 18或20。
-
node-sass只支持到Node 14,报错如Node Sass does not yet support your current environment就是它在喊停 -
sass(Dart Sass)是纯JS实现,无编译依赖,Node 16–20全系兼容,是唯一推荐方案 - Vue CLI 5+、Create React App 5+、Webpack 5默认都只认
sass,强行留node-sass会触发loader冲突
Node.js版本不一致导致sass二进制缺失或node-gyp失败
本地能跑、CI崩了?八成是Node版本漂移。比如本地用Node 16,CI用Node 20,但sass包缓存里还带着旧版预编译文件,或CI镜像里压根没装Python/make等构建工具。
解决方案不是“重装”,而是让构建过程跳过不可靠的本地缓存:
- 在CI脚本开头加
rm -rf node_modules package-lock.json,强制干净安装 - 显式指定Node版本:GitLab CI用
image: node:20.15,GitHub Actions用uses: actions/setup-node@v3并设node-version: '20' - 避免
npm install走缓存,加--no-audit --no-fund减少干扰,必要时加--registry https://registry.npm.taobao.org防网络超时
特别注意:Docker构建中若复用旧层,node_modules可能残留旧版sass绑定,必须在RUN npm ci前清空工作目录。
sass-loader与Webpack版本锁死不匹配
this.getOptions is not a function这类错误90%出自sass-loader和Webpack API不兼容。Webpack 4用sass-loader@10,Webpack 5必须用@12或@13——用^符号自动升级会悄悄引入不兼容小版本。
查清你的Webpack真实版本:
npm list webpack
然后按需锁定:
- Webpack 4项目:
npm install sass-loader@10.4.2 node-sass@4.14.1 --save-dev(注意:这里node-sass是唯一选择,别换sass) - Webpack 5项目:
npm install sass-loader@13.3.2 sass@1.77.6 --save-dev(sass必须>=1.33.0才支持loadPaths替代includePaths) - 删掉
package-lock.json后执行npm ci,而不是npm install,确保版本完全受控
国内CI环境下载sass二进制超时或404
Dart Sass首次运行会从GitHub下载预编译二进制(sass/embedded),但在阿里云效、腾讯云CODING或内网GitLab CI中常因网络策略失败,报错如RequestError: connect ETIMEDOUT或404 Not Found。
不用改源码,用环境变量直指国内镜像:
- 设置
SASS_BINARY_SITE=https://npmmirror.com/mirrors/sass - 或全局配置:
npm config set sass_binary_site https://npmmirror.com/mirrors/sass - GitLab CI示例:
variables: SASS_BINARY_SITE: "https://npmmirror.com/mirrors/sass"
注意:这个镜像地址必须带
/mirrors/sass后缀,少一个字符就404。真正容易被忽略的是——某些CI平台(如云效)会缓存
node_modules层,即使你改了环境变量,旧缓存里的sass仍试图连GitHub。必须配合缓存键更新或手动清缓存才能生效。










