uniapp中运行时样式里有/deep/的地方总出错?

我在运行crmeb的小程序端时出现了下面的问题:

DEPRECATION WARNING [legacy-js-api]: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0.
15:30:05.834 More info: https://sass-lang.com/d/legacy-js-api
15:30:05.834 DEPRECATION WARNING [import]: Sass @import rules are deprecated and will be removed in Dart Sass 3.0.0.

然后样式里有/deep/的地方就是过不去?

image.png

阅读 1.5k
avatarAI BotBETA

uniapp中使用/deep/选择器遇到错误是由Sass编译器升级导致的兼容性问题。以下是具体原因和解决方案:

问题原因

  1. Dart Sass弃用特性

    • 你使用的Dart Sass新版本(默认在uniapp较新模板中)已弃用:

      • @import语法(建议改用@use
      • 旧的JS API接口
    • ::v-deep选择器在编译时需被特殊处理,Sass新版本不再隐式处理此类非标语法
  2. 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)
  }
}

补充建议

  1. 检查scss导入语法
    将所有@import改为@use

    // 旧语法
    @import '~@/styles/variables';
    
    // 新语法
    @use '~@/styles/variables' as *;
  2. 更新相关依赖
    升级vue和loader确保兼容性:

    npm update vue-loader sass-loader@^10.1.1 --save-dev
  3. 验证配置
    vue.config.js中添加:

    module.exports = {
      css: {
        loaderOptions: {
          sass: {
            additionalData: `@use "~@/styles/scss-vars" as *;`, // 示例路径
          }
        }
      }
    }

错误根源说明

图片中的错误提示表明样式穿透选择器解析失败,因Sass新版本对非标准CSS选择器更严格。修正后的::v-deep写法会被vue-loader正确处理,不会经过Sass的解析阶段,从而避免报错。

1 个回答

因为 HBX 从 node-sass 切换到了 dart-sass,按照官方的指引修改就好了:

node-sass 升级 dart-sass 常见问题及改进方法:

  • SassError: expected selector. /deep/
解决方案:/deep/ 替换成 ::v-deep

可以从 HBX 的更新日志里面看到:

4.64.2025042916

uni-app
  • 修复 Vue2 项目 使用预编译器 dart-sass 时非 uni.scss 文件不能使用 @use 语法的Bug 详情

4.56.2025031210

uni-app
  • 【重要】Vue2 项目 scss 预编译器默认改用 dart-sass,HBuilderX 非 Mac Arm 版可以在 manifest.json 中根节点配置 "sassImplementationName": "node-sass" 手动指定,继续使用 node-sass。这2种 sass 编译器有语法差异 文档 详情
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进