跳转至

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.frontend
  • intellij.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 日志。

调试日志可配置 runIdeBackendrunIdeFrontend 任务的 DEBUG/TRACE category。

延迟测试

Split Mode 最大风险是延迟。官方建议在本地模拟慢连接:

  1. 启用 internal mode:-Didea.is.internal=true
  2. 打开左上角 Split Mode widget。
  3. 切到 Connection Config (internal)。
  4. 勾选 Enable Connection Widget。
  5. 设置 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 可用。

参考来源