关于egg
egg
是阿里开源的一个框架,为企业级框架和应用而生,相较于express
和koa
,有更加严格的目录结构和规范,使得团队可以在基于egg
定制化自己的需求或者根据egg
封装出适合自己团队业务的更上层框架
egg
所处的定位
可以看到egg
处于的是一个中间层的角色,基于koa
,不同于koa
以middleware
为主要生态,egg
根据不同的业务需求和场景,加入了plugin
,extends
等这些功能,可以让开发者摆脱在使用middleware
功能时无法控制使用顺序的被动状态,而且还可以增加一些请求无关的一些功能。除此之外,egg
还有很多其他优秀的功能,在这里不详述。想了解更多可以移步这里
初始化项目
egg
有直接生成整个项目的脚手架功能,只需要执行如下几条命令,就可以生成一个新的项目:
$ npm i egg-init -g $ egg-init helloworld --type=simple $ cd egg-helloworld $ npm i
启动项目:
$ npm run dev $ open localhost:7001
egg
是如何运行起来的
下面通过追踪源码来讲解一下egg
究竟是如何运行起来的:
查看egg-init
脚手架生成的项目文件,可以看到整个项目文件是没有严格意义上的入口文件的,根据package.json
中的script
命令,可以看到执行的直接是egg-bin dev
的命令。找到egg-bin
文件夹中的dev.js
,会看到里面会去执行start-cluster
文件:
//dev.js构造函数中 this.serverBin = path.join(__dirname, '../start-cluster'); // run成员函数 * run(context) { //省略 yield this.helper.forkNode(this.serverBin, devArgs, options); }
移步到start-cluster.js
文件,可以看到关键的一行代码:
require(options.framework).startCluster(options);
其中options.framework
打印信息为:
/Users/wyf/Project/egg-example/node_modules/egg
找到对应的egg
目录中的index.js
文件:
exports.startCluster = require('egg-cluster').startCluster;
继续追踪可以看到最后运行的其实就是egg-cluster
中的startCluster
,并且会fork
出agentWorker
和appWorks
,官方文档对于不同进程的fork
顺序以及不同进程之间的IPC
有比较清晰的说明,
主要的顺序如下:
-
Master 启动后先 fork Agent 进程
-
Agent 初始化成功后,通过 IPC 通道通知 Master
-
Master 再 fork 多个 App Worker
-
App Worker 初始化成功,通知 Master
-
所有的进程初始化成功后,Master 通知 Agent 和 Worker 应用启动成功
通过代码逻辑也可以看出它的顺序:
//在egg-ready状态的时候就会执