核心模块

OpenSumi 的仓库代码是通过 Monorepo 的形式组织的,packages 目录下的都是 OpenSumi 内置模块,截止 2.8.0 版本,OpenSumi 代码仓库中一共有 53 个模块,它们有些是完全独立可插拔的功能,而有些则是提供核心功能的模块。也有一部分由于早期的设计不适用于目前的架构,所以可能在未来的某个时期被移除或者合并到其他模块。

核心模块介绍

OpenSumi 有几十个模块,但我们开发过程中并不是每个模块都要接触的,一般情况下我们需要对以下模块有一定的了解。

Core Browser

core-browser 定位是对 OpenSumi 前端部分的运行时管理,包括前端的 ClientApp 以及 Contribution 机制,另外 core-browser 还负责初始化与后端的 RPC 连接,不可被热插拔

Core Node

与 core-browser 类似,core-node 定位对 OpenSumi 后端部分的运行时管理,包括了 ServerApp 以及后端的 Contribution 机制,同样它不可被热插拔

Monaco

monaco 模块主要作用是将 Monaco Editor 的 API 重新组织并导出,因为 OpenSumi 一些编辑器功能依赖 Monaco Editor 的私有 API,所以 monaco 模块中的一些 API 会经过重新组织后导出,以供其他模块使用。除此之外,monaco 模块也提供了一些 Contribution Point ,其他模块可以注册并实现、覆盖一些内置的 Service。monaco 模块不可被热插拔

File Service

file-service 是内置的文件服务实现,大部分情况下我们都是基于原生的文件系统,而 file-service 就是默认实现,除此之外,OpenSumi 也支持通过自定义 file-service 的方式来实现其他文件系统,例如 MemoryFS、BrowserFS 等。

File Tree Next

文件树的默认实现,依赖 file-service 来进行文件树的读取、列表展示等功能。除此之外,file tree 会读取来自 decorations 模块注册的「装饰」来显示文件的状态,例如在 Git 中该文件是否修改等。

Terminal Next

终端功能的实现,包含前端渲染部分与后端的 Shell 进程管理。终端模块提供了独立的 TerminalNetworkContribution 贡献点,支持通过自定义外部的网络通道(WebSocket/Socket)来与后端 Shell 进程连接。同时它还提供了 VS Code Terminal 相关 API。

OpenSumi Extension

extension 是 OpenSumi 核心的插件系统实现,包括了前端视图插件、Node/VS Code 插件进程环境、WebWorker 插件环境等。同时也包含了所有 OpenSumi 以及兼容的 VS Code 插件 API 实现,extension 依赖了大部分功能模块,同时它可以被直接移除(但也会失去所有插件功能)。

Extension Manager

extension-manager 主要负责插件的安装、管理、启/禁用等功能,并且支持自定义的源。比较特殊的是,extension-manager 是唯一可以直接依赖 extension 的模块,因为安装、启用插件后需要同步插件状态并激活插件。

模块分层

虽然 OpenSumi 使用 Monorepo 组织代码结构,每个模块之间的「代码」关系看上去都是扁平的,但实际上模块之间的逻辑关系是分层的,例如前面提到的 core-browsercore-nodefile-serviceconnectionmonaco 等模块在大部分情况下是必不可少的,我们可以将其看作底层模块,他们无法被安全的移除或「热插拔」。而对于像 opened-editormarkdownsearch 等模块,他们的职责比较单一,仅提供部分视图及功能,移除它们不会对 OpenSumi 本身产生破坏性影响,我们称之为 功能模块

判断一个模块是否属于底层模块核心模块的一个重要依据就是其是否能被安全的移除。如果我们接收「没有插件功能」,那么实际上 extension 也可以作为功能模块,这样其依赖的大多数功能模块都可以被安全的移除。

模块列表及概述

.
├── addons                        # 用于依赖一些模块来实现可能包含副作用的功能,例如监听 file-tree 的拖放事件,并调用 file-service 的 API 来写入文件等
├── comments                      # 用于实现内置的 Code Review 评论功能,提供了标准的 VS Code Comments API 实现
├── components                    # OpenSumi 各个模块共用的一系列基础组件
├── connection                    # 用于实现 Web 及 Electron 端的底层 RPC 框架以及对应的连接管理
├── core-browser                  # Web 端功能的核心框架,包括整个 OpenSumi 的 ClientApp 及生命周期实现
├── core-common                   # 包含了一些基础类型,例如可能被许多模块依赖的内置 Contribution
├── core-electron-main            # 包含了 Electron 端主进程的相关基础功能
├── core-node                     # Node 端功能的核心框架,包括 OpenSumi 的 ServerApp 及生命周期实现
├── debug                         # Debugger 功能模块,实现了标准的 Debug Adapter Protocol 接口,并提供对应的 VS Code API 实现
├── decoration                    # 用于管理和注册除编辑器之外的一些装饰,例如文件树视图中对于 Git 状态的装饰
├── editor                        # 对 Monaco Editor 的上层封装模块,提供了包括编辑器、编辑器组操作及相关管理功能
├── electron-basic                # Electron 端的基础定制功能,包含了例如 Welcome 界面的基础实现
├── explorer                      # 用于为 FileTree 提供基础的视图容器,待废弃
├── express-file-server           # OpenSumi 内置的静态资源服务器,主要提供例如插件资源读取等功能
├── extension-manager             # 内置的插件安装、管理等功能
├── extension-storage             # 用于管理插件相关的存储,提供了 Storage 相关的 VS Code API
├── file-scheme                   # 提供对 file:// 协议的文件处理操作,例如前端使用何种视图来展示文件,以及后端如何进行文件保存等操作
├── file-search                   # 文件搜索服务,基于 vscode-ripgrep 实现的文件搜索(非内容)
├── file-service                  # 文件服务的抽象,集成时可以注册自定义的文件处理服务,并且内置了基于原生 FS 的文件服务
├── file-tree-next                # 文件树实现
├── i18n                          # 内置的 i18n 功能及语言包
├── extension             # OpenSumi 的插件系统实现,包括插件运行时及插件 API 实现
├── keymaps                       # 快捷键功能实现
├── logs-core                     # 内置的 logger 实现
├── main-layout                   # OpenSumi 主界面的框架实现,可以基于 Layout 做高自由度的定制
├── markdown                      # 内置的 Markdown 文件预览功能
├── markers                       # 问题面板实现,基于 LSP 提供的诊断信息并应用到编辑器,提供了标准的 VS Code Diagnostic API 实现
├── menu-bar                      # 内置的菜单栏实现,在 Web 端使用基于 DOM 的菜单,而 Electron 端使用原生菜单
├── monaco                        # 对于 Monaco Editor 的引用及包装,提供了 Contribution,以便其他模块(Editor)注册或覆盖一些内置的 Service
├── monaco-enhance                # 基于 Monaco 的一些上层封装,提供了一些基础的 ZoneWidget、OverlayWidget 等小组件
├── opened-editor                 # 「打开的编辑器」功能实现
├── outline                       # 「大纲」功能实现,基于 LSP 的符号接口,提供了基于 TreeView 的符号跳转等功能
├── output                        # 输出功能实现,并提供标准的 VS Code Output API
├── overlay                       # OpenSumi 内置的浮层功能实现,例如 message、notification、modal 等
├── preferences                   # 设置面板及功能的实现
├── process                       # 提供便捷的子进程管理功能,是一个 Utils 模块
├── quick-open                    # 快速打开功能实现,OpenSumi 的快速打开使用独立的实现,与 Monaco Editor 自带的功能类似
├── scm                           # Source Control 功能抽象接口,并提供了标准的 VS Code SCM API,例如 Git 插件就是基于 SCM 提供的接口实现的
├── search                        # 跨文件文本搜索功能实现
├── startup                       # 示例模块,开发状态下可以基于 startup 模块来启动 OpenSumi
├── status-bar                    # 状态栏功能实现,并提供标准的 VS Code StatusBar API
├── storage                       # 存储功能实现,主要维护 OpenSumi 内的各种缓存读写
├── task                          # 任务功能实现,并提供标准的 VS Code Task API
├── terminal-next                 # 终端功能实现,并提供标准的 VS Code Terminal API
├── theme                         # 颜色主题与图标主题功能实现,兼容 VS Code 图标、颜色主题,提供标准的 VS Code Theme 相关 ContributionPoint
├── toolbar                       # 工具栏功能实现,提供 OpenSumi 扩展的 Toolbar 相关 API
├── types                         # OpenSumi 插件类型声明模块,包含 OpenSumi 兼容的全部 VS Code API 类型声明
├── userstorage                   # 用户缓存功能实现
├── variable                      # 提供运行时各种「魔法变量」的管理与实现,例如在 Task 功能的配置文件中 tasks.json 中,可以通过 ${WorkspaceFolder} 来获取到当前的工作目录
├── webview                       # Webview 功能实现,包含多种 Webview 组件及能力,提供了标准的 VS Code Webview API
├── workspace                     # 工作区功能实现,用于管理当前 OpenSumi 打开的工作区,并支持多工作区功能
└── workspace-edit                # 封装了工作区级别的编辑,例如撤销一个重命名时,需要同时调用 WorkspaceEdit 相关功能实现文件级别的撤销