Remote Development 与 Split Mode¶
Remote Development,又称 Split Mode,是 JetBrains IDE 前端和后端分进程运行的模式。前端负责 UI 渲染和低延迟交互;后端负责项目模型、索引、分析、执行等重工作。后端可以在本机、远程机器、容器或云端。
基本术语¶
| 术语 | 含义 |
|---|---|
| Remote Development | IDE 前端连接本地或远程后端的工作流 |
| Split Mode | 前端和后端分进程运行的 IDE 架构 |
| Split Plugin | 拆成 frontend、backend、shared 模块的远程开发原生插件 |
| Frontend | UI、编辑交互、低延迟体验 |
| Backend | 项目模型、VFS、索引、PSI、分析、执行 |
| Shared | RPC 接口和可序列化数据模型 |
哪些功能天然在后端¶
这些能力通常在后端:
- VFS 和项目源文件访问。
- Project Model / Workspace Model。
- 索引和 PSI。
- Lexer、Parser、语言结构分析。
- Inspection、Annotator、Quick Fix、Intention。
- Completion、Reference Provider、Find Usages。
- Run Configuration 和执行。
官网指出,很多非 split 插件在 Split Mode 下仍能工作,但 UI、编辑辅助等功能如果跟随后端执行,会受到网络延迟影响,体验不理想。
Split Plugin 架构¶
推荐模块:
plugin-root
frontend-module
backend-module
shared-module
职责:
| 模块 | 职责 |
|---|---|
| shared | 定义 RPC 接口、DTO、序列化模型 |
| frontend | UI、Action 前端交互、调用 RPC |
| backend | 访问项目模型、索引、PSI、执行重任务,实现 RPC |
前后端通过 IntelliJ Platform RPC 通信。RPC 数据需要可序列化,官方使用 kotlinx.serialization。单体 IDE 中前后端在同一进程,RPC 可近似理解为普通 Kotlin suspend 调用。
依赖决定加载侧¶
IntelliJ Platform 通过模块依赖判断插件模块属于前端还是后端。相关模块包括:
intellij.platform.frontendintellij.platform.frontend.backend
如果某一侧依赖不满足,该模块不会加载。单体 IDE 中前后端依赖都满足,split 插件仍能正常运行。
设计原则¶
- UI 和低延迟交互放前端。
- PSI、索引、VFS 和项目模型访问放后端。
- 前端不要直接假设本地有项目文件。
- RPC 接口面向用户动作建模,而不是暴露后端对象。
- DTO 小而稳定,避免传递大量 PSI/VFS 细节。
- 后端结果要可取消、可超时、可降级。
错误示例:
- 前端 Action 中直接读取项目文件路径并做磁盘 IO。
- UI 每次输入都同步 RPC 请求后端。
- 后端返回巨大对象树给前端。
- 把 Swing 组件或 PSI 元素放进 RPC 模型。
运行与调试 Split Mode¶
官方建议使用 Run IDE (Split Mode) 运行配置,同时启动本地 frontend 和 backend。
生成运行配置:
./gradlew generateSplitModeRunConfigurations
要求:
- IntelliJ Platform Gradle Plugin 2.14+。
- 2.15.0+ 生成的运行配置会在额外 tab 展示 backend/frontend IDE 日志。
调试日志可配置 runIdeBackend 和 runIdeFrontend 任务的 DEBUG/TRACE category。
延迟测试¶
Split Mode 最大风险是延迟。官方建议在本地模拟慢连接:
- 启用 internal mode:
-Didea.is.internal=true。 - 打开左上角 Split Mode widget。
- 切到 Connection Config (internal)。
- 勾选 Enable Connection Widget。
- 设置 Direct Ping 延迟。
如果加一点延迟功能就明显卡顿,说明前后端拆分不合理。
测试策略¶
- 业务逻辑:普通 IntelliJ test framework。
- 整体插件加载:测试放 root plugin module,确保 classpath 包含所有 content modules 和 plugin.xml。
- UI:使用集成 UI test framework。
- Split Mode 手测:本地 frontend/backend + 延迟模拟。
兼容检查清单¶
- UI 交互路径不依赖后端同步返回。
- 前端没有直接访问 PSI/VFS/Project Model。
- 后端重任务有进度、取消和错误结果。
- RPC DTO 使用 kotlinx.serialization 支持的类型。
- 单体 IDE 和 Split Mode 都能运行。
- 模块依赖清楚标识 frontend/backend/shared。
- 延迟模拟下关键 UI 可用。