refactor: externalize tree live controller

This commit is contained in:
lix-2026
2026-05-24 21:35:21 +08:00
parent b61b56b5b5
commit db7c3cb319
5 changed files with 309 additions and 244 deletions
@@ -367,6 +367,56 @@ node --check rust/crates/mnote-web/browser/resource-open-runtime.js
全部通过。
### 9.3 Batch 2 执行记录(2026-05-24
Reasonix implementation run
- run id: `reasonix-2026-05-24T13-14-25-162Z-f98927dc`
- worktree: `/mnt/Data1T/mnote-wt-3-19-tree-live-b2`
- handoff: `/home/lix/.codex/runtime/reasonix-coding-worker/reasonix-2026-05-24T13-14-25-162Z-f98927dc/process-handoff.md`
- Codex 采纳方式:读取 Hindsight recall 和 handoff 后,从隔离 worktree 选择性合入主工作区;未提交 worker branch。
已落地的切片:
- 新增 `rust/crates/mnote-web/browser/tree-live-controller.js`
- 新增固定 asset route`GET /api/mnote-browser-runtime/tree-live-controller.js`
- `PageLayout` 将原 inline `TREE_LIVE_CONTROLLER_JS` 替换为 `type="module"` 外置脚本。
- `layout.rs` 不再保留大块 `TREE_LIVE_CONTROLLER_JS` raw string;测试改为 `include_str!` 外置文件内容。
采纳边界:
- 本批次只做同构搬迁,不改 tree live 语义。
- WS 优先、SSE fallback、local-folder events、snapshot/delta/resync/block.delta 分发保持原逻辑。
- 后端 `/api/realtime/ws``/api/tree/events``/api/local-folder/events` 未修改。
验证:
```bash
cargo fmt --manifest-path rust/Cargo.toml --all --check
cargo test -p mnote-web tree_live_controller_marks_transport_and_closes_source_on_pagehide
node --check rust/crates/mnote-web/browser/tree-live-controller.js
```
全部通过。
浏览器轻量验收:
- dev server: `npm run dev:hot`
- 页面:`http://127.0.0.1:3000/`,测试账号快速登录后进入主壳。
- `/api/mnote-browser-runtime/tree-live-controller.js` 返回 `200``content-type=application/javascript; charset=utf-8`
- `document.scripts` 中存在 1 个 tree live module script。
- `window.__mnoteTreeLiveControllerStarted === true`
- `<html>` 上出现 `data-mnote-tree-live-transport="disabled"``data-mnote-tree-live-status="disabled"`,证明外置 module 已执行。
- 控制台仍出现 `/api/local-folder/events` 500,这是既有 local folder event stream 问题,不属于本批次 route/module 加载回归。
CodeGraph 复核:
- 初始外置文件仍包在 IIFE 内,CodeGraph 只能识别外层匿名符号,不能定位 `startWithWebSocket`
- Codex 将外置 module 调整为模块级函数声明,并把启动 guard 放到底部。
- 复核结果:
- `codegraph_search startWithWebSocket` -> `rust/crates/mnote-web/browser/tree-live-controller.js`
- `codegraph_search startWithSseFallback` -> `rust/crates/mnote-web/browser/tree-live-controller.js`
## 10. 分阶段执行清单
### P0:定位辅助与基线保护
@@ -405,14 +455,15 @@ node --check rust/crates/mnote-web/browser/resource-open-runtime.js
### P2:外置 `TREE_LIVE_CONTROLLER_JS`
- [ ] 新增 `rust/crates/mnote-web/browser/tree-live-controller.js`
- [ ] `layout.rs` 只注入 `__MNOTE_TREE_LIVE_BOOTSTRAP__``<script type="module" src="...">`
- [ ] 新增 `/api/mnote-browser-runtime/tree-live-controller.js` 路由,返回 `application/javascript; charset=utf-8`
- [ ] 保持现有 WS 优先、SSE fallback、local-folder event fallback 行为。
- [ ] 浏览器断言:
- [x] 新增 `rust/crates/mnote-web/browser/tree-live-controller.js`
- [x] `layout.rs` 只注入 `__MNOTE_TREE_LIVE_BOOTSTRAP__``<script type="module" src="...">`
- [x] 新增 `/api/mnote-browser-runtime/tree-live-controller.js` 路由,返回 `application/javascript; charset=utf-8`
- [x] 保持现有 WS 优先、SSE fallback、local-folder event fallback 行为。
- [x] 浏览器断言:
- `document.documentElement.dataset.mnoteTreeLiveTransport` 正确。
- WS 推送仍更新 page/filetree
- WS 不可用时仍 fallback 到 SSE
- 外置 module 实际执行并设置 `window.__mnoteTreeLiveControllerStarted`
- [ ] WS 推送仍更新 page/filetree
- [ ] WS 不可用时仍 fallback 到 SSE。
### P3:外置 debug `/tree` shell runtime bridge