Egg 是在 Koa 基础上封装并增加了一些约定的框架,通过加载器(Loader)来加载不同目录下代码,实现各种的功能,要开发 Eggjs 插件和框架,首先要了解 Eggjs 的加载器。
应用、框架、插件
要了解加载器,首先要了解 Egg 框架的结构。Egg 应用通过框架运行起来并根据功能需要加载插件。插件只完成特定功能,通过配置依赖,在 config/plugin.ts
中开启插件。
import {
EggPlugin } from 'egg';
const plugin: EggPlugin = {
// 设置 mysql
mysql: {
enable: true,
package: 'egg-mysql',
},
};
export default plugin;
框架 (framework) 不但用于启动应用,还封装了各种插件、功能。框架是可以继承的,比如在 Egg 基础上开发新的框架,也可以同时使用两个框架。
下面是官网展示的 Egg.js架构图。
+-----------------------------------+--------+
| app1, app2, app3, app4 | |
+-----+--------------+--------------+ |
| | | framework3 | |
+ | framework1 +--------------+ plugin |
| | | framework2 | |
+ +--------------+--------------+ |
| Egg | |
+-----------------------------------+--------|
| Koa |
+-----------------------------------+--------+
加载单元
Egg 将应用、框架和插件都称为加载单元(loadUnit),加载按照 插件、框架、应用依次进行(被依赖的先加载)。
// egg-core/lib/loader/egg_loader.js
/*
* 获取所有加载单元
*/
getLoadUnits() {
if (this.dirs) {
return this.dirs;
}
const dirs = this.dirs = [];
// 添加插件路径
if (this.orderPlugins) {
for (const plugin of this.orderPlugins) {
dirs.push({
path: plugin.path,
type: 'plugin',
});
}
}
// 添加框架路径
for (const eggPath of this.eggPaths) {
dirs.push({
path: eggPath,
type: 'framework',
});
}
// 添加应用路径
dirs.push({
path: this.options.baseDir,
type: 'app