跳转到主要内容
一句话:前端负责呈现和交互;数据、I/O 以及任何在远程机器上也必须能用的东西归 Rust。 前端自己从不读写磁盘、启动进程或建立网络连接,而是通过类型化的命令请求后端。

属于 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 事件到来时清掉缓存。
另一个例子:tree-sitter 结构查询(ide-syntax)在 Rust 里针对缓存的语法树运行,而在语言服务器不可用时是否退回到它,由编辑器决定。

新功能怎么划分

满足下面任意一条,就放到 Rust:
  • 读写文件、启动进程或访问网络;
  • 必须在远程窗口中可用(项目和工具都在另一台机器上);
  • 扫描范围超出打开的文档,或者耗时可能超过一帧;
  • 承担安全职责(信任、权限、校验不可信输入);
  • 插件、MCP 服务或其他后端 crate 需要它的结果。
如果只关乎外观或对输入的响应,并且只用后端已经提供的数据,就留在前端。 放在 Rust 时按领域归位:逻辑放在负责该领域的 crate(或新建 crates/ide-<domain>),共享的命令实现放在 ide-host::ops,src-tauri/src/commands/<domain>.rs 里只写薄薄的适配层。src-tauri 中不放领域逻辑。 放在前端时,它就是 src/features/<name>/ 下的一个功能目录,注册 action 和 contribution,且不能 import 其他功能;见前端。