筆者的其他文章推薦: 《JS 函數(shù)式編程思維簡述》
2. 插件(Plugins)
官方文檔:https://eggjs.org
? ? ? ?首先我們需要明確的是理逊,什么是插件橡伞?插件在應(yīng)用中扮演的角色就是,提升應(yīng)用擴(kuò)展能力的獨(dú)立的功能封裝晋被。比如我們當(dāng)前的每一個(gè)應(yīng)用都是一個(gè)機(jī)器人兑徘,他們大概長這個(gè)樣子:
我們在這些項(xiàng)目中,可以提取兩類功能:具備通用性的功能 和 不具備通用性的功能羡洛。他們通常有以下區(qū)別:
名稱 | 注釋 |
---|---|
通用性 | 并非每個(gè)應(yīng)用必須得有的可選功能挂脑,可由使用者自由選擇是否擴(kuò)展的能力 |
非通用性 | 只在某個(gè)應(yīng)用中必須存在,無法擴(kuò)展給別的應(yīng)用的主要業(yè)務(wù)能力 |
因此欲侮,插件的設(shè)計(jì)原則是:具備通用性的功能崭闲,可以將其抽離作為插件備用。
例如上圖的這四個(gè)機(jī)器人威蕉,我們可以發(fā)現(xiàn)他們都具備一些相似的特性刁俭,以及完全不同的特性:有的機(jī)器人裝載的手臂是相同的,有的裝載的腿是相同的韧涨。這些相同或相似的部分牍戚,我們便可以獨(dú)立抽象為一個(gè)插件,在有新的機(jī)器人需要?jiǎng)?chuàng)建時(shí)虑粥,有選擇性的考慮是否添加該插件如孝。這樣設(shè)計(jì)的好處是:有效的減少了相似的代碼在應(yīng)用中重復(fù)出現(xiàn)的概率,提高了可擴(kuò)展和可維護(hù)性娩贷。
插件在Egg中的應(yīng)用
原則: Egg 本身未攜帶過多插件第晰,僅配備了幾個(gè)企業(yè)級(jí)常用的插件,如
onerror
、logrotator
茁瘦、i18n
等罗岖。更多插件應(yīng)由應(yīng)用開發(fā)者自行選擇擴(kuò)展,或自行開發(fā)腹躁。應(yīng)用表現(xiàn): 擴(kuò)展已有的 Egg 內(nèi)置對(duì)象桑包。如使用
egg-sequelize
插件后,在Service
部分便可以使用ctx.model.xxx
的方式調(diào)用sequelize
的數(shù)據(jù)模型纺非,該插件在實(shí)現(xiàn)原有的 ORM 操作過程中哑了,將操作對(duì)象擴(kuò)展到了Context
對(duì)象上。
步驟1:插件選擇
我們可以在 Egg 相關(guān)社區(qū)烧颖,尋找我們感興趣的插件弱左。或通過 GitHub 搜索 egg-plugin 炕淮,尋找相關(guān)插件拆火。
步驟2:安裝、配置插件
Egg 插件通常以 NPM
包的形式存儲(chǔ)于遠(yuǎn)程庫中涂圆,我們搜索到感興趣的插件后们镜,直接通過 NPM
便可進(jìn)行安裝:
$ npm i egg-yourplugin --save
在安裝之后,于應(yīng)用中的 package.json
處對(duì)其進(jìn)行配置:
{
"dependencies": {
"egg-yourplugin": "^2.1.3"
}
}
步驟3:啟用插件
我們需要在項(xiàng)目中的 ./config/plugin.ts
位置润歉,啟用相應(yīng)的插件模狭。如:
import { EggPlugin } from 'egg';
const plugin: EggPlugin = {
// 啟用插件 yourplugin
yourplugin: {
enable: true,
package: 'egg-yourplugin',
},
}
步驟4:初始化插件
插件啟用之后,可以在配置文件中( 如 ./config/config.default.ts
)踩衩,對(duì)插件進(jìn)行初始化設(shè)置:
import { EggAppConfig, EggAppInfo, PowerPartial } from 'egg';
export default (appInfo: EggAppInfo) => {
const config = {} as PowerPartial<EggAppConfig>;
// ...
config.yourplugin = {
field1, field2
};
}
在應(yīng)用的配置文件中嚼鹉,對(duì)插件的初始化數(shù)據(jù),會(huì)覆蓋掉插件中的原有配置驱富,并傳遞給插件本身進(jìn)行處理(實(shí)際上每一個(gè)插件也是一個(gè)小的應(yīng)用)锚赤。
步驟5:使用插件
關(guān)于插件的使用方式,根據(jù)插件的構(gòu)建方式不同而不同褐鸥。每一個(gè)插件掛載到哪一個(gè)內(nèi)置對(duì)象中线脚,通常插件都會(huì)有詳細(xì)的說明文檔描述。我們可以尋找插件項(xiàng)目下的 README.md
查看晶疼。