本文档描述了 Tabby 的插件架构,包括插件如何构造、发现、加载以及集成到应用程序中。有关开发您自己的插件的信息,请参阅插件开发。
Tabby 采用模块化插件架构,通过内置插件和第三方插件扩展核心功能。这种方法允许轻量级的核心,同时通过可选组件支持各种功能。
Tabby 的插件系统围绕 Angular 的模块系统设计,允许插件通过新功能扩展应用程序,同时保持职责的清晰分离。
来源
每个 Tabby 插件都以 Node.js 包的形式构建,并具有将其标识为 Tabby 插件的特定属性。
来源
一个有效的 Tabby 插件必须在其 package.json 中包含以下关键元素:
| 字段 | 描述 | 示例 |
|---|---|---|
| 名称 | 包名称,带有“tabby-”前缀 | "tabby-ssh" |
| keywords(关键词) | 必须包含“tabby-builtin-plugin”或“tabby-plugin” | ["tabby-builtin-plugin"] |
| main(主文件) | 已编译插件的入口点 | "dist/index.js" |
| typings(类型定义) | TypeScript 类型定义。 | "typings/index.d.ts" |
| peerDependencies(对等依赖) | 所需的 Tabby 模块 | "@angular/core", "tabby-core" 等。 |
名称前缀和关键词尤为重要,因为它们在插件发现过程中使用。
来源
Tabby 启动时,它通过系统的发现过程搜索并识别已安装的插件。
来源
initModuleLookup 函数findPlugins 函数getPluginCandidateLocation 函数发现过程通过初始化 Node.js 模块查找路径开始。
userPluginsPath/node_modules)TABBY_PLUGINS 环境变量中指定的任何额外路径来源
插件通过以下方式识别:
系统还维护一个应排除的插件黑名单。
来源
对于每个有效的插件,Tabby 都会提取元数据并将其存储在 PluginInfo 对象中。
来源
插件加载与集成
发现后,插件被加载并集成到应用程序中。
来源
- app/src/entry.ts34-55 -
bootstrap 函数
- app/src/plugins.ts228-262 -
加载过程
插件加载过程
- 使用 Node.js
require 导入插件的主模块
- 获取默认导出,该导出应为 Angular 模块
- 向模块添加
pluginName 等元数据
- 将加载的模块收集到数组中
该过程包括进度报告,更新 UI 中的可视化进度条。
来源
Angular 集成
加载的插件模块通过 Angular 的动态模块系统集成到应用程序中。
- 根模块与加载的插件模块一起生成
- Angular 应用程序以此根模块启动
这种方法允许插件通过新的组件、服务和其他 Angular 功能扩展应用程序。
来源
错误处理和安全模式
Tabby 包含一个用于处理插件加载错误的备用机制
- 如果使用所有插件启动失败,它将尝试以“安全模式”启动
- 在安全模式下,只加载内置插件
- 这确保即使第三方插件导致问题,应用程序也能启动
来源
插件类型和关系
Tabby 的架构包含几种具有不同角色和依赖关系的插件类型。
来源
- tabby-core/package.json
- tabby-settings/package.json
- tabby-terminal/package.json
- tabby-ssh/package.json
- tabby-local/package.json
- tabby-serial/package.json
- tabby-telnet/package.json
- tabby-electron/package.json
- tabby-web/package.json
- tabby-plugin-manager/package.json
- tabby-community-color-schemes/package.json
核心插件
- tabby-core: 为应用程序提供基础服务和接口
- tabby-settings: 实现设置 UI 和配置管理
- tabby-terminal: 使用 xterm.js 处理终端模拟
连接插件
- tabby-ssh: 实现 SSH 连接
- tabby-local: 提供本地 shell 功能
- tabby-serial: 启用串口连接
- tabby-telnet: 实现 Telnet 和原始套接字连接
特定平台插件
- tabby-electron: 提供与 Electron 的集成,用于桌面应用程序
- tabby-web: 启用基于浏览器的操作
扩展插件
- tabby-plugin-manager: 处理插件安装和管理
- tabby-community-color-schemes: 提供额外的终端配色方案
依赖管理
插件通过其 package.json 中的 tabby-terminal/package.json42-52
- tabby-ssh/package.json32-43
- tabby-core/package.json32-40
模块缓存和共享
为了提高性能和确保一致性,Tabby 实现了模块缓存机制。
- 核心 Angular 模块和常用库是预加载并缓存的
- 这些缓存的模块在所有插件之间共享
- 这可以防止同一模块的重复实例
这种方法减少了内存使用,并确保插件与核心服务的相同实例交互。
来源
- app/src/plugins.ts22-40 - 缓存的内置模块
- app/src/plugins.ts42-48 - 内置模块列表
- app/src/plugins.ts50-64 - 模块 require 覆盖
结论
Tabby 的插件架构为应用程序提供了灵活可扩展的基础。通过使用 Angular 的模块系统和 Node.js 的模块解析,它实现了内置插件和第三方插件的无缝集成。这种架构允许 Tabby 保持职责的清晰分离,同时通过可选组件支持广泛的功能。