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 new file mode 100644 index 00000000..1b7beb63 --- /dev/null +++ b/design/03-rust-web/process/3-19-rust-web-browser-runtime-module-extraction-v1.md @@ -0,0 +1,539 @@ +# 3-19 Rust Web 浏览器 Runtime 模块外置化重构 v1 + +> 创建时间:2026-05-24 +> 状态:`process` +> +> 触发背景: +> - CodeGraph 对 `mnote-web` 前端内嵌 JS 的符号定位效果一般。 +> - 字面搜索命中太多,尤其是 `layout.rs` / `tree.rs` 内的大型 raw string。 +> - 需要判断是更换 graph 工具,还是调整源码组织方式。 +> +> 参考实现: +> - `/mnt/Data1T/mnote/reference-code/sidex-main/src/vs/workbench/contrib/files/browser/views/explorerView.ts` +> - `/mnt/Data1T/mnote/reference-code/sidex-main/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts` +> - `/mnt/Data1T/mnote/reference-code/sidex-main/src/vs/workbench/contrib/files/browser/explorerService.ts` +> - `/mnt/Data1T/mnote/reference-code/sidex-main/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts` + +## 1. 结论 + +当前不应优先更换 CodeGraph。主要问题不是 graph 项目选型,而是 `mnote-web` 的大量浏览器 runtime 仍作为 Rust raw string / HTML inline script 存在。对 CodeGraph、IDE、ast-grep、浏览器 stack trace 来说,这些逻辑首先是 Rust 字符串,不是一等 JavaScript / TypeScript 源文件。 + +短期可以做“内嵌 JS 提取索引”作为定位辅助,但它只解决查询体验,不改变维护边界。长期重构方向应是:保留 Rust SSR / projection / reducer 的语义主导权,把浏览器端 DOM 绑定、host bridge、transport controller、DND、context menu、resource open adapter 等 runtime 分阶段迁出 Rust raw string,变成可索引、可测试、可复用的 `.js` 或 `.ts` 模块。 + +补充结论(2026-05-24):最近 `bugs/0524.md` 的修复耗时说明,低效并不只发生在 `layout.rs` 的 tree/filetree runtime,也发生在 `web_shell.rs` 的文档页 host adapter 和 `leptos-tiptap-spike/src/lib.rs` 的编辑器 runtime 巨型文件。本设计只覆盖 `03-rust-web` 的浏览器 shell runtime 外置化;`leptos-tiptap` 编辑器命令、附件、history、DOM bridge 需要并行进入 `05-editor-mainline` 设计,不应塞进本设计里一起实施。 + +## 2. 当前代码基线 + +### 2.1 主壳内嵌 runtime + +- `rust/crates/mnote-web/src/ssr/pages/layout.rs` + - `SIDEBAR_TREE_JS` 从文件顶部开始,是当前主壳最大浏览器 runtime。 + - 职责混合了:侧栏宽度、工作区切换、page tree / file tree 事件、文件树选择、拖拽、资源打开、附件上传、Page AI panel、账号菜单、本地文件夹 watcher。 + - `TREE_LIVE_CONTROLLER_JS` 负责 tree live bootstrap、WS / SSE / local-folder event transport、snapshot / delta / resync 分发。 + - `PageLayout` 通过 ` +