Skip to content

插件系统

Icemic edited this page Mar 11, 2017 · 2 revisions

插件系统

使用插件

假设现在有一个外部插件名叫 myPlugin,你可以这样的方式使用它:

  1. 首先进行导入,导入可以在程序的任何地方进行,但只有在导入之后才能使用该插件
import { core } from 'avg-core';
import MyPlugin from './myplugin';

// do something...

core.installPlugin(MyPlugin);

// do something else...
  1. 使用插件

你可以在任何地方使用插件,如函数、组件类等,通过 core.plugins.<name> 的方式访问你导入的插件。

值得注意的是,插件名 并不一定是你导入它时使用的类名称,名称是由插件编写者指定的。具体的名称和功能函数请参考插件编写者提供的文档。

下面给出一个在函数中使用时的例子:

import { core } from 'avg-core';

function yourMethod() {

  core.plugins.myPlugin.hello();

}

编写一个插件

基本

一个编写好的插件即是一个 Class,所以编写插件和通常的编写 JS 模块思路是一致的,只要最终将 Class 导出即可。

但这并不以为着随心所欲,仍然要遵循如下的约定:

  1. 构造函数的第一个参数是 core,在将你编写的插件注册到 AVG.js 时,AVG.js 会将自身的核心实例传递给你编写的 Class。
  2. 请在构造函数中执行 core.plugins.<name> = object 来将功能挂接到核心上,务必使用与插件本身相关的名称,并避免与他人的插件命名重复。
  3. 若你的插件需要依赖其他插件,请在 constructor 中检查并给出提示
  4. 将功能挂接到核心并不是强制的,若你只是为信号系统编写扩展,这一步骤不是必要的

如下是一个示例

import { core } from 'avg-core';

const logger = core.getLogger('MyPlugin');

export default class MyPlugin {
  constructor(core) {
    // check dependencies
    if (core.plugins.dependA && core.plugins.dependB) {
      core.plugins.myPlugin = this;
    } else {
      logger.warn('You should install dependA and dependB.');
    }
  }
  hello() {
    logger.debug('You called `hello()`')
  }
}

这样,他人就能够通过 core.plugins.myPlugin.hello() 调用插件功能。

在插件中使用信号

你可以像在其他地方一样使用信号系统的功能,但这可能需要你在构造函数中写 this.core = core 之类的语句,将核心实例保存下来。

此外,信号系统也存在注册顺序的问题,若想要正常使用信号系统,请确保该信号在调用时已经注册,或做一些兼容处理。

扩展信号系统

原始的信号系统只提供了少数的功能,你可以通过插件扩展信号系统。

  1. 如果你的插件只扩展了信号系统,那么你不需要 core.plugins.<name> = object 的步骤
  2. 使用 core.use('<signal name>', method) 注册信号

下面是一个例子:

import { core } from 'avg-core';

const logger = core.getLogger('MyPlugin');

export default class MyPlugin {
  constructor(core) {
    this.hello = this.hello.bind(this);

    core.use('hello', this.hello);
  }
  hello() {
    logger.debug('You called `hello()` via signal')
  }
}
Clone this wiki locally