属于 Rust 的工作
Rust 里的工作还要遵守线程规则:长任务绝不阻塞 UI 线程或 Tauri 命令线程。用
spawn_blocking 或 rayon,并响应请求的 CancellationToken。
属于前端的工作
一个功能拆在两侧
很多功能都有一半是“便宜但重 I/O”的工作放在 Rust,另一半是“轻量的数据加工”放在 UI。HTTP Client 里的 Spring 请求映射就是个好例子:- Rust(
crates/ide-host/src/ops/routes.rs):spring_route_sources按常规忽略规则遍历项目,返回可能声明路由的 Java、Kotlin 文件的文本,并限制文件数和总字节数。注释原话:“The UI owns the annotation parser and the index it feeds, so this side stays a cheap scan.” - UI(
src/features/http-client/spring/routeIndex.ts):解析注解、建立请求路径索引、注册为 endpoint provider,并在.java/.kt文件的fsChanged事件到来时清掉缓存。
ide-syntax)在 Rust 里针对缓存的语法树运行,而在语言服务器不可用时是否退回到它,由编辑器决定。
新功能怎么划分
满足下面任意一条,就放到 Rust:- 读写文件、启动进程或访问网络;
- 必须在远程窗口中可用(项目和工具都在另一台机器上);
- 扫描范围超出打开的文档,或者耗时可能超过一帧;
- 承担安全职责(信任、权限、校验不可信输入);
- 插件、MCP 服务或其他后端 crate 需要它的结果。
crates/ide-<domain>),共享的命令实现放在 ide-host::ops,src-tauri/src/commands/<domain>.rs 里只写薄薄的适配层。src-tauri 中不放领域逻辑。
放在前端时,它就是 src/features/<name>/ 下的一个功能目录,注册 action 和 contribution,且不能 import 其他功能;见前端。