Skip to content

PluginLoader

加载、卸载、管理插件。

API

typescript
class PluginLoader {
  loadPlugin(pluginPath: string, explicitId?: string): Promise<PluginInstance>;
  unloadPlugin(pluginId: string): Promise<void>;
  reloadPlugin(pluginId: string): Promise<void>;
  scanAndLoad(dirs: string[]): Promise<PluginInstance[]>;
  getLoadedPlugins(): PluginInstance[];
  getAPI(): XCLIAPI;
}

加载插件

typescript
const instance = await core.loader.loadPlugin('./plugins/my-plugin/index.ts');

卸载插件

typescript
await core.loader.unloadPlugin('my-plugin');

重新加载

typescript
await core.loader.reloadPlugin('my-plugin');

扫描目录加载

typescript
const plugins = await core.loader.scanAndLoad([
  './.xcli/plugins',
  '../.xcli/plugins',
  '~/.xcli/plugins',
]);

插件加载机制

插件通过 jiti 运行时编译 TypeScript:

typescript
const jiti = createJiti(import.meta.url, {
  interopDefault: true,
  alias: { [packageName]: coreEntryPath },
});

const plugin = await jiti.import(importPath);
const setup = plugin?.default ?? plugin;
if (typeof setup === 'function') {
  setup(this.api);
}

PluginInstance

typescript
interface PluginInstance {
  id: string;
  name: string;
  status: 'loaded' | 'unloaded' | 'error';
  commands: CommandEntry[];
  error?: Error;
}

基于 MIT 许可发布