refactor(site): [SITE-CONSOLE-01] restore typed console and lifecycle ownership

This commit is contained in:
Harvey Zhao committed 2026-09-15 06:15:32 +08:00
1 parent 6cd2d0ffbe
commit 3dba82a453
29 files changed
+1884 -36

No files matched your search

File diff suppressed because it is too large. Load diff
@@ -0,0 +1,48 @@
# SITE-CONSOLE-01 控制台自有 TS 与生命周期修复
旧控制台为不可维护的 Parcel bundle;两个视图会争夺同一个 console hook,卸载后
滚动仍触碰旧 DOM,Firefox/WebKit 的原生错误消息也会被旧 parser 丢弃。
本任务恢复自有 TS 模块并修复这些已复现行为,保留其余固定第三方运行时。
## 结构与兼容
模块职责、队列与资源所有权见
[维护说明](../../scripts/site-vendor/console/README.md)。build.ts 验证原始 SHA-256,
用既有 esbuild 0.27.7 编译入口和视图,仅替换 Focm/W5CS 函数体并移除失效 map
注释。其他 100 模块、依赖表、Parcel 包装及旧 URL 保留。CSS 字符串与旧版精确
对照。React/ReactDOM 17.0.2、styled-components 5.3.3 继续从原模块注入;根工程
React 类型仅用于检查,不携带 React 19 运行时。TypeScript 5.9.3 严格检查边界。
涉及 API-02/03/05/08/09:consoleLog 仍返回 React 组件,重复挂载复用;实例方法、
状态、对象检查、等级/计数/Clear/悬停滚动及全局加载行为保留。新增可选 unmount
适配器,编辑器 pagehide 统一清理。共享 owner 使 count/time 只解析一次,已卸载
订阅不再收到排队日志。最后卸载恢复原属性描述符,且不覆盖后来安装的外部 wrapper。
错误消息适配保留堆栈且不修改 Error。回调抛错继续对外可见,同时不阻断其他视图。
这属于站点内部修复,没有库入口或包版本变化。VENDOR-08 只更新候选指纹与修改
边界;未知的完整第三方版本/源码与许可保持开放,不以冻结 bundle 宣称来源完整。
## 验证
- 先用正确行为回归验证旧生产脚本:11 失败/1 通过,保留原报告。
- 初次候选组合 57/57;完成编辑器清理后的最终组合 63/63,追加共享状态解析 3/3。
Chromium 153.0.8010.12、Firefox 155.0、WebKit 26.6,Windows,零重试/跳过。
- 六项单元覆盖原生转发/接收者、共享解析、过期日志、失败回滚、外部 wrapper、
抛错订阅、错误对象、样式与两个模块以外的字节保护;编辑器和 notice 十项通过。
- 两组严格 TS、生成/check、根 lint 通过;追加测试 scoped lint 通过。
根 lint 的 ESLint 零错误/警告,Yarn 仍输出已有 Node url.parse 弃用提示。
- CI 配置检查通过;impact 采取保守全生态映射,并继续报告未完成的安装消费缺口。
原始失败、首轮成功、最终输入/逐项结果见
[验证记录](../baselines/site-console01-validation.json)。受控 pagehide 测试不等于
真实物理设备 BFCache;没有宣称全生态测试、远端 CI、部署或 npm 发布完成。
## 工程入口与回退
新增 build:console、check:console、test:site-console,并接入 ci:build、ci:check、
test:node。复用已安装依赖与根 yarn.lock;没有新增依赖或改变 Yarn Classic 1.22.22 /
Node 24.21.0。源码和包内维护说明与状态同次提交。
回退本任务 commit,恢复原控制台、编辑器清理和生成/检查入口,同时恢复风险与
候选指纹;冻结历史不动。不要手工改生成 bundle。下一步继续 SITE-07 的 console
第三方溯源/许可和站点剩余资产,SITE-05 仍需完整站点验收。无推送或发布。
+26 -3
View File
@@ -1,6 +1,6 @@
# 文档站 console.js 的兼容迁移边界
SITE-07 先冻结原始 bundle 和浏览器契约,后续实现由 SITE-CONSOLE-01 负责。
SITE-07 冻结原始 bundle 和浏览器契约,SITE-CONSOLE-01 已实现自有 TS 模块及三项修复。
不能将 consoleLog 替换成一个只打印字符串的新面板,就声称旧接口已兼容。
## 已核实的现状
@@ -30,7 +30,7 @@ SITE-07 先冻结原始 bundle 和浏览器契约,后续实现由 SITE-CONSOLE
冻结文件 [console-original.js](baselines/site-vendor/console-original.js) 仅作为旧行为
对照,不进入站点分发。测试校验其 SHA-256;后续不得覆盖旧文件来制造差分通过。
## 已复现、尚未修复的问题
## 旧版已复现、候选已修复的问题
1. **CONSOLE-SCROLL-01**:add 安排 200ms 滚动回调;卸载后未取消,回调仍访问已移除
视图。使用真实定时器、原 ReactDOM 卸载和 DOM 验证,三个引擎均可复现。
@@ -40,7 +40,7 @@ SITE-07 先冻结原始 bundle 和浏览器契约,后续实现由 SITE-CONSOLE
WebKit 的原生 Error.stack 不含 message,界面丢失消息。Chromium 为有消息的对照。
普通对象保留引用,但 Error 已被旧 parser 转成字符串,不能误称仍保留 Error 身份。
## 实施顺序
## 已执行的实施顺序
1. 从已冻结自有入口/视图恢复可维护 TS,拆开安装、日志订阅/状态、视图与资源清理。
结合固定第三方边界建立构建/check,保留旧入口和已观测全局,不引入 React 版本混用。
@@ -53,6 +53,29 @@ SITE-07 先冻结原始 bundle 和浏览器契约,后续实现由 SITE-CONSOLE
5. SITE-07 继续完成全部第三方来源/版本与完整许可。来源未确认时不得关闭 VENDOR-08;
旧 vendor 的冻结不等于许可审查通过,也不等于完成其可复现来源恢复。
## 实施结果与边界
安装、组件、共享订阅、错误适配、样式、类型和构建分别维护,见
[模块地图](../scripts/site-vendor/console/README.md)。构建仅替换 Focm/W5CS 的函数体,
保留其余 100 模块、依赖表和 Parcel runtime;移除无实际文件的 sourceMappingURL。
样式解码值与旧模块逐字比较,React/ReactDOM 仍为 17.0.2。没有新增依赖。
单一 hook owner 在多个视图间共享计数/计时解析,最后卸载时取消队列并有条件恢复
原方法;外部后来安装的 wrapper 保留。滚动回调由组件持有并在卸载时取消。
原生 Error 缺少消息头时适配显示,保留完整堆栈且不修改对象;普通对象仍保持引用。
新增可选 consoleLog.unmount 供编辑器非 persisted pagehide 清理,原调用返回组件
及重复挂载行为保留。旧的 command/result 不存在时,卸载恢复为不存在,不遗留 undefined
自有属性;这属于方法描述符清理修正,不为这些非原生方法新增调用能力。
候选回归在旧生产脚本上先得到 11 失败/1 通过(Chromium 错误消息原已正常)。
修复后首轮 57 通过;补编辑器清理后最终组合 63 通过,另加共享状态解析 3 通过,
均无跳过或重试。六项单元及十项编辑器/notice 测试通过,两组严格 TS 和生成漂移
检查通过。完整输入指纹、引擎版本和结果见
[验证记录](baselines/site-console01-validation.json)。
受控 persisted pagehide 事件不代替真实设备 BFCache;第三方来源/许可仍由
SITE-07 / VENDOR-08 跟踪。本次没有远端 CI、部署或 npm 发布验收。
当前 [site-console.spec.js](../test/browser/site-console.spec.js) 含两种输入的共同
行为,以及三个仅指向冻结旧版的问题复现。历史问题用例通过意味着问题仍可复现,
**不意味着候选已修复**。SITE-CONSOLE-01 必须新增候选“无泄漏/不丢日志/错误消息可见”
+3 -3
View File
@@ -4,7 +4,7 @@
基线:`40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f`。总任务 265 项,范围 22 个包及工作区/示例。
状态:todo 45 / doing 22 / blocked 0 / done 198 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。
状态:todo 44 / doing 22 / blocked 0 / done 199 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。
前置依赖是启动条件;验收是完成条件。任务可以继续拆分,但不能复用或悄悄删除旧 ID。
@@ -410,7 +410,7 @@
| EX-02 | example/vue.js, workspace<br>验证 Vue 消费者与更新卸载 | CORE-22, ENG-07 | Vue 实例/ref、参数更新、卸载及插件样例 | 旧 JS 组件用法无需修改,重复挂载不泄漏 | M | done |
| EX-03 | workspace<br>验证全部原生 demo 与外部播放集成 | EX-01, EX-02, PKG-CHAPTER-06, PKG-AMBILIGHT-06, PKG-AUDIO-06, PKG-AUTO-THUMB-06, PKG-VTT-THUMB-06, PKG-HLS-06, PKG-DASH-06, PKG-MULTI-SUB-06, PKG-JASSUB-06, PKG-MASK-06, PKG-ASR-06, PKG-ADS-06, PKG-VAST-06, PKG-CAST-06, PKG-DPIP-06, PKG-DANMUKU-09, PKG-CANVAS-06, PKG-MB-10, PKG-IFRAME-06, PKG-TOOL-THUMB-06 | 8082 全 demo、HLS/DASH/FLV/MPEGTS/WebTorrent 集成记录 | 旧 URL/参数/脚本加载保持;网络/SDK 限制明确,不静默跳过;覆盖编辑器重复 Run 和 ESM/i18n/mobile/iframe,记录实际候选脚本及状态隔离证据;依据 BASE-04 路径台账逐项消除 not-run,处理 BASE-DEMO-01 | H | todo |
| SITE-VCONSOLE-01 | artplayer-vitepress, workspace<br>修复 vConsole 日志帧与延迟面板销毁竞态 | SITE-01 | 冻结上游 bundle 的可复现 TS 生命周期补丁、旧红新绿回归、来源及生成检查;销毁后虚拟列表布局续段停止 | 最后日志插件移除后取消 RAF 并隔离旧队列;延迟面板不得写入已销毁或替换插件;三引擎移动页与 UMD 入口通过,维护声明与原有许可缺口分别记录;原生 ResizeObserver 布局与挂起 timer 旧红新绿 | M | done |
| SITE-CONSOLE-01 | artplayer-vitepress, workspace<br>迁移控制台自有 TS 源码并修复日志生命周期 | SITE-03 | 从冻结 console.js 恢复自有入口/视图的 TS 模块、受控第三方边界与可验证构建;修复滚动回调、多容器 hook 所有权和原生 Error 消息丢失 | 保留 consoleLog 返回组件、React/ReactDOM/Parcel 全局及 DOM/CSS/日志对象语义;旧版复现与候选正确行为分开验证;多容器、卸载/重挂、外部 hook、错误/滚动及真实编辑器组合通过;架构与生成文档同批更新,不以冻结 vendor 代替 SITE-07 许可闭环 | H | todo |
| SITE-CONSOLE-01 | artplayer-vitepress, workspace<br>迁移控制台自有 TS 源码并修复日志生命周期 | SITE-03 | 从冻结 console.js 恢复自有入口/视图的 TS 模块、受控第三方边界与可验证构建;修复滚动回调、多容器 hook 所有权和原生 Error 消息丢失 | 保留 consoleLog 返回组件、React/ReactDOM/Parcel 全局及 DOM/CSS/日志对象语义;旧版复现与候选正确行为分开验证;多容器、卸载/重挂、外部 hook、错误/滚动及真实编辑器组合通过;架构与生成文档同批更新,不以冻结 vendor 代替 SITE-07 许可闭环 | H | done |
## 7 工具链与性能
@@ -694,4 +694,4 @@
- PKG-DANMUKU-MASK-LOAD-01: [记录](changes/2026-09-14-PKG-DANMUKU-08-combined-load.md) [记录](baselines/danmuku-combined-load-validation.json) [记录](changes/2026-09-14-PKG-DANMUKU-MASK-LOAD-01-scheduling.md) [记录](baselines/danmuku-mask-load-validation.json)
- PKG-HLS-PACK-01: [记录](changes/2026-09-15-PKG-HLS-PACK-01-config.md) [记录](baselines/hls-pack-config-validation.json)
- ENG-LINT-02: [记录](changes/2026-09-15-ENG-LINT-02-clean-checks.md) [记录](baselines/eng-lint02-validation.json)
- SITE-CONSOLE-01: [记录](console-modernization.md) [记录](baselines/site-console-validation.json)
- SITE-CONSOLE-01: [记录](console-modernization.md) [记录](changes/2026-09-15-SITE-CONSOLE-01-typescript.md) [记录](baselines/site-console01-validation.json)
+8
View File
@@ -1,5 +1,13 @@
# 进度与证据
## SITE-CONSOLE-01 自有 TS 控制台与三项修复
完成入口/视图/订阅/错误/样式/类型拆分,保留原 React17 与 100 个第三方模块。
多面板 hook、卸载滚动、错误消息三项已复现风险已修复,编辑器 pagehide 清理一并
接入。最终组合 63/63、共享解析 3/3,单元 6+10 通过;详见
[记录](changes/2026-09-15-SITE-CONSOLE-01-typescript.md)。199/265 项完成。
SITE-07 / VENDOR-08 的完整源码及许可仍开放;下一步继续该边界,未推送或发布。
## SITE-07 控制台基线与三项缺陷
冻结 102 模块和真实全局/返回组件/DOM/日志/滚动边界。三引擎最终27/27为18项共同
+3 -3
View File
@@ -276,6 +276,6 @@
| DPIP-INSTALLED-PROVENANCE-01 | resolved / 已复现 | Document PiP测试加载器忽略显式安装map并回退到源码 | PKG-CANVAS-05, CI-01 |
| DASH-MENU-01 | resolved / 已复现 | SDK 5.2.1 播放中设置质量选项在点击时变为不可见 | PKG-DASH-MENU-01, PKG-DASH-05, REVIEW-02 |
| DANMUKU-MASK-LOAD-01 | resolved / 已复现 | 真实Mask模型运行时弹幕存在未采样窗口及串行放置积压 | PKG-DANMUKU-MASK-LOAD-01, PKG-DANMUKU-08, PKG-MASK-05 |
| CONSOLE-SCROLL-01 | open / 已复现 | 控制台卸载后仍执行滚动回调 | SITE-CONSOLE-01, SITE-07 |
| CONSOLE-OWNERSHIP-01 | open / 已复现 | 多个控制台的全局 hook 所有权冲突 | SITE-CONSOLE-01, SITE-07 |
| CONSOLE-ERROR-01 | open / 已复现 | Firefox/WebKit 控制台丢失原生 Error 消息 | SITE-CONSOLE-01, SITE-07 |
| CONSOLE-SCROLL-01 | resolved / 已复现 | 控制台卸载后仍执行滚动回调 | SITE-CONSOLE-01, SITE-07 |
| CONSOLE-OWNERSHIP-01 | resolved / 已复现 | 多个控制台的全局 hook 所有权冲突 | SITE-CONSOLE-01, SITE-07 |
| CONSOLE-ERROR-01 | resolved / 已复现 | Firefox/WebKit 控制台丢失原生 Error 消息 | SITE-CONSOLE-01, SITE-07 |
+33 -9
View File
@@ -6396,7 +6396,7 @@
"id": "CONSOLE-SCROLL-01",
"title": "控制台卸载后仍执行滚动回调",
"confirmation": "reproduced",
"status": "open",
"status": "resolved",
"owners": [
"SITE-CONSOLE-01",
"SITE-07"
@@ -6408,15 +6408,23 @@
"refactor/changes/2026-09-15-SITE-07-console-baseline.md",
"test/browser/site-console.spec.js"
],
"workspaceState": "Native 200ms scroll timeout survives ReactDOM unmount and later fires against the detached console node.",
"workspaceState": "Owned TS console lifecycle and error adaptation implemented; frozen historical reproduction and candidate regression remain separate.",
"compatibleResolution": "Cancel pending scroll work and guard obsolete log updates; verify unmount/recreate without retained DOM work.",
"closureCriteria": "新候选修复和真实浏览器回归通过,冻结旧版仍可复现;同时验证原控制台接口和资源释放,不把历史缺陷测试通过当作修复。"
"closureCriteria": "新候选修复和真实浏览器回归通过,冻结旧版仍可复现;同时验证原控制台接口和资源释放,不把历史缺陷测试通过当作修复。",
"resolutionEvidence": [
"refactor/changes/2026-09-15-SITE-CONSOLE-01-typescript.md",
"refactor/baselines/site-console01-validation.json",
"test/browser/site-console.spec.js",
"test/site-console.test.js",
"scripts/site-vendor/console/README.md"
],
"resolutionRationale": "Candidate behavior failed on the original bundle (11 failed/1 passed); final browser/editor matrix 63 passed plus shared parser 3 passed across Chromium/Firefox/WebKit. Units, strict types and generation checks pass. Preserves React17, old component return, raw objects, exact CSS and 100 vendor module bodies. Physical BFCache and complete third-party provenance remain separate."
},
{
"id": "CONSOLE-OWNERSHIP-01",
"title": "多个控制台的全局 hook 所有权冲突",
"confirmation": "reproduced",
"status": "open",
"status": "resolved",
"owners": [
"SITE-CONSOLE-01",
"SITE-07"
@@ -6428,15 +6436,23 @@
"refactor/changes/2026-09-15-SITE-07-console-baseline.md",
"test/browser/site-console.spec.js"
],
"workspaceState": "Unmounting the first of two viewers unhooks the second viewer and restores a stale first-viewer wrapper; the surviving viewer no longer receives logs.",
"workspaceState": "Owned TS console lifecycle and error adaptation implemented; frozen historical reproduction and candidate regression remain separate.",
"compatibleResolution": "Own shared subscriptions explicitly, preserve unrelated wrappers, and test both unmount orders plus same-container reuse.",
"closureCriteria": "新候选修复和真实浏览器回归通过,冻结旧版仍可复现;同时验证原控制台接口和资源释放,不把历史缺陷测试通过当作修复。"
"closureCriteria": "新候选修复和真实浏览器回归通过,冻结旧版仍可复现;同时验证原控制台接口和资源释放,不把历史缺陷测试通过当作修复。",
"resolutionEvidence": [
"refactor/changes/2026-09-15-SITE-CONSOLE-01-typescript.md",
"refactor/baselines/site-console01-validation.json",
"test/browser/site-console.spec.js",
"test/site-console.test.js",
"scripts/site-vendor/console/README.md"
],
"resolutionRationale": "Candidate behavior failed on the original bundle (11 failed/1 passed); final browser/editor matrix 63 passed plus shared parser 3 passed across Chromium/Firefox/WebKit. Units, strict types and generation checks pass. Preserves React17, old component return, raw objects, exact CSS and 100 vendor module bodies. Physical BFCache and complete third-party provenance remain separate."
},
{
"id": "CONSOLE-ERROR-01",
"title": "Firefox/WebKit 控制台丢失原生 Error 消息",
"confirmation": "reproduced",
"status": "open",
"status": "resolved",
"owners": [
"SITE-CONSOLE-01",
"SITE-07"
@@ -6448,9 +6464,17 @@
"refactor/changes/2026-09-15-SITE-07-console-baseline.md",
"test/browser/site-console.spec.js"
],
"workspaceState": "The bundled error parser converts Error to stack; native Firefox/WebKit stacks omit message, so error-only logs lose their message. Chromium is a positive contrast.",
"workspaceState": "Owned TS console lifecycle and error adaptation implemented; frozen historical reproduction and candidate regression remain separate.",
"compatibleResolution": "Preserve error message and stack in the candidate without mutating ordinary log objects; require actual three-engine Error-only rendering tests.",
"closureCriteria": "新候选修复和真实浏览器回归通过,冻结旧版仍可复现;同时验证原控制台接口和资源释放,不把历史缺陷测试通过当作修复。"
"closureCriteria": "新候选修复和真实浏览器回归通过,冻结旧版仍可复现;同时验证原控制台接口和资源释放,不把历史缺陷测试通过当作修复。",
"resolutionEvidence": [
"refactor/changes/2026-09-15-SITE-CONSOLE-01-typescript.md",
"refactor/baselines/site-console01-validation.json",
"test/browser/site-console.spec.js",
"test/site-console.test.js",
"scripts/site-vendor/console/README.md"
],
"resolutionRationale": "Candidate behavior failed on the original bundle (11 failed/1 passed); final browser/editor matrix 63 passed plus shared parser 3 passed across Chromium/Firefox/WebKit. Units, strict types and generation checks pass. Preserves React17, old component return, raw objects, exact CSS and 100 vendor module bodies. Physical BFCache and complete third-party provenance remain separate."
}
]
}
+3 -2
View File
@@ -5612,13 +5612,14 @@
"dependsOn": [
"SITE-03"
],
"status": "todo",
"status": "done",
"risk": "H",
"deliverable": "从冻结 console.js 恢复自有入口/视图的 TS 模块、受控第三方边界与可验证构建;修复滚动回调、多容器 hook 所有权和原生 Error 消息丢失",
"acceptance": "保留 consoleLog 返回组件、React/ReactDOM/Parcel 全局及 DOM/CSS/日志对象语义;旧版复现与候选正确行为分开验证;多容器、卸载/重挂、外部 hook、错误/滚动及真实编辑器组合通过;架构与生成文档同批更新,不以冻结 vendor 代替 SITE-07 许可闭环",
"evidence": [
"console-modernization.md",
"baselines/site-console-validation.json"
"changes/2026-09-15-SITE-CONSOLE-01-typescript.md",
"baselines/site-console01-validation.json"
]
}
]
+2 -2
View File
@@ -1060,7 +1060,7 @@
"owners": [
"SITE-01"
],
"sourceStatus": "Frozen original 340306-byte Parcel bundle e00bbf82bf08c452825690372ded39a9b60f4baf438f0e7ce8300e9bc4629c03; 102-module map, Focm entry/W5CS view, React 17.0.2 globals and styled-components 5.3.3 literal identified. Full dependency versions and source reconstruction remain open.",
"sourceStatus": "Frozen original 340306-byte Parcel bundle e00bbf82bf08c452825690372ded39a9b60f4baf438f0e7ce8300e9bc4629c03; 102-module map, Focm entry/W5CS view, React 17.0.2 globals and styled-components 5.3.3 literal identified. Full dependency versions and source reconstruction remain open. SITE-CONSOLE-01 replaces only Focm/W5CS bodies from owned TS and removes the missing source-map trailer; other 100 modules and runtime remain byte-for-byte frozen. Full vendor provenance remains open.",
"licenseStatus": "Root MIT is not sufficient evidence for all bundled components; inventory and notices pending.",
"upstreamSources": [],
"upstreamReviewedAt": null,
@@ -1069,7 +1069,7 @@
{
"path": "docs/assets/js/console.js",
"algorithm": "sha256-lf",
"sha256": "e00bbf82bf08c452825690372ded39a9b60f4baf438f0e7ce8300e9bc4629c03"
"sha256": "5644af7bb35bb6d0bcfa7eeae9a21b406ac4fc1b499a6c797a6534c7d33f0678"
}
]
},