菜单

插件架构

相关源文件

本文档描述了 Tabby 的插件架构,包括插件如何构造、发现、加载以及集成到应用程序中。有关开发您自己的插件的信息,请参阅插件开发

Tabby 采用模块化插件架构,通过内置插件和第三方插件扩展核心功能。这种方法允许轻量级的核心,同时通过可选组件支持各种功能。

插件系统概述

Tabby 的插件系统围绕 Angular 的模块系统设计,允许插件通过新功能扩展应用程序,同时保持职责的清晰分离。

来源

插件结构

每个 Tabby 插件都以 Node.js 包的形式构建,并具有将其标识为 Tabby 插件的特定属性。

插件包格式

来源

所需的 Package.json 字段

一个有效的 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 启动时,它通过系统的发现过程搜索并识别已安装的插件。

来源

模块查找初始化

发现过程通过初始化 Node.js 模块查找路径开始。

  1. 用户插件目录 (userPluginsPath/node_modules)
  2. 应用程序的 node_modules 目录
  3. 内置插件目录
  4. TABBY_PLUGINS 环境变量中指定的任何额外路径

来源

插件识别

插件通过以下方式识别:

  1. 查找名称以“tabby-”或“terminus-” (旧版) 为前缀的目录
  2. 检查它们是否包含 package.json 文件
  3. 验证 package.json 是否包含所需的关键词(“tabby-plugin”、“tabby-builtin-plugin”等)

系统还维护一个应排除的插件黑名单。

来源

插件信息

对于每个有效的插件,Tabby 都会提取元数据并将其存储在 PluginInfo 对象中。

来源

  • app/src/plugins.ts155-188 - 插件加载与集成

    发现后,插件被加载并集成到应用程序中。

    来源

    模块缓存和共享

    为了提高性能和确保一致性,Tabby 实现了模块缓存机制。

    1. 核心 Angular 模块和常用库是预加载并缓存的
    2. 这些缓存的模块在所有插件之间共享
    3. 这可以防止同一模块的重复实例

    这种方法减少了内存使用,并确保插件与核心服务的相同实例交互。

    来源

    结论

    Tabby 的插件架构为应用程序提供了灵活可扩展的基础。通过使用 Angular 的模块系统和 Node.js 的模块解析,它实现了内置插件和第三方插件的无缝集成。这种架构允许 Tabby 保持职责的清晰分离,同时通过可选组件支持广泛的功能。