跳到主要内容

插件生命周期

插件经历一个定义好的生命周期:安装、同意、激活、活动,最后是拆除。 每个转换都由宿主强制执行。

安装

安装通过插件管理器进行。你可以安装一个有界 .stplugin ZIP 归档或一个 公开仓库链接(github.comgitlab.com,仅 HTTPS)。宿主绝不会调用 git 二进制;它下载一个仓库归档,并运行与 ZIP 完全相同的校验:路径遍历、 符号链接、可执行载荷、大小、清单字段、入口点和权限。安装是原子的, 任何错误都会回滚。

如果软件包附带带依赖的 package.json,内置解析器会在不执行安装脚本的 情况下从 npm 注册表获取它们。尽可能打包你的依赖;解析器是为无法合理 打包的重型 WASM 库而存在的。

同意

校验之后,插件进入 needs-consent 状态。它保持该状态,直到用户确认每个 请求的权限(并在存在时审查 npm 依赖列表)。此阶段不会运行任何入口点。 完整模型请参阅权限

激活

激活是一个两阶段操作:

  1. 后端和旧版注册首先启动。
  2. 前端入口加载并接收其 API。

如果激活中途失败,宿主回滚部分注册并记录一次加载失败。失败的激活绝不会 留下半注册的界面。

活动运行时

在活动期间,插件做的每个注册 —— UI 界面、路由、事件订阅、i18n 资源、 通知、提供商、分词器、上下文策略和后处理器 —— 都由运行时收集。插件也 可以在 deactivate() 中管理自己的资源。

拆除

禁用、安全模式、删除、崩溃或应用关闭都会触发宿主强制的清理。运行时按 相反顺序处理收集的注册,保证是严格的:插件被禁用后,什么都不留下。

  • 没有事件处理器或订阅。
  • 没有定时器。
  • 没有 DOM 节点。
  • 没有挂载的路由。
  • 没有后台请求。
  • 没有注册的提供商、分词器或策略。

插件自己的 deactivate() 抛出的错误不会取消必需的清理 —— 宿主仍然处理 它跟踪的一切。拆除是幂等的:调用两次没有效果。

更新

更新原子地替换软件包并保持当前的激活状态,有一个例外:如果新清单添加了 权限,运行时立即被禁用,并保持禁用,直到用户同意新权限。回滚到之前的 版本通过再次安装该版本完成;插件存储中的用户数据在两种方向上都得以保留。

崩溃处理

后端插件在自己的进程中运行。如果该进程崩溃,宿主移除该插件的所有注册并 报告失败。崩溃的插件不能留下孤立的路由或事件订阅, 因为它们归宿主所有,而不是进程。

使这些保证成为可能的安全模型,请参阅沙箱化。 驱动生命周期的清单字段,请参阅清单