插件生命周期
插件经历一个定义好的生命周期:安装、同意、激活、活动,最后是拆除。 每个转换都由宿主强制执行。
安装
安装通过插件管理器进行。你可以安装一个有界 .stplugin ZIP 归档或一个
公开仓库链接(github.com 或 gitlab.com,仅 HTTPS)。宿主绝不会调用
git 二进制;它下载一个仓库归档,并运行与 ZIP 完全相同的校验:路径遍历、
符号链接、可执行载荷、大小、清单字段、入口点和权限。安装是原子的,
任何错误都会回滚。
如果软件包附带带依赖的 package.json,内置解析器会在不执行安装脚本的
情况下从 npm 注册表获取它们。尽可能打包你的依赖;解析器是为无法合理
打包的重型 WASM 库而存在的。
同意
校验之后,插件进入 needs-consent 状态。它保持该状态,直到用户确认每个
请求的权限(并在存在时审查 npm 依赖列表)。此阶段不会运行任何入口点。
完整模型请参阅权限。
激活
激活是一个两阶段操作:
- 后端和旧版注册首先启动。
- 前端入口加载并接收其 API。
如果激活中途失败,宿主回滚部分注册并记录一次加载失败。失败的激活绝不会 留下半注册的界面。
活动运行时
在活动期间,插件做的每个注册 —— UI 界面、路由、事件订阅、i18n 资源、
通知、提供商、分词器、上下文策略和后处理器 —— 都由运行时收集。插件也
可以在 deactivate() 中管理自己的资源。
拆除
禁用、安全模式、删除、崩溃或应用关闭都会触发宿主强制的清理。运行时按 相反顺序处理收集的注册,保证是严格的:插件被禁用后,什么都不留下。
- 没有事件处理器或订阅。
- 没有定时器。
- 没有 DOM 节点。
- 没有挂载的路由。
- 没有后台请求。
- 没有注册的提供商、分词器或策略。
插件自己的 deactivate() 抛出的错误不会取消必需的清理 —— 宿主仍然处理
它跟踪的一切。拆除是幂等的:调用两次没有效果。
更新
更新原子地替换软件包并保持当前的激活状态,有一个例外:如果新清单添加了 权限,运行时立即被禁用,并保持禁用,直到用户同意新权限。回滚到之前的 版本通过再次安装该版本完成;插件存储中的用户数据在两种方向上都得以保留。
崩溃处理
后端插件在自己的进程中运行。如果该进程崩溃,宿主移除该插件的所有注册并 报告失败。崩溃的插件不能留下孤立的路由或事件订阅, 因为它们归宿主所有,而不是进程。