Skip to content

扩展包 ​

每份脚本导出一个包。包是安装、权限、设置和版本管理的基本单位;扩展是按 type 实现 protocol 的基本单位。

当前 runtime 会注入 definePackage,脚本可直接调用该函数。由于 JavaScriptCore 不支持 export default,ESM 形式的 export default definePackage(...) 将由后续打包器支持。

js
definePackage({
  id: "conflux.bangumi",
  title: "动漫数据",
  version: "1.0.0",
  engine: 1,
  permissions: { network: ["https://example.com"] },
  settings: [],
  extensions: [ /* Extension[] */ ],
});

目录生成器仅解析字面量,不执行 handler。

包字段 ​

字段必填含义
id是采用 reverse-DNS 格式且全局唯一,例如 conflux.bangumi
title是展示名
description / author / site / icon否展示
version是包 semver。目录中的版本必须取自该字段
engine是仅支持整数 1
permissions视情况见 运行时
settings否包级用户配置,每个包仅有一份。字段结构见数据模型 · 用户字段,通过 ctx.settings 读取。服务器地址应存放在 widget 实例的 params 中,详见开发者指南 · 参数
extensions是至少一项

扩展公共字段 ​

各 type 的专属字段请参阅对应文档。以下字段由所有扩展共用:

字段必填含义
type是widget / search / detail / playback / subtitle / danmu
id是在包内唯一。完全限定 ID 为 {packageId}/{type}/{id}
title是展示名(加到桌面时、服务选择器里)
description否说明
cache否{ ttlSeconds, staleWhileRevalidateSeconds? }

服务型扩展(detail / playback / subtitle / danmu)另有:

字段含义
accepts{ sources, mediaTypes? }。App 在调用 detail / playback 前使用该字段进行解析并控制按钮显示。播放器不会据此筛选 subtitle / danmu,详见 subtitle 和 danmu

同一包可以导出多个相同 type 的扩展,例如使用不同模板的多个 widget。

同一包内相同 type 的扩展参与服务解析时,如果多个扩展的 accepts 均匹配,App 会选择数组中的第一个扩展;如需明确指定,可由用户在设置中选择默认项。