From db7c3cb3190ee2668a12ecf37a92f4774257dc08 Mon Sep 17 00:00:00 2001 From: lix-2026 Date: Sun, 24 May 2026 21:35:21 +0800 Subject: [PATCH] refactor: externalize tree live controller --- ...eb-browser-runtime-module-extraction-v1.md | 65 ++++- .../mnote-web/browser/tree-live-controller.js | 230 +++++++++++++++++ rust/crates/mnote-web/src/routes/mod.rs | 4 + rust/crates/mnote-web/src/routes/web_shell.rs | 14 + rust/crates/mnote-web/src/ssr/pages/layout.rs | 240 +----------------- 5 files changed, 309 insertions(+), 244 deletions(-) create mode 100644 rust/crates/mnote-web/browser/tree-live-controller.js diff --git a/design/03-rust-web/process/3-19-rust-web-browser-runtime-module-extraction-v1.md b/design/03-rust-web/process/3-19-rust-web-browser-runtime-module-extraction-v1.md index 1b7beb63..6d4ee294 100644 --- a/design/03-rust-web/process/3-19-rust-web-browser-runtime-module-extraction-v1.md +++ b/design/03-rust-web/process/3-19-rust-web-browser-runtime-module-extraction-v1.md @@ -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`。 +- `` 上出现 `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__` 和 ` - +
@@ -10691,7 +10456,8 @@ pub fn PageLayout( #[cfg(test)] mod tests { - use super::{SIDEBAR_TREE_JS, TREE_LIVE_CONTROLLER_JS}; + use super::SIDEBAR_TREE_JS; + const TREE_LIVE_CONTROLLER_JS: &str = include_str!("../../../browser/tree-live-controller.js"); fn js_function_body(source: &str, name: &str) -> String { let marker = format!("function {name}(");