# plugin-system 规范
定义 TvT.js 的插件契约:包括目录布局、路由发现规则、元数据约定、资源归属、依赖声明方式,以及跨插件复用的基本模式。
src/plugins/<plugin> 下的插件源码结构public/plugins/<plugin> 下的静态资源结构src/plugins/**/pages/**/*.vue 的路由发现机制config.js 作为插件元数据源的角色preview 与 child[].preview 的使用约定require 依赖声明的语义index.js 暴露共享能力PLS 别名的跨插件导入模式src/app.jsxsrc/common/utils.jssrc/common/copySelectedPublicDirsPlugin.jspluginMaker/index.cjssrc/components/forPreview/cardList.vuesrc/components/forPreview/oneImageQr.vuesrc/components/forPreview/suspenseLayout.vuesrc/plugins/basic/config.jssrc/plugins/goView/config.jssrc/plugins/qiankunTvt/config.jssrc/plugins/uniAppView/config.jsTvT.js 插件 SHALL 使用单一插件标识作为主命名空间,并在源码目录、公共资源目录、路由前缀和配置元数据中保持一致。默认情况下,该插件标识应与 src/plugins/<plugin> 的目录名一致;config.js 中的 name 也 SHALL 与该插件标识保持一致。
src/plugins/water 的插件public/plugins/water/plugins/water/...src/plugins/water/config.js 中的 name 应为 water可被 TvT.js 自动发现并注册路由的插件页面 SHALL 放在 src/plugins/<plugin>/pages/ 下,且仅允许两种受支持的页面层级:pages/<page>.vue 与 pages/<group>/<page>.vue。维护者 SHALL 不依赖更深层级的页面目录作为正式路由契约。
src/plugins/foo/pages/bar.vue/plugins/foo/barsrc/plugins/basic/pages/base/theBasic.vue/plugins/basic/base/theBasicsrc/plugins/foo/pages/a/b/c.vue每个正式插件的 config.js SHALL 至少包含以下强制字段:name、title、intro、version、author、website、state、require,以及一个展示入口字段:标准插件使用 preview,分组插件使用 child。当前仓库中的正式插件配置均满足这组最小字段约束,后续插件也 SHALL 遵循这组下限。
config.jsname、title、intro、version、author、website、state、require、previewbasicconfig.jsname、title、intro、version、author、website、state、require、childpreview除最小强制字段外,creatTime、updateTime 应作为推荐字段保留;tvtstore 仅在插件需要被归入插件市场或区域场景编辑器分类时才作为条件字段出现。未进入这两类分类的插件 MAY 不声明 tvtstore。
tvtstoretvtstore 等分类相关字段进入对应类别当前正式受支持的分组型插件 SHALL 仅有 basic。其他插件 SHALL 默认采用标准平铺插件模式,不应自行扩展为新的分组型插件规范;若未来确需新增分组型插件,应先更新规范再落地实现。
basic SHALL 被视为正式分组型插件basic 插件child 分组契约每个被插件系统识别的插件 SHALL 在 src/plugins/<plugin>/config.js 中定义元数据。面向预览中心展示的标准插件 SHALL 提供 preview 数组;面向分组展示的插件 SHALL 提供 child[].preview。插件元数据至少 SHALL 明确插件身份与展示入口,不得将展示入口仅散落在页面文件中而缺失 config.js。
config.js SHALL 提供 previewpreview[].name 应与对应页面文件名保持一致basic 的分组型插件config.js SHALL 提供 childchild[].previewpreview 条目通过 url 直接跳转到外链或远程页面pages/*.vue 文件name 以供菜单、哈希和二维码等预览行为使用每个 preview 或 child[].preview 条目 SHALL 至少包含 src、type、name、title。当前预览渲染层正式支持 img、text、video 三类 type;url、disableFPSGraph、disableSrcBtn、referenceSource 作为可选运行时扩展字段 MAY 出现,并分别影响跳转目标、调试面板显示与参考来源展示。
preview 条目src、type、name、titleurl,该条目 SHOULD 对应本地受支持的插件页面路由url、disableFPSGraph、disableSrcBtn、referenceSource插件的公共静态资源 SHALL 归属在 public/plugins/<plugin> 名下,包括但不限于预览图、模型、纹理、配置文件、音视频和运行时加载资源。插件实现可以按周边代码选择 plugins/...、./plugins/...、/plugins/... 或完整 https://... 地址的访问形式,但 SHALL 不将插件公共资源无序散落到其他插件命名空间中。
public/plugins/<plugin>/preview/ 或其下级目录public/plugins/<plugin>/...https://... 地址<plugin> 命名空间归属的约定当一个插件在运行期、预览期或单插件构建期依赖其他插件资源或共享能力时,该插件 SHALL 在 config.require 中显式声明依赖项。非单插件模式下,系统 SHALL 对声明依赖进行存在性检查;单插件构建时,系统 SHALL 基于 config.require 保留目标插件及其依赖插件的公共资源目录。
config.require 中声明依赖 floorfloor 插件配置qiankunTvtqiankunTvt 在 config.require 中声明了 floor 与 medicalqiankunTvt、floor、medical 对应的公共资源目录当插件需要向其他插件暴露可复用组件、工具或组合能力时,该插件 SHALL 通过 src/plugins/<plugin>/index.js 作为公共导出面,并通过 PLS/<plugin> 被其他插件引用。维护者 SHALL 避免把私有实现细节作为默认跨插件导入路径。
floor 需要暴露可被其他插件复用的能力src/plugins/floor/index.js 暴露PLS/floor 导入TvT.js 的开源仓库插件清单 SHALL 与插件市场中的源码交付能力解耦。开源仓库 MAY 仅保留某些市场插件的配置、预览资源或接入点,而不直接包含其完整源码实现;此类插件应被视为“可预览、可登记、可安装”的插件条目,而不是“源码已随仓库分发”的插件。此类条目 SHALL 被视为可扩展集合,而不是单一特例。
pluginMaker/install/ 并执行安装命令