Skip to content

拓展包

拓展包是 kavina 的最高级分发单位。它是一个抽象概念,不限制内容——可以包含部件、插件、自定义方法、SDK,或以上任意组合。

定位

拓展包不规定导出格式,也不要求必须包含什么。

  • 可以只提供一两个部件
  • 可以只提供一个插件
  • 可以同时包含部件、插件、i18n、主题、自定义工具
  • 可以只封装一套私有 SDK

它是拓展包开发者自由定义的空间。kavina 只约定各项内容的消费方式,不约定生产方式。

部件

拓展包可以包含部件。添加到 Design 或 Display 的 widgets 属性即可使用:

ts
import myPackage from "my-package";

const widgets = [myPackage.widgets];

widgets 属性接收一个数组,内部通过 flat(Infinity) 拉平所有层级。无论拓展包内部如何组织部件,最终只需将部件定义函数传入即可。

插件

拓展包可以包含插件。使用 definePlugin 定义,添加位置后传入 Design:

ts
import { definePlugin } from "kavina/tools";

const myPlugin = definePlugin({
  title: "我的面板",
  icon: MyIcon,
  component: MyPanel,
});

export default {
  plugins: [{ ...myPlugin, primary: true }],
};

使用者拆开填入 plugins 属性:

ts
import myPackage from "my-package";

const plugins = [...builtinPlugins, ...myPackage.plugins];

其他资源

拓展包没有范围限制。i18n 语言包、主题变量、自定义钩子、辅助工具——任何需要随包分发的内容,都可以作为拓展包的一部分导出。

独立使用

部件和插件也可以脱离拓展包单独使用。拓展包不是必需的——直接提供一个部件定义函数或一个插件对象,同样可以正常工作。

ts
import { defineWidget } from "kavina/tools";

const myWidget = defineWidget(() => ({
  name: "hello",
  design: () => import("./design.vue"),
  setting: () => import("./setting.vue"),
  schema() {
    return { widget: this.name, text: "Hello" };
  },
}));

// <Design :widgets="[myWidget]" ... />

下一步