- 簡單的骨架認知
- 插件使用(Plugins)
- 持久層方案(egg-sequelize)
- Worker 和 高效負載均衡
- Agent 代理角色
- 定時任務
筆者的其他文章推薦: 《JS 函數(shù)式編程思維簡述》
2. 插件(Plugins)
官方文檔:https://eggjs.org
? ? ? ?首先我們需要明確的是,什么是插件?插件在應用中扮演的角色就是,提升應用擴展能力的獨立的功能封裝。比如我們當前的每一個應用都是一個機器人,他們大概長這個樣子:

我們在這些項目中,可以提取兩類功能:具備通用性的功能 和 不具備通用性的功能。他們通常有以下區(qū)別:
| 名稱 | 注釋 |
|---|---|
| 通用性 | 并非每個應用必須得有的可選功能,可由使用者自由選擇是否擴展的能力 |
| 非通用性 | 只在某個應用中必須存在,無法擴展給別的應用的主要業(yè)務能力 |
因此,插件的設計原則是:具備通用性的功能,可以將其抽離作為插件備用。
例如上圖的這四個機器人,我們可以發(fā)現(xiàn)他們都具備一些相似的特性,以及完全不同的特性:有的機器人裝載的手臂是相同的,有的裝載的腿是相同的。這些相同或相似的部分,我們便可以獨立抽象為一個插件,在有新的機器人需要創(chuàng)建時,有選擇性的考慮是否添加該插件。這樣設計的好處是:有效的減少了相似的代碼在應用中重復出現(xiàn)的概率,提高了可擴展和可維護性。
插件在Egg中的應用
原則: Egg 本身未攜帶過多插件,僅配備了幾個企業(yè)級常用的插件,如
onerror、logrotator、i18n等。更多插件應由應用開發(fā)者自行選擇擴展,或自行開發(fā)。應用表現(xiàn): 擴展已有的 Egg 內置對象。如使用
egg-sequelize插件后,在Service部分便可以使用ctx.model.xxx的方式調用sequelize的數(shù)據(jù)模型,該插件在實現(xiàn)原有的 ORM 操作過程中,將操作對象擴展到了Context對象上。

步驟1:插件選擇
我們可以在 Egg 相關社區(qū),尋找我們感興趣的插件?;蛲ㄟ^ GitHub 搜索 egg-plugin ,尋找相關插件。
步驟2:安裝、配置插件
Egg 插件通常以 NPM 包的形式存儲于遠程庫中,我們搜索到感興趣的插件后,直接通過 NPM 便可進行安裝:
$ npm i egg-yourplugin --save
在安裝之后,于應用中的 package.json 處對其進行配置:
{
"dependencies": {
"egg-yourplugin": "^2.1.3"
}
}
步驟3:啟用插件
我們需要在項目中的 ./config/plugin.ts 位置,啟用相應的插件。如:
import { EggPlugin } from 'egg';
const plugin: EggPlugin = {
// 啟用插件 yourplugin
yourplugin: {
enable: true,
package: 'egg-yourplugin',
},
}
步驟4:初始化插件
插件啟用之后,可以在配置文件中( 如 ./config/config.default.ts ),對插件進行初始化設置:
import { EggAppConfig, EggAppInfo, PowerPartial } from 'egg';
export default (appInfo: EggAppInfo) => {
const config = {} as PowerPartial<EggAppConfig>;
// ...
config.yourplugin = {
field1, field2
};
}
在應用的配置文件中,對插件的初始化數(shù)據(jù),會覆蓋掉插件中的原有配置,并傳遞給插件本身進行處理(實際上每一個插件也是一個小的應用)。
步驟5:使用插件
關于插件的使用方式,根據(jù)插件的構建方式不同而不同。每一個插件掛載到哪一個內置對象中,通常插件都會有詳細的說明文檔描述。我們可以尋找插件項目下的 README.md 查看。