根据公开的文献,eggjs的前身属于蚂蚁金服,于2016年9月亮相JSConf China并正式开源。它有一个很显著的特点:【微内核+插件机制】,专门为团队架构师提供框架定制的能力,可以基于eggjs来定制业务框架。
快速入门
$ npm i egg-init -g
$ egg-init egg-simple --type=simple
$ cd egg-simple
eggjs提供了一个命令行工具,来初始化工程,根据官网提供的信息,你可以看见整个工程的分布,每一个目录都是有明确意义的。
egg-project
├── package.json // 定义了项目所需要的各种模块,以及配置信息(名称、版本等元数据)
├── app.js (可选) // 用于自定义初始化工作,这个文件只能返回一个函数beforeStart
├── agent.js (可选) // 跟app.js类似。
├── app
| ├── router.js // 用于配置URL路由规则。
│ ├── controller // 对用户的请求参数进行处理,调用对应的service方法处理业务,返回结果
│ | └── home.js
│ ├── service (可选) // 复杂数据的处理,第三方服务的调用。
│ | └── user.js
│ ├── middleware (可选) // 用于编写中间件
│ | └── response_time.js
│ ├── schedule (可选) // 用于编写定时任务
│ | └── my_task.js
│ ├── public (可选) // 存放静态资源
│ | └── reset.css
│ ├── view (可选) // 用于放置模板文件
│ | └── home.tpl
│ └── extend (可选) // 用于框架的扩展
│ ├── helper.js (可选)
│ ├── request.js (可选)
│ ├── response.js (可选)
│ ├── context.js (可选)
│ ├── application.js (可选)
│ └── agent.js (可选)
├── config
| ├── plugin.js // 用于配置需要加载的插件
| ├── config.default.js // 默认配置文件
| ├── config.prod.js // 生产环境配置文件
| ├── config.test.js (可选)
| ├── config.local.js (可选)
| └── config.unittest.js (可选)
└── test // 单元测试
├── middleware
| └── response_time.test.js
└── controller
└── home.test.js
工程分析
正常情况下,我们几乎最常用的内置对象或者配置,一个内置对象描述了一个请求的生命周期,它在一个controller对象的上下文中可访问。
由于eggjs也是基于Koa来进行的封装,所以洋葱模型能支持的特性,在eggjs中同样支持。Koa的设计思路是为中间件提供一系列的语法糖,来增强其互用性和健壮性,但有时候中间件并不能提供所有的能力。eggjs提供的插件机制,就很好的辅助解决了这个问题。再这些跟请求相关的对象之外,eggjs对开发模型也进行了封装。
框架提供了强大可扩展的配置功能,可以自动Merge插件,应用,框架的配置,并且按顺序覆盖,这是一个很有用的功能,可以很容易的配置你的Web应用。
在此之外,我们可以全面窥视一下eggjs能支持的其他能力
在整套框架中我很看重安全性,eggjs总结阿里巴巴的很多经验,并且默认提供了这样的支持,这一点很帮,节省了一些考虑这方面的时间,框架本身针对 Web 端常见的安全风险内置了丰富的解决方案。
框架简单分析
阅读到这里,其实大家基本上对eggjs有了一个大概的应用,这里的描述主要是简单分析一下eggjs的运行机制,它有助于我们理解eggjs框架,独创的Loader机制实现了加载的约定,并且抽象了很多底层api可以进一步的扩展,这样的加载机制,几乎做到了无感知。
如果你要真正的部署Web应用,由于JavaScript的单线程特点,注定无法享有多核运算的好处,但是Node.js提供了Cluster模块,它要解决的问题,主要就是来享用多核运算的好处,我们可以简单的看一下Cluster模块的功能:
这里有一个很有意思的特点,启动一个Master进程来负责启动其他进程,其他进程类比Worker,Worker进程来接收请求,对外提供服务,每一个Worker之间的通信,都需要借助Master,由Master来转发。(额外话题,这里是不是和React的兄弟组件通信很像,都需要一个Master来做中转)
虽然看起来,很容易,其实实现起来很多细节问题,要处理。
最后,如果你开发Node.js Web应用,我强烈推荐使用eggjs,这是一个很值得学习的Web基础框架。