Skip to main content

自定义 EggJS 框架接入

在 Midway 体系中,我们通过 @midwayjs/web ,支持了 EggJS 作为上层框架,并将 Web 层传统的控制器、服务等分层,以及依赖注入带到了 EggJS 体系。

在社区中,有不少公司已经基于 EggJS 封装了自己的插件和框架,如果这个时候基于 MidwayJS 需要重写原有的框架体系,就显得很不切实际。为此,Midway 开发了一套让 EggJS 上层框架快速接入 Midway 体系,使用到 Midway 依赖注入能力的方式。

上层框架要求#

我们以一个名为 fake-egg  的上层框架举例。

EggJS 的上层框架,按照文档会有一些要求,会导出一些固定的属性,比如 Application 、 Agent 、 AppWorkerLoader  以及 AgentWorkerLoader  这四个属性,这四个属性必须导出,示例如下。

'use strict';
const egg = require('egg');
const framework = {};
/** * @member {Application} Egg#Application * @since 1.0.0 */framework.Application = require('./lib/application');
/** * @member {Agent} Egg#Agent * @since 1.0.0 */framework.Agent = require('./lib/agent');
/** * @member {Agent} Egg#AppWorkerLoader * @since 1.0.0 */framework.AppWorkerLoader = require('./lib/core/loader/app_worker_loader');
/** * @member {Agent} Egg#AgentWorkerLoader * @since 1.0.0 */framework.AgentWorkerLoader = require('./lib/core/loader/agent_worker_loader');
module.exports = exports = Object.assign(egg, framework);

接入 MidwayJS#

接入 MidwayJS 的方式很简单。只需要沿用 EggJS 的自定义框架接入方式,在实际业务的 package.json  中增加字段即可。

{  "name": "ali-demo",  "egg": {    "framework": "fake-egg"  }}

这样, @midwayjs/web  会自动加载该框架,并将其作为基础的上层框架增加依赖注入,装饰器等能力。这样既可以享受到该上层框架的 EggJS 扩展能力,又能使用现有的 Midway 体系的能力。

扩展之后,整个目录结构会沿用 Midway 体系,并将 EggJS 默认的 baseDir 修改为 src  中。

完整的用户的 package.json  如下。

{  "name": "{{name}}",  "private": true,  "dependencies": {    "@midwayjs/web": "^2.3.0",    "@midwayjs/decorator": "^2.3.0",    "fake-egg": "^1.0.0",                                               // 这里增加了上层框架    "egg": "^2.0.0",    "egg-scripts": "^2.10.0",    "midway": "^2.3.0"  },  "devDependencies": {    ...                                                                                 // 开发依赖没有变化  },  "egg": {    "framework": "fake-egg"                                         // 额外增加一个配置指定上层框架  }}

其他关于如何实现一个 EggJS 自定义框架,请参考 EggJS 文档