自定义插件
插件是ibird
中非常重要的一个概念。在使用ibird
的过程中,当你发现核心模块的功能已经无法满足你的需求时,你可以通过引用插件的方式来扩展应用。
写在前面
插件的设计非常灵活,每个插件都拥有自己特定的职责,并对外提供可调用的接口或路由。插件采取轻量化设计,它本身就是一个普通的Node
模块。现有的插件都可以在插件中心搜索到,目前已有很多实用的插件,如日志插件(ibird-log
)、令牌插件(ibird-token
)、任务插件(ibird-task
)等。你也可以按照规范开发自己的插件。插件的命名一般都以ibird-
开头,后面跟插件的英文代码,如日志插件为ibird-log
,任务插件为ibird-task
等。
在ibird
提供的所有模块中,除了ibird-core
以外,其他的模块全是插件。插件的存在是为了使ibird
变得更加强大,通过结合插件的使用,你会发现很多意想不到的功能。
使用插件
插件的使用非常简单,下面以日志插件为例:
安装插件
npm i ibird-log -S
引用插件
为了更清晰地描述,这里只展示引用插件的方法,关于ibird
核心模块的使用,请移步这里。
const app = require('ibird-core');
const log = require('ibird-log');
app.import(log); // app为ibird的应用对象
当插件被成功import
之后,ibird
的会做这么几件事:
- 自动注册插件中所有开放的数据模型
- 自动挂载插件中所有开放的中间件
- 自动挂载插件中所有开放的路由
如果你不想让ibird
自动化导入插件,你也可以获取插件的相关部分,然后自己决定相关信息的导入:
const test = require('ibird-test');
// 插件的数据模型部分,可以直接调用app.model注册
const testModel = test.model;
// 插件的中间件部分,可以直接调用app.use挂载中间件
const testMiddleware = test.middleware;
// 插件的路由部分,可以直接调用app.mount挂载路由
const testRoute = test.route;
如果需要调用插件开放的接口(非路由,限服务端调用的内部接口),可以这样做:
const test = require('ibird-test');
test.method1('test...');
test.method2('test...');
Tips:这里需要注意的是,并非每一个插件都有开放的API,使用插件前,请先认真阅读该插件的使用文档。
插件开发
如果现有的插件依然满足不了你的需求,你也可以尝试自己开发一个ibird
插件。插件的开发也很简单,每个插件实际上就是一个完整的Node
模块,你完全可以按照Node
的开发标准去实现的你的插件,只有一点需要注意的是,你的模块的入口文件需要导出一个对象,该对象中至少要包含三个键:
module.exports = {
model: {},
middleware: fn,
route: fn,
......
};
model
插件导出的数据模型,对象类型,其中key为模型编码,value为模型对象,模型对象的格式参考ibird核心文档。
middleware
插件开放的中间件,函数类型,传入参数koa应用实例对象。
route
插件开放的路由,函数类型,传入参数为koa-router实例对象。
注意事项
在设计插件的过程中,需要注意以下几点:
- 尽可能轻量化,每个插件争取只处理单一职责的任务
- 在涉及到数据模型的定义时,你需要额外引入
mongoose
模块 - 按规定导出入口文件
Tips:为了规范插件的使用,无论你是否存在相应的信息(模型、中间件、路由和内部接口),你的入口文件皆应按照以上规则导出。