- 简单的骨架认知
- 插件使用(Plugins)
- 持久层方案(egg-sequelize)
- Worker 和 高效负载均衡
- Agent 代理角色
- 定时任务
笔者的其他文章推荐: 《JS 函数式编程思维简述》
2. 插件(Plugins)
官方文档:https://eggjs.org
首先我们需要明确的是,什么是插件?插件在应用中扮演的角色就是,提升应用扩展能力的独立的功能封装。比如我们当前的每一个应用都是一个机器人,他们大概长这个样子:
我们在这些项目中,可以提取两类功能:具备通用性的功能 和 不具备通用性的功能。他们通常有以下区别:
名称 | 注释 |
---|---|
通用性 | 并非每个应用必须得有的可选功能,可由使用者自由选择是否扩展的能力 |
非通用性 | 只在某个应用中必须存在,无法扩展给别的应用的主要业务能力 |
因此,插件的设计原则是:具备通用性的功能,可以将其抽离作为插件备用。
例如上图的这四个机器人,我们可以发现他们都具备一些相似的特性,以及完全不同的特性:有的机器人装载的手臂是相同的,有的装载的腿是相同的。这些相同或相似的部分,我们便可以独立抽象为一个插件,在有新的机器人需要创建时,有选择性的考虑是否添加该插件。这样设计的好处是:有效的减少了相似的代码在应用中重复出现的概率,提高了可扩展和可维护性。
插件在Egg中的应用
原则: Egg 本身未携带过多插件,仅配备了几个企业级常用的插件,如
onerror
、logrotator
、i18n
等。更多插件应由应用开发者自行选择扩展,或自行开发。应用表现: 扩展已有的 Egg 内置对象。如使用
egg-sequelize
插件后,在Service
部分便可以使用ctx.model.xxx
的方式调用sequelize
的数据模型,该插件在实现原有的 ORM 操作过程中,将操作对象扩展到了Context
对象上。
步骤1:插件选择
我们可以在 Egg 相关社区,寻找我们感兴趣的插件。或通过 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
};
}
在应用的配置文件中,对插件的初始化数据,会覆盖掉插件中的原有配置,并传递给插件本身进行处理(实际上每一个插件也是一个小的应用)。
步骤5:使用插件
关于插件的使用方式,根据插件的构建方式不同而不同。每一个插件挂载到哪一个内置对象中,通常插件都会有详细的说明文档描述。我们可以寻找插件项目下的 README.md
查看。