-
Notifications
You must be signed in to change notification settings - Fork 69
插件系统
Icemic edited this page Mar 11, 2017
·
2 revisions
假设现在有一个外部插件名叫 myPlugin
,你可以这样的方式使用它:
- 首先进行导入,导入可以在程序的任何地方进行,但只有在导入之后才能使用该插件
import { core } from 'avg-core';
import MyPlugin from './myplugin';
// do something...
core.installPlugin(MyPlugin);
// do something else...
- 使用插件
你可以在任何地方使用插件,如函数、组件类等,通过 core.plugins.<name>
的方式访问你导入的插件。
值得注意的是,插件名 并不一定是你导入它时使用的类名称,名称是由插件编写者指定的。具体的名称和功能函数请参考插件编写者提供的文档。
下面给出一个在函数中使用时的例子:
import { core } from 'avg-core';
function yourMethod() {
core.plugins.myPlugin.hello();
}
一个编写好的插件即是一个 Class,所以编写插件和通常的编写 JS 模块思路是一致的,只要最终将 Class 导出即可。
但这并不以为着随心所欲,仍然要遵循如下的约定:
- 构造函数的第一个参数是
core
,在将你编写的插件注册到 AVG.js 时,AVG.js 会将自身的核心实例传递给你编写的 Class。 - 请在构造函数中执行
core.plugins.<name> = object
来将功能挂接到核心上,务必使用与插件本身相关的名称,并避免与他人的插件命名重复。 - 若你的插件需要依赖其他插件,请在
constructor
中检查并给出提示 - 将功能挂接到核心并不是强制的,若你只是为信号系统编写扩展,这一步骤不是必要的
如下是一个示例
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
之类的语句,将核心实例保存下来。
此外,信号系统也存在注册顺序的问题,若想要正常使用信号系统,请确保该信号在调用时已经注册,或做一些兼容处理。
原始的信号系统只提供了少数的功能,你可以通过插件扩展信号系统。
- 如果你的插件只扩展了信号系统,那么你不需要
core.plugins.<name> = object
的步骤 - 使用
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')
}
}