自定义 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 文档。