From 1c64968b5e98761d793ccf33db6cc1368384934a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=E6=98=B5=E7=A7=B0=E9=87=8D=E8=A6=81=E5=90=97O?= Date: Sat, 14 Mar 2026 11:11:36 +0800 Subject: [PATCH] =?UTF-8?q?chore(deps):=20=E6=9B=B4=E6=96=B0=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E4=BE=9D=E8=B5=96=E5=8C=85=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 升级 webpack-cli 从 6.0.1 到 7.0.0 版本 - 更新 @discoveryjs/json-ext 从 0.6.3 到 1.0.0 版本 - 升级 commander 从 12.1.0 到 14.0.3 版本 - 更新 stylelint-order 从 8.0.0 到 8.1.0 版本 - 升级 vite-plugin-vue-devtools 从 8.0.7 到 8.1.0 版本 - 更新 @vue/devtools-core 从 8.0.7 到 8.1.0 版本 - 升级 @vue/devtools-kit 和 @vue/devtools-shared 到 8.1.0 版本 - 更新 @vue/shared 从 3.5.29 到 3.5.30 版本 - 优化会议房间学生端视频播放逻辑,添加 nextTick 等待 DOM 更新 - 重构声网会议初始化逻辑,清理旧客户端监听器防止重复注册 - 修改远程视频播放策略,移除自动播放改为业务层手动控制 --- node_api/package.json | 2 +- node_api/pnpm-lock.yaml | 114 ++++++------------ package.json | 4 +- pnpm-lock.yaml | 59 +++++---- .../meeting-room/meeting-room-student.vue | 15 ++- .../meeting/meeting-room/useAgoraMeeting.ts | 18 ++- 6 files changed, 100 insertions(+), 112 deletions(-) diff --git a/node_api/package.json b/node_api/package.json index 47e8549..d10ab50 100644 --- a/node_api/package.json +++ b/node_api/package.json @@ -72,6 +72,6 @@ "typescript": "^5.9.3", "typescript-eslint": "^8.57.0", "webpack": "^5.105.4", - "webpack-cli": "^6.0.1" + "webpack-cli": "^7.0.0" } } diff --git a/node_api/pnpm-lock.yaml b/node_api/pnpm-lock.yaml index 810fd07..3ac6ab8 100644 --- a/node_api/pnpm-lock.yaml +++ b/node_api/pnpm-lock.yaml @@ -101,7 +101,7 @@ importers: version: 10.0.1(eslint@10.0.3) '@nestjs/cli': specifier: ^11.0.16 - version: 11.0.16(@swc/core@1.15.18)(@types/node@25.5.0)(webpack-cli@6.0.1) + version: 11.0.16(@swc/core@1.15.18)(@types/node@25.5.0)(webpack-cli@7.0.0) '@swc/core': specifier: ^1.15.18 version: 1.15.18 @@ -152,10 +152,10 @@ importers: version: 8.57.0(eslint@10.0.3)(typescript@5.9.3) webpack: specifier: ^5.105.4 - version: 5.105.4(@swc/core@1.15.18)(webpack-cli@6.0.1) + version: 5.105.4(@swc/core@1.15.18)(webpack-cli@7.0.0) webpack-cli: - specifier: ^6.0.1 - version: 6.0.1(webpack@5.105.4) + specifier: ^7.0.0 + version: 7.0.0(webpack@5.105.4) packages: @@ -205,8 +205,8 @@ packages: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} - '@discoveryjs/json-ext@0.6.3': - resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==} + '@discoveryjs/json-ext@1.0.0': + resolution: {integrity: sha512-dDlz3W405VMFO4w5kIP9DOmELBcvFQGmLoKSdIRstBDubKFYwaNHV1NnlzMCQpXQFGWVALmeMORAuiLx18AvZQ==} engines: {node: '>=14.17.0'} '@es-joy/jsdoccomment@0.84.0': @@ -1043,31 +1043,6 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - '@webpack-cli/configtest@3.0.1': - resolution: {integrity: sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==} - engines: {node: '>=18.12.0'} - peerDependencies: - webpack: ^5.82.0 - webpack-cli: 6.x.x - - '@webpack-cli/info@3.0.1': - resolution: {integrity: sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==} - engines: {node: '>=18.12.0'} - peerDependencies: - webpack: ^5.82.0 - webpack-cli: 6.x.x - - '@webpack-cli/serve@3.0.1': - resolution: {integrity: sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==} - engines: {node: '>=18.12.0'} - peerDependencies: - webpack: ^5.82.0 - webpack-cli: 6.x.x - webpack-dev-server: '*' - peerDependenciesMeta: - webpack-dev-server: - optional: true - '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -1337,9 +1312,9 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -2836,14 +2811,14 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - webpack-cli@6.0.1: - resolution: {integrity: sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==} - engines: {node: '>=18.12.0'} + webpack-cli@7.0.0: + resolution: {integrity: sha512-NbM62WodkUPXQGR/Ip3pSFsFUKJSseDIFr2H5Z1+4fHwB9X4cO10knPShIopFqAHZa8a5Q8pdtmtE6C12/mlMQ==} + engines: {node: '>=20.9.0'} hasBin: true peerDependencies: - webpack: ^5.82.0 - webpack-bundle-analyzer: '*' - webpack-dev-server: '*' + webpack: ^5.101.0 + webpack-bundle-analyzer: ^4.0.0 || ^5.0.0 + webpack-dev-server: ^5.0.0 peerDependenciesMeta: webpack-bundle-analyzer: optional: true @@ -2998,7 +2973,7 @@ snapshots: '@colors/colors@1.5.0': optional: true - '@discoveryjs/json-ext@0.6.3': {} + '@discoveryjs/json-ext@1.0.0': {} '@es-joy/jsdoccomment@0.84.0': dependencies: @@ -3382,7 +3357,7 @@ snapshots: '@mikro-orm/core': 7.0.1 kysely: 0.28.11 - '@nestjs/cli@11.0.16(@swc/core@1.15.18)(@types/node@25.5.0)(webpack-cli@6.0.1)': + '@nestjs/cli@11.0.16(@swc/core@1.15.18)(@types/node@25.5.0)(webpack-cli@7.0.0)': dependencies: '@angular-devkit/core': 19.2.19(chokidar@4.0.3) '@angular-devkit/schematics': 19.2.19(chokidar@4.0.3) @@ -3393,14 +3368,14 @@ snapshots: chokidar: 4.0.3 cli-table3: 0.6.5 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.15.18)(webpack-cli@6.0.1)) + fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.15.18)(webpack-cli@7.0.0)) glob: 13.0.0 node-emoji: 1.11.0 ora: 5.4.1 tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.2.0 typescript: 5.9.3 - webpack: 5.104.1(@swc/core@1.15.18)(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.18)(webpack-cli@7.0.0) webpack-node-externals: 3.0.0 optionalDependencies: '@swc/core': 1.15.18 @@ -3813,21 +3788,6 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.105.4)': - dependencies: - webpack: 5.105.4(@swc/core@1.15.18)(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.105.4) - - '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.105.4)': - dependencies: - webpack: 5.105.4(@swc/core@1.15.18)(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.105.4) - - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack@5.105.4)': - dependencies: - webpack: 5.105.4(@swc/core@1.15.18)(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.105.4) - '@xtuc/ieee754@1.2.0': {} '@xtuc/long@4.2.2': {} @@ -4088,7 +4048,7 @@ snapshots: colorette@2.0.20: {} - commander@12.1.0: {} + commander@14.0.3: {} commander@2.20.3: {} @@ -4526,7 +4486,7 @@ snapshots: flatted@3.4.1: {} - fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.15.18)(webpack-cli@6.0.1)): + fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.104.1(@swc/core@1.15.18)(webpack-cli@7.0.0)): dependencies: '@babel/code-frame': 7.29.0 chalk: 4.1.2 @@ -4541,7 +4501,7 @@ snapshots: semver: 7.7.4 tapable: 2.3.0 typescript: 5.9.3 - webpack: 5.104.1(@swc/core@1.15.18)(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.18)(webpack-cli@7.0.0) formstream@1.5.2: dependencies: @@ -5441,13 +5401,13 @@ snapshots: is-type-of: 1.4.0 sdk-base: 3.6.0 - terser-webpack-plugin@5.4.0(@swc/core@1.15.18)(webpack@5.104.1(@swc/core@1.15.18)(webpack-cli@6.0.1)): + terser-webpack-plugin@5.4.0(@swc/core@1.15.18)(webpack@5.104.1(@swc/core@1.15.18)(webpack-cli@7.0.0)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 terser: 5.46.0 - webpack: 5.104.1(@swc/core@1.15.18)(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.18)(webpack-cli@7.0.0) optionalDependencies: '@swc/core': 1.15.18 @@ -5457,7 +5417,7 @@ snapshots: jest-worker: 27.5.1 schema-utils: 4.3.3 terser: 5.46.0 - webpack: 5.105.4(@swc/core@1.15.18)(webpack-cli@6.0.1) + webpack: 5.105.4(@swc/core@1.15.18)(webpack-cli@7.0.0) optionalDependencies: '@swc/core': 1.15.18 @@ -5518,7 +5478,7 @@ snapshots: semver: 7.7.4 source-map: 0.7.6 typescript: 5.9.3 - webpack: 5.105.4(@swc/core@1.15.18)(webpack-cli@6.0.1) + webpack: 5.105.4(@swc/core@1.15.18)(webpack-cli@7.0.0) tsconfig-paths-webpack-plugin@4.2.0: dependencies: @@ -5627,21 +5587,17 @@ snapshots: dependencies: defaults: 1.0.4 - webpack-cli@6.0.1(webpack@5.105.4): + webpack-cli@7.0.0(webpack@5.105.4): dependencies: - '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.4) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.4) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack@5.105.4) - colorette: 2.0.20 - commander: 12.1.0 + '@discoveryjs/json-ext': 1.0.0 + commander: 14.0.3 cross-spawn: 7.0.6 envinfo: 7.21.0 fastest-levenshtein: 1.0.16 import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.105.4(@swc/core@1.15.18)(webpack-cli@6.0.1) + webpack: 5.105.4(@swc/core@1.15.18)(webpack-cli@7.0.0) webpack-merge: 6.0.1 webpack-merge@6.0.1: @@ -5654,7 +5610,7 @@ snapshots: webpack-sources@3.3.4: {} - webpack@5.104.1(@swc/core@1.15.18)(webpack-cli@6.0.1): + webpack@5.104.1(@swc/core@1.15.18)(webpack-cli@7.0.0): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -5678,17 +5634,17 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.4.0(@swc/core@1.15.18)(webpack@5.104.1(@swc/core@1.15.18)(webpack-cli@6.0.1)) + terser-webpack-plugin: 5.4.0(@swc/core@1.15.18)(webpack@5.104.1(@swc/core@1.15.18)(webpack-cli@7.0.0)) watchpack: 2.5.1 webpack-sources: 3.3.4 optionalDependencies: - webpack-cli: 6.0.1(webpack@5.105.4) + webpack-cli: 7.0.0(webpack@5.105.4) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.105.4(@swc/core@1.15.18)(webpack-cli@6.0.1): + webpack@5.105.4(@swc/core@1.15.18)(webpack-cli@7.0.0): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -5716,7 +5672,7 @@ snapshots: watchpack: 2.5.1 webpack-sources: 3.3.4 optionalDependencies: - webpack-cli: 6.0.1(webpack@5.105.4) + webpack-cli: 7.0.0(webpack@5.105.4) transitivePeerDependencies: - '@swc/core' - esbuild diff --git a/package.json b/package.json index 38038e8..30c4dd1 100644 --- a/package.json +++ b/package.json @@ -120,7 +120,7 @@ "stylelint": "^17.4.0", "stylelint-config-html": "^1.1.0", "stylelint-config-recommended-scss": "^17.0.0", - "stylelint-order": "^8.0.0", + "stylelint-order": "^8.1.0", "stylelint-scss": "^7.0.0", "typescript": "~5.9.3", "typescript-eslint": "^8.57.0", @@ -130,7 +130,7 @@ "vite-auto-deploy": "^2.0.34", "vite-plugin-banner": "^0.8.1", "vite-plugin-image-optimizer": "^2.0.3", - "vite-plugin-vue-devtools": "^8.0.7", + "vite-plugin-vue-devtools": "^8.1.0", "vue-eslint-parser": "^10.4.0", "vue-tsc": "^3.2.5" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b310593..777eedf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -262,8 +262,8 @@ importers: specifier: ^17.0.0 version: 17.0.0(postcss@8.5.8)(stylelint@17.4.0(typescript@5.9.3)) stylelint-order: - specifier: ^8.0.0 - version: 8.0.0(stylelint@17.4.0(typescript@5.9.3)) + specifier: ^8.1.0 + version: 8.1.0(stylelint@17.4.0(typescript@5.9.3)) stylelint-scss: specifier: ^7.0.0 version: 7.0.0(stylelint@17.4.0(typescript@5.9.3)) @@ -292,8 +292,8 @@ importers: specifier: ^2.0.3 version: 2.0.3(sharp@0.34.5)(vite@8.0.0(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(yaml@2.8.2)) vite-plugin-vue-devtools: - specifier: ^8.0.7 - version: 8.0.7(vite@8.0.0(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) + specifier: ^8.1.0 + version: 8.1.0(vite@8.0.0(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) vue-eslint-parser: specifier: ^10.4.0 version: 10.4.0(eslint@10.0.3(jiti@2.6.1)) @@ -1441,8 +1441,8 @@ packages: '@vue/devtools-api@8.0.7': resolution: {integrity: sha512-tc1TXAxclsn55JblLkFVcIRG7MeSJC4fWsPjfM7qu/IcmPUYnQ5Q8vzWwBpyDY24ZjmZTUCCwjRSNbx58IhlAA==} - '@vue/devtools-core@8.0.7': - resolution: {integrity: sha512-PmpiPxvg3Of80ODHVvyckxwEW1Z02VIAvARIZS1xegINn3VuNQLm9iHUmKD+o6cLkMNWV8OG8x7zo0kgydZgdg==} + '@vue/devtools-core@8.1.0': + resolution: {integrity: sha512-LvD1VgDpoHmYL00IgKRLKktF6SsPAb0yaV8wB8q2jRwsAWvqhS8+vsMLEGKNs7uoKyymXhT92dhxgf/wir6YGQ==} peerDependencies: vue: ^3.0.0 @@ -1452,12 +1452,18 @@ packages: '@vue/devtools-kit@8.0.7': resolution: {integrity: sha512-H6esJGHGl5q0E9iV3m2EoBQHJ+V83WMW83A0/+Fn95eZ2iIvdsq4+UCS6yT/Fdd4cGZSchx/MdWDreM3WqMsDw==} + '@vue/devtools-kit@8.1.0': + resolution: {integrity: sha512-/NZlS4WtGIB54DA/z10gzk+n/V7zaqSzYZOVlg2CfdnpIKdB61bd7JDIMxf/zrtX41zod8E2/bbEBoW/d7x70Q==} + '@vue/devtools-shared@7.7.9': resolution: {integrity: sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==} '@vue/devtools-shared@8.0.7': resolution: {integrity: sha512-CgAb9oJH5NUmbQRdYDj/1zMiaICYSLtm+B1kxcP72LBrifGAjUmt8bx52dDH1gWRPlQgxGPqpAMKavzVirAEhA==} + '@vue/devtools-shared@8.1.0': + resolution: {integrity: sha512-h8uCb4Qs8UT8VdTT5yjY6tOJ//qH7EpxToixR0xqejR55t5OdISIg7AJ7eBkhBs8iu1qG5gY3QQNN1DF1EelAA==} + '@vue/language-core@3.2.5': resolution: {integrity: sha512-d3OIxN/+KRedeM5wQ6H6NIpwS3P5gC9nmyaHgBk+rO6dIsjY+tOh4UlPpiZbAh3YtLdCGEX4M16RmsBqPmJV+g==} @@ -4194,8 +4200,8 @@ packages: peerDependencies: stylelint: ^17.0.0 - stylelint-order@8.0.0: - resolution: {integrity: sha512-1oAwPRz6Ba8u9LPjgvdbeMjZszHhjY6DBBK+xMlS3IC89GdTsvAPpGYvW+dkn6pxc4ZaI1S959g4c8CftZbhIg==} + stylelint-order@8.1.0: + resolution: {integrity: sha512-ao2+VzToCqbAVGaEYEeSR2zNurvQx+86Kw1d0//kZDx3zlyjvb24dE4J0e4HQgOTruOwZpfaHHRtK58+lrsTAQ==} engines: {node: '>=20.19.0'} peerDependencies: stylelint: ^16.18.0 || ^17.0.0 @@ -4538,11 +4544,11 @@ packages: peerDependencies: vite: '>=2.0.0' - vite-plugin-vue-devtools@8.0.7: - resolution: {integrity: sha512-BWj/ykGpqVAJVdPyHmSTUm44buz3jPv+6jnvuFdQSRH0kAgP1cEIE4doHiFyqHXOmuB5EQVR/nh2g9YRiRNs9g==} + vite-plugin-vue-devtools@8.1.0: + resolution: {integrity: sha512-4AvNRePfni3+PqOunACmAImC6SJVpUv6f7/g4oakyre9hYdEMrvDYlNmTZQsJPzVLMcGzn1FvSEqJ/n4HQ9cDg==} engines: {node: '>=v14.21.3'} peerDependencies: - vite: ^6.0.0 || ^7.0.0-0 || ^8.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 vite-plugin-vue-inspector@5.3.2: resolution: {integrity: sha512-YvEKooQcSiBTAs0DoYLfefNja9bLgkFM7NI2b07bE2SruuvX0MEa9cMaxjKVMkeCp5Nz9FRIdcN1rOdFVBeL6Q==} @@ -5865,7 +5871,7 @@ snapshots: '@babel/types': 7.29.0 '@vue/babel-helper-vue-transform-on': 1.5.0 '@vue/babel-plugin-resolve-type': 1.5.0(@babel/core@7.29.0) - '@vue/shared': 3.5.29 + '@vue/shared': 3.5.30 optionalDependencies: '@babel/core': 7.29.0 transitivePeerDependencies: @@ -5878,7 +5884,7 @@ snapshots: '@babel/helper-module-imports': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/parser': 7.29.0 - '@vue/compiler-sfc': 3.5.29 + '@vue/compiler-sfc': 3.5.30 transitivePeerDependencies: - supports-color @@ -5950,10 +5956,10 @@ snapshots: dependencies: '@vue/devtools-kit': 8.0.7 - '@vue/devtools-core@8.0.7(vue@3.5.30(typescript@5.9.3))': + '@vue/devtools-core@8.1.0(vue@3.5.30(typescript@5.9.3))': dependencies: - '@vue/devtools-kit': 8.0.7 - '@vue/devtools-shared': 8.0.7 + '@vue/devtools-kit': 8.1.0 + '@vue/devtools-shared': 8.1.0 vue: 3.5.30(typescript@5.9.3) '@vue/devtools-kit@7.7.9': @@ -5973,12 +5979,21 @@ snapshots: hookable: 5.5.3 perfect-debounce: 2.1.0 + '@vue/devtools-kit@8.1.0': + dependencies: + '@vue/devtools-shared': 8.1.0 + birpc: 2.9.0 + hookable: 5.5.3 + perfect-debounce: 2.1.0 + '@vue/devtools-shared@7.7.9': dependencies: rfdc: 1.4.1 '@vue/devtools-shared@8.0.7': {} + '@vue/devtools-shared@8.1.0': {} + '@vue/language-core@3.2.5': dependencies: '@volar/language-core': 2.4.28 @@ -8902,7 +8917,7 @@ snapshots: dependencies: stylelint: 17.4.0(typescript@5.9.3) - stylelint-order@8.0.0(stylelint@17.4.0(typescript@5.9.3)): + stylelint-order@8.1.0(stylelint@17.4.0(typescript@5.9.3)): dependencies: postcss: 8.5.8 postcss-sorting: 10.0.0(postcss@8.5.8) @@ -9367,11 +9382,11 @@ snapshots: transitivePeerDependencies: - supports-color - vite-plugin-vue-devtools@8.0.7(vite@8.0.0(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)): + vite-plugin-vue-devtools@8.1.0(vite@8.0.0(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)): dependencies: - '@vue/devtools-core': 8.0.7(vue@3.5.30(typescript@5.9.3)) - '@vue/devtools-kit': 8.0.7 - '@vue/devtools-shared': 8.0.7 + '@vue/devtools-core': 8.1.0(vue@3.5.30(typescript@5.9.3)) + '@vue/devtools-kit': 8.1.0 + '@vue/devtools-shared': 8.1.0 sirv: 3.0.2 vite: 8.0.0(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(yaml@2.8.2) vite-plugin-inspect: 11.3.3(vite@8.0.0(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(yaml@2.8.2)) @@ -9389,7 +9404,7 @@ snapshots: '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.0) '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.29.0) - '@vue/compiler-dom': 3.5.29 + '@vue/compiler-dom': 3.5.30 kolorist: 1.8.0 magic-string: 0.30.21 vite: 8.0.0(@types/node@25.5.0)(jiti@2.6.1)(sass@1.98.0)(yaml@2.8.2) diff --git a/src/views/meeting/meeting-room/meeting-room-student.vue b/src/views/meeting/meeting-room/meeting-room-student.vue index 8350434..7bb110d 100644 --- a/src/views/meeting/meeting-room/meeting-room-student.vue +++ b/src/views/meeting/meeting-room/meeting-room-student.vue @@ -539,9 +539,6 @@ if (typeof screenUid === 'number') { screenShareStreamUid.value = screenUid; Toast.info?.(`用户 ${targetUid} 开始投屏`); - setTimeout(() => { - ensurePrimaryVideoPlaying(primaryUid.value); - }, 300); } break; } @@ -573,6 +570,12 @@ screenShareOwnerUid.value = roomData.screenShareOwnerUid; } await meeting.initAndJoin(roomData); + // 等待 DOM 更新后再尝试播放视频 + await nextTick(); + setTimeout(() => { + ensurePrimaryVideoPlaying(primaryUid.value); + ensurePrimaryVideoPlaying(secondaryUid.value); + }, 500); initSelfWindowPosition(); }) .catch((e: unknown) => { @@ -632,6 +635,12 @@ } if (classStatus.value === 'in_class') { await meeting.initAndJoin(roomData); + // 等待 DOM 更新后再尝试播放视频 + await nextTick(); + setTimeout(() => { + ensurePrimaryVideoPlaying(primaryUid.value); + ensurePrimaryVideoPlaying(secondaryUid.value); + }, 500); initSelfWindowPosition(); } else { Toast.info?.('等待老师上课...'); diff --git a/src/views/meeting/meeting-room/useAgoraMeeting.ts b/src/views/meeting/meeting-room/useAgoraMeeting.ts index 15c99ce..b2c43c1 100644 --- a/src/views/meeting/meeting-room/useAgoraMeeting.ts +++ b/src/views/meeting/meeting-room/useAgoraMeeting.ts @@ -209,6 +209,11 @@ export function useAgoraMeeting( */ function initClient(): void { try { + // ✅ 先清理旧 client 的监听器,防止重复注册 + if (client.value) { + client.value.removeAllListeners?.(); + } + client.value = AgoraRTC.createClient({ mode: 'rtc', codec: 'vp8' }); if (tokenManagerRef.value) { tokenManagerRef.value.bindClient(client.value); @@ -216,9 +221,9 @@ export function useAgoraMeeting( /** * 播放远程视频到指定播放器 - * @param user - 远程用户 - * @param playerId - 播放器元素 ID + * @deprecated 学生端使用 autoPlayRemoteVideo=false,由业务层自行处理 */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars const playRemoteVideo = (user: IAgoraRTCRemoteUser, playerId: string) => { console.log(`【声网】准备播放远程视频 ${playerId}:`, user.uid); setTimeout(() => { @@ -251,12 +256,12 @@ export function useAgoraMeeting( } console.log('【声网】订阅成功:', user.uid, '类型:', mediaType, isMainVideo ? '主视频 (高流)' : '小视频 (低流)'); - // 播放远程视频到普通播放器(默认使用 player-${uid},可通过 options 关闭) + // ✅ 播放远程视频到普通播放器(默认使用 player-${uid},可通过 options 关闭) if (mediaType === 'video' && (options?.autoPlayRemoteVideo ?? true)) { playRemoteVideo(user, `player-${user.uid}`); } - // 播放远程音频(声网音频轨道需要手动播放) + // ✅ 播放远程音频(声网音频轨道需要手动播放) if (mediaType === 'audio') { console.log('【声网】收到远程音频,audioTrack:', user.audioTrack); if (user.audioTrack) { @@ -271,8 +276,11 @@ export function useAgoraMeeting( } } - if (!remoteUsers.value.find((u) => u.uid === user.uid)) { + // ✅ 只在第一次添加用户到 remoteUsers,防止网络波动导致的重复触发 + const isNewUser = !remoteUsers.value.find((u) => u.uid === user.uid); + if (isNewUser) { remoteUsers.value.push(user); + console.log('[声网] 新用户加入,当前用户数:', remoteUsers.value.length); } callbacks?.onUserPublished?.(user, mediaType); });