From 9d4e193658c87eee0d4b11de4ee5f5c112cb0c2c Mon Sep 17 00:00:00 2001 From: leuvi <528046@qq.com> Date: Tue, 4 Aug 2026 16:33:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=BF=90=E8=A1=8C=E6=97=B6=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E5=8F=AF=E5=88=87=E6=8D=A2=20+=20HLS/DASH=20=E5=BC=95?= =?UTF-8?q?=E6=93=8E=E5=BC=80=E7=AE=B1=E5=8D=B3=E7=94=A8=20+=20React/Vue?= =?UTF-8?q?=20=E5=9B=9E=E5=BD=92=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - core: 新增 setCallbacks(),onPrev/onNext/onSavePrefs 等可在运行时新增/替换/移除 - core: bindPersistence/bindProgressMemory 的写入目标每次读取当前回调,支持远端/本地运行时切换 - core: hls.js/dashjs 从 optional peer 改为常规 peer,npm 安装自动带上 - react: useBrowserLayoutEffect 创建 player 并维护 ref,父组件 layout effect 即可用 - react: hasXxx 变化时同步 setCallbacks;回调函数替换通过稳定代理动态生效 - vue: hasListener() 检测 prev/next 事件监听,未监听时按钮禁用;watch + onUpdated 同步回调 - test: 新增 react 2 个 + vue 4 个回归测试(ref 时机、回调切换、按钮状态、持久化远端/本地) - 根 test 命令改为三包全跑 --- .changeset/fix-round2-review.md | 24 +++++ README.md | 4 +- README.zh-CN.md | 4 +- package.json | 2 +- packages/core/package.json | 8 -- packages/core/src/index.ts | 1 + packages/core/src/player.ts | 62 ++++++++---- packages/core/src/types.ts | 5 + packages/core/src/ui/controls.ts | 11 ++- packages/react/package.json | 7 +- packages/react/src/SweetPlayer.tsx | 99 +++++++++++++++++--- packages/react/test/SweetPlayer.test.tsx | 85 +++++++++++++++++ packages/react/vitest.config.ts | 14 +++ packages/vue/package.json | 3 + packages/vue/src/SweetPlayer.ts | 50 +++++++--- packages/vue/test/SweetPlayer.test.ts | 114 +++++++++++++++++++++++ packages/vue/vitest.config.ts | 14 +++ pnpm-lock.yaml | 18 ++++ 18 files changed, 466 insertions(+), 59 deletions(-) create mode 100644 .changeset/fix-round2-review.md create mode 100644 packages/react/test/SweetPlayer.test.tsx create mode 100644 packages/react/vitest.config.ts create mode 100644 packages/vue/test/SweetPlayer.test.ts create mode 100644 packages/vue/vitest.config.ts diff --git a/.changeset/fix-round2-review.md b/.changeset/fix-round2-review.md new file mode 100644 index 0000000..e4a6b74 --- /dev/null +++ b/.changeset/fix-round2-review.md @@ -0,0 +1,24 @@ +--- +'@sweet-player/core': minor +'@sweet-player/react': minor +'@sweet-player/vue': minor +--- + +修复第二轮 review 发现的问题,并让 HLS/DASH 引擎开箱即用: + +**React ref 首次挂载即可用** +- 去掉 `useImperativeHandle`(其 factory 执行早于 player 创建,且 effect 赋值不触发 render) +- 在浏览器 layout effect 中创建 player 并维护 forwarded ref,父组件的 layout effect 可直接读取实例 + +**setId 换集修复** +- `progressCleanup` 现在移除 `loadedmetadata` restore listener,避免旧 ID 进度恢复到新视频 +- React/Vue 的 `id` 更新先于 `src` 执行:先保存旧进度再换源,防止进度丢失 +- `setId` 签名扩展为 `setId(id: string | null)`,传 `null` 解除进度记忆 + +**运行时回调不再用旧闭包** +- core 新增 `setCallbacks()`,导航按钮和持久化写入目标可在运行时切换 +- React:稳定代理函数转发到最新 props,新增、替换或移除 `onNext`/`onPrev`/`onSavePrefs` 等回调都会生效 +- Vue:动态同步 `onSavePrefs`/`onSaveProgress`,未监听 `prev`/`next` 时对应按钮保持禁用 + +**HLS/DASH 引擎开箱即用** +- `hls.js` / `dashjs` 从 optional peer 改为常规 peer(npm 7+ 安装 core 时自动安装),Chrome/Firefox HLS 与 DASH 播放不再因缺依赖失败 diff --git a/README.md b/README.md index 14e8008..3004321 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ npm install @sweet-player/core | `@sweet-player/react` | React component wrapper | | `@sweet-player/vue` | Vue component wrapper | -`hls.js` and `dashjs` are peer/optional dependencies loaded on demand: `.m3u8` sources pull in `hls.js`, `.mpd` sources pull in `dashjs`; any other source plays through the native `