mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-08 19:06:15 -08:00
4.9 KiB
4.9 KiB
核心目标设计
这里是迁移方向,不是已经实现的目录或接口。实际路径调整需随实现更新。核心仍是 packages/artplayer,对外仍是 Artplayer 类和既有实例/静态接口。
现状证据
- 入口顺序构造所有子系统;player通过 mixin 将属性安装到 art。
- Component负责控件缓存、DOM 和监听器;Setting还有独立的树、渲染和更新语义。
- Events集中管理一部分 DOM 监听器,但定时器、异步请求和内部 Emitter 订阅仍由各模块管理。
- 声明与源码独立维护;build-ts进行文本拼接。
目标职责
| 领域 | 现有文件范围 | 目标与迁移方式 |
|---|---|---|
| 公共门面 | src/index.js、player/*Mix.js | 保留原签名和属性描述符;委托内部服务,不一次性换继承结构 |
| 配置 | option、scheme、config、默认值 | 区分用户输入与归一化配置;保持默认值、合并语义和错误时机 |
| 生命周期 | constructor、destroy、Events、各模块清理 | 实例资源作用域与操作资源作用域,清理恰好一次、可重入、失败后继续释放 |
| 内部事件 | utils/emitter.js | typed event map、未知事件兼容扩展、原调用顺序和 ctx |
| 媒体能力 | template、proxy、player | 内部精确的能力接口与原生视频类型分离;公共 video 兼容层保留 |
| 播放流程 | play/pause/toggle/seek/url/switch/eventInit | 媒体状态、操作身份、加载恢复与 UI 响应分离 |
| UI 注册 | utils/component、control、layer、contextmenu | 保留 name/cache/update/remove;明确 DOM 和绑定的归属 |
| 设置面板 | setting/index.js | 分开树整理、选择状态、渲染、布局、绑定;共享能共享的逻辑,不强行统一返回类型 |
| 字幕 | subtitle.js、utils/subtitle.js | 获取、解析、track/DOM 渲染、取消和对象 URL 回收分开 |
| 显示模式 | fullscreen/fullscreenWeb/pip/mini/auto* | 显式恢复位置和样式,保持互斥顺序、用户手势与移动端语义 |
| 输入 | events、hotkey | 鼠标/触控/键盘/焦点归属清晰,跨 document 重新绑定和清理 |
| 无障碍 | template、control、setting、显示模式 | 明确键盘导航、可访问名称、焦点进入退出和字幕能力,保留旧 DOM/CSS 与热键契约 |
| 内置功能 | plugins/*、info/notice/loading/mask | 逐项登记定时器和订阅,不能因内部插件迁移改变默认启用条件 |
| 资源 | i18n、icons、style、libs | 保持子路径、图标键、CSS 类和样式注入;记录 vendored 依赖来源 |
生命周期设计约束
- 分离实例作用域和单次切源/请求作用域;结束一次请求不能销毁整个实例。
- 资源登记函数返回内部清理句柄,不要求旧插件接入新接口。
- 销毁中的重入、重复销毁和单项清理异常要有专门测试。
- ready、destroy 的原触发时机和监听器可见状态先捕获基线。不能为统一清理把所有 Emitter 订阅先清空。
- 等待中的请求通过取消或 generation token 隔离过期结果;其 Promise 结算方式需要行为决策。
- 初始化失败只释放已创建资源,避免 DOM 和 instances 半初始化残留。
- ES2015 产物的语法目标和实际 AbortController 等能力支持分别验证;必要时使用内部 fallback,不默认增加全局 polyfill。
TypeScript 迁移原则
- 使用 allowJs 建立过渡,迁移完成的生产模块启用 strict;禁止靠整文件 ts-nocheck 或无边界 any 达标。
- 内部优先使用所需能力的精确接口,不把所有参数都简单标为 Artplayer。
- 公共自定义配置、事件、插件结果允许明确的泛型/模块扩展,保留旧 JS 用法。
- DOM、Node、worker、AudioWorklet 和媒体 shim 类型分域;不要让 monorepo 的全部 @types 自动污染核心。
- 内部字段采用不发出多余运行时代码的声明方式。重新安排 class field 初始化会影响构造顺序和属性行为,需测试。
- 公开声明生成时隐藏内部模块,不改变既有类型入口;ESM/CJS 两种类型消费者分别检查。
- 第三方复制文件允许暂保留 JS,但必须有来源、许可证和包内类型适配,不计为自有源码 TS 迁移遗漏。
性能范围
先测初始化耗时、控件交互、播放帧期间的工作、重复挂载/销毁后的资源、弹幕和 proxy 的帧调度。记录同设备同媒体的多次采样。只有结果支持时才减少 DOM 读写、合并帧更新、限频持久化、改进算法或延迟加载;不以改成 TS 或 Bun 本身作为浏览器性能优化证据。