三处配置
以插件mn.hello 为例,三处配置如下:
plugins是白名单,声明获准在场景界面中出现的插件。pluginConfigs是模板给每个插件的一份配置。addon.开头的条目把插件摆到界面上,一颗工具条按钮与一条卡片菜单项。
bottom.modes 的完整写法见工具与模式,selectionMenu 的完整写法见卡片与摘录菜单。本文只讲插件相关的部分。
白名单
plugins 是一个字符串数组,取值为插件的 addonid。只有写进这个数组的插件才在场景界面中获准出现,未写入的插件在场景界面中不出现。
内置模板的这个数组恒为空,因此内置模板不会因为本机装了插件而改变行为。
plugins 数组的内容来自插件的 addonid,该字段的说明见场景插件基础。模板给插件的配置
pluginConfigs 是一个对象,键为插件的 addonid,值为任意 JSON。模板把这份配置交给插件,插件无需另行存储。
这份配置随模板走:导出进包、导入回来、复制分叉都带着。编辑器不解释该字段的内容,宿主也不校验。
template.json
经事件声明读取
插件在mnaddon.json 的 excerptClaim 中配置 configKey,即可让某一处标签由模板覆盖:
mnaddon.json
configKey 为 pendingTag,因此该标签取值为 pluginConfigs["mn.vocab"]["pendingTag"]。详见事件系统。
经接口读取
页面调用GET /immersive/template,响应中的 plugins 数组列出当前模板放行的插件,每一项含插件 id、放行状态与该插件的配置:
index.html
该接口的完整字段见 API 参考中的沉浸模板部分。取不到模板时响应里的
available 为假,原因在 reason 中,这种情况下不要循环重试。把插件摆到界面上
插件贡献的界面元素以addon. 为前缀,由插件 id 与元素名拼成。形状校验的正则是 ^addon\.[A-Za-z0-9_.-]+\.[A-Za-z0-9_]+$。
工具条按钮
工具条按钮的形状是addon.<插件id>.<名字>,放进 bottom.modes[].tools:
template.json
primary 是元素名,由插件与模板共同约定。starter 插件使用的元素名为 primary。
插件没有
main.js 时,宿主按 mnaddon.json 中声明的 panel 合成外壳,工具条按钮、卡片命令与摘录事件都由清单声明。这种写法下不需要额外的代码文件。卡片菜单项
菜单项的形状是addon.<插件id>.<命令id>:,末尾的冒号不可省略,放进 selectionMenu 的对应清单:
template.json
annotate 对应插件清单 cardCommands 中声明的命令 id。该命令的声明方式见卡片与摘录菜单命令。
两侧都要写
命令出现在菜单上需要两侧齐备:插件的mnaddon.json 声明该命令存在,模板的 selectionMenu 把该命令摆进菜单。只写一侧,菜单上不会出现该项。
工具条按钮同理:插件需在清单中声明可摆的入口,模板需在
bottom.modes[].tools 中写入对应条目。
装好却触达不到的成因
插件处于装好却无法触达的状态,成因分两类。 插件侧缺少:插件未写入plugins 白名单,或清单中未声明对应的按钮与命令。
模板侧缺少:模板未把插件 id 写入 plugins,或未把对应条目写进 bottom.modes[].tools 与 selectionMenu,或写入时代号形状有误(例如遗漏菜单项末尾的冒号)。
运行时核对
面板可以读取当前模板,用于确认上述配置是否生效。宿主在响应中给出每个插件的放行状态与配置内容,核对方式如下:index.html
selectionMenu 中的菜单项是否摆上,因为宿主不在该响应中列出各张菜单名册的内容。菜单项需要在卡片菜单中人工确认。
plugins 中每个对象的 addon 为插件 id,allowed 表示放行状态,config 为模板交给该插件的配置内容。