在uniapp中使用/deep/选择器遇到错误是由Sass编译器升级导致的兼容性问题。以下是具体原因和解决方案:
问题原因
Dart Sass弃用特性
- Vue官方推荐变更
Vue官方已废弃/deep/和>>>写法,在Vue 2.5+应改用::v-deep
解决方案
首选方案:全局替换选择器
将所有/deep/替换为Vue推荐的穿透选择器:
/* 原写法(失效) */
.parent /deep/ .child { ... }
/* 新写法(推荐) */
.parent ::v-deep .child { ... }
兼容方案:强制降级Sass(临时)
在项目根目录修改sass配置(修改package.json):
{
"devDependencies": {
"sass": "^1.32.8" // 指定兼容版本(低于2.0)
}
}
补充建议
检查scss导入语法
将所有@import改为@use:
// 旧语法
@import '~@/styles/variables';
// 新语法
@use '~@/styles/variables' as *;
更新相关依赖
升级vue和loader确保兼容性:
npm update vue-loader sass-loader@^10.1.1 --save-dev
验证配置
在vue.config.js中添加:
module.exports = {
css: {
loaderOptions: {
sass: {
additionalData: `@use "~@/styles/scss-vars" as *;`, // 示例路径
}
}
}
}
错误根源说明
图片中的错误提示表明样式穿透选择器解析失败,因Sass新版本对非标准CSS选择器更严格。修正后的::v-deep写法会被vue-loader正确处理,不会经过Sass的解析阶段,从而避免报错。
因为 HBX 从
node-sass切换到了dart-sass,按照官方的指引修改就好了:可以从 HBX 的更新日志里面看到: