Files
ArtPlayer/refactor/changes/2026-09-13-PKG-MULTI-SUB-03-resources.md
T

5.4 KiB

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 字节逐字比较。

验证与限制

命令及准确运行结果、输入指纹、原生浏览器观察见 验证记录。新生命周期/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 历史基线及浏览器证据保留。