mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-17 18:11:20 -08:00
refactor(multiple-subtitles): [PKG-MULTI-SUB-03] own requests and subtitle resources
This commit is contained in:
1 parent
36cd151095
commit
beaa93d6cc
25 files changed
+7908
-250
No files matched your search
@@ -0,0 +1,73 @@
|
||||
# PKG-MULTI-SUB-03 模块边界与资源修复
|
||||
|
||||
本次修改生产源码,保持工厂名称/必需参数、async 注册结果、name/tracks/reset、同步 void
|
||||
选择方法和原分发入口。自有 JS 先按职责拆清,严格 TS 与公开声明仍由 04 完成。
|
||||
原始 parser、许可和公开类型未改,没有新增依赖或改变包版本。
|
||||
|
||||
## 结构变化
|
||||
|
||||
| 文件 | 实际职责 |
|
||||
| --- | --- |
|
||||
| index.js | 注册编排、名称选择、活跃状态检查和公开返回对象 |
|
||||
| request.js | 每轨请求、原生状态检查、字节解码与既有核心格式转换 |
|
||||
| merge.js | 解析元数据和按选择顺序序列化;通过复制 cue 包装文本,原树不变 |
|
||||
| lifetime.js | 本次注册的 destroy 监听、请求取消、Promise 提前结束与清理登记 |
|
||||
| render.js | Blob 所有权、新旧 URL 替换、重入保护及宿主 init 失败处理 |
|
||||
| parser.js | 保持原始 vendor 边界,不因本次拆分改写算法 |
|
||||
|
||||
模块依赖由入口向请求/纯解析/安装流动;仅入口和宿主安装/生命周期需要 art,纯 merge
|
||||
不依赖 DOM、fetch 或播放器。没有引入要求用户升级核心的共享运行时依赖。
|
||||
|
||||
## 独立缺陷修正
|
||||
|
||||
- 销毁中 fetch/body 通过取消信号和关闭 Promise 结束;无 AbortController 的旧环境仍
|
||||
能及时结束注册并忽略迟到结果。返回相同形状的失活结果,不新增 destroy 拒绝。
|
||||
- 单轨失败保留原传输/解码异常身份,关闭整个注册并取消兄弟请求;HTTP ok=false 明确
|
||||
拒绝且取消未消费的响应,不再把错误页面当作有效字幕。
|
||||
- 最后 Blob URL 在 destroy 时释放。保留的 tracks/reset 此后返回 undefined,不再
|
||||
读取名称、分配 URL 或触发宿主。重复 destroy 不重复释放。
|
||||
- 分配新 URL 成功后才尝试替换;分配失败保留旧 URL。同步 init 失败释放新 URL,
|
||||
保留先前资源并回滚该次 escape 写入;首次注册失败同时移除监听。
|
||||
- 观察宿主真实 Promise 的 rejection,释放失败安装对应的 URL,并在活跃时以 console.warn
|
||||
保留诊断。正常注册仍不等待宿主加载;tracks/reset 仍为 void。宿主核心可能自行显示
|
||||
notice,这里不引入新公开事件,也不假装异步错误会从旧 void 方法同步抛出。
|
||||
- 老 init 的迟到错误不释放后来成功替换的资源;同步重入选择、配置读取失败,以及
|
||||
用户 getter/init 中触发 destroy 都有明确归属检查。
|
||||
|
||||
异步 init 失败发生时,宿主可能已经更新自身状态;插件不能通用回滚第三方宿主的副作用。
|
||||
此时释放失败资源,保留旧异步接口时序并记录错误;调用方可在仍活跃时重新 reset。
|
||||
正常 destroy 不恢复共享 subtitle.escape,避免覆盖后续插件/用户的配置。
|
||||
|
||||
## 保留的兼容边界
|
||||
|
||||
1. 采用已发布 1.2.0 的逐轨连接语义;没有恢复 1.0.0 按下标丢 cue 的缺陷。
|
||||
2. 轨内 parser 排序、轨间选择顺序、同名取第一个、重复选择、未知名 TypeError、空轨、
|
||||
onParser 未执行,以及坏 header 仍可保留可用 cue 的容错均保留。
|
||||
3. option.type 优先、当前核心 SRT/ASS 转换、encoding 默认与原生解码行为保持。
|
||||
轨元数据在下载结束后读取;restart 不重新下载字幕,配置在每次安装时读取。
|
||||
4. 不再调用无实际资源的 revokeObjectURL('')。历史测试仍断言旧调用记录,候选正常
|
||||
测试仅对这一项无资源清理差异作明确区分,不放宽真实 URL 的释放断言。
|
||||
5. 合并不再原地标记 updated/改 cue;冻结树重复序列化测试和九种真实旧产物逐字对照
|
||||
证明输出保持,另对实际核心转换和 Windows-1252/UTF-16LE 字节逐字比较。
|
||||
|
||||
## 验证与限制
|
||||
|
||||
命令及准确运行结果、输入指纹、原生浏览器观察见
|
||||
[验证记录](../baselines/multiple-subtitles-resources.json)。新生命周期/merge 文件接入
|
||||
test:unit 与 test:multiple-subtitles,生产三入口由正常 yarn build 生成。
|
||||
浏览器矩阵使用发布/候选核心、Chromium/Firefox/Windows WebKit 和源码/现代/legacy
|
||||
插件,覆盖 SRT 显示/选择、挂起请求销毁、原生 Blob 不可访问、HTTP 失败及真实视频切源。
|
||||
其中资源/错误场景直接执行公开注册函数,显示与切源场景使用真实 plugins.add。
|
||||
|
||||
最终本包 241 项通过;源码/main/legacy 各 31 项通过(其中冻结树纯函数用例固定读取源码,
|
||||
其余正常/生命周期/转换对照通过选定入口)。三入口原生浏览器各 30 项,共 90 项通过。
|
||||
完整 CI 2311 项通过:1963 单元、14 工程、334 基线;严格生产 TS 仍 346 文件。
|
||||
状态更新后 9 项风险/契约元数据测试通过。显式 lint 无错误或警告;全量 lint 仍有既有
|
||||
生成声明 unused-disable 警告。实际 ESM 只验证导出形状和工厂,不冒充完整安装消费者。
|
||||
|
||||
这不是全部历史核心、实体 Safari/移动设备、ASS 原生显示、样式/编辑器或 npm 发布准入。
|
||||
HOST/HTTP 在本次边界回归后关闭;LIFE/MERGE 的完整支持范围组合仍由 05 补齐。
|
||||
每项状态以 tasks/risks 与验证记录为准;后续 04 迁移 TS 时重跑相同生产入口用例。
|
||||
|
||||
独立本地任务提交,不推送、不发布。回退本提交恢复旧单文件和生成产物,同时重新引入
|
||||
02 已复现的泄漏/失败行为;02 历史基线及浏览器证据保留。
|
||||
Reference in new issue
Block a user