1.為什么要插件
我們在使用 Koa 中間件過程中發(fā)現(xiàn)了下面一些問題:
中間件加載其實是有先后順序的首繁,但是中間件自身卻無法管理這種順序践宴,只能交給使用者坏为。這樣其實非常不友好究驴,一旦順序不對镊绪,結(jié)果可能有天壤之別。
中間件的定位是攔截用戶請求洒忧,并在它前后做一些事情蝴韭,例如:鑒權(quán)、安全檢查熙侍、訪問日志等等万皿。但實際情況是,有些功能是和請求無關(guān)的核行,例如:定時任務(wù)牢硅、消息訂閱、后臺邏輯等等芝雪。
有些功能包含非常復(fù)雜的初始化邏輯减余,需要在應(yīng)用啟動的時候完成。這顯然也不適合放到中間件中去實現(xiàn)惩系。
綜上所述位岔,我們需要一套更加強大的機制,來管理堡牡、編排那些相對獨立的業(yè)務(wù)邏輯抒抬。
2.中間件、插件晤柄、應(yīng)用的關(guān)系
一個插件其實就是一個『迷你的應(yīng)用』擦剑,和應(yīng)用(app)幾乎一樣:
它包含了?Service、中間件芥颈、配置惠勒、框架擴(kuò)展等等。
它沒有獨立的?Router?和?Controller爬坑。
它沒有?plugin.js纠屋,只能聲明跟其他插件的依賴,而不能決定其他插件的開啟與否盾计。
-他們的關(guān)系是:
應(yīng)用可以直接引入 Koa 的中間件售担。
插件本身可以包含中間件。
多個插件可以包裝為一個上層框架署辉。
3.使用插件
插件一般通過 npm 模塊的方式進(jìn)行復(fù)用:
$ npm i egg-mysql --save
然后需要在應(yīng)用或框架的?config/plugin.js?中聲明:
// config/plugin.js // 使用 mysql 插件
exports.mysql = {
????????enable:true,
????????package:'egg-mysql',
};
4.package 和 path
package?是?npm?方式引入族铆,也是最常見的引入方式
path?是絕對路徑引入,如應(yīng)用內(nèi)部抽了一個插件涨薪,但還沒達(dá)到開源發(fā)布獨立?npm?的階段骑素,或者是應(yīng)用自己覆蓋了框架的一些插件// config/plugin.js
constpath =require('path');
exports.mysql = {
????????enable:true,
????????path: path.join(__dirname,'../lib/plugin/egg-mysql'),
};
5.插件配置
插件一般會包含自己的默認(rèn)配置,應(yīng)用開發(fā)者可以在?config.default.js?覆蓋對應(yīng)的配置
6.插件開發(fā)
$ npm init egg --type=plugin
7.插件依賴
8.應(yīng)用
1)//應(yīng)用啟動時做一些初始化工作
app.beforeStart(async() => {
????await app.myClient.ready();
? });
2)設(shè)置定時任務(wù)