refactor: externalize tree live controller
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user