一、什么是Egg.js
Egg.js是阿里开源的node.js框架,国内使用较为普及。
Egg.js基于Koajs,为企业级框架和应用而生,我们希望由Egg.js 孕育出更多上层框架,帮助开发团队和开发人员降低开发和维护成本。
二、异步编程模型
Node.js是一个一步的世界,社区提供了各种异步解决方案,最终胜出的是 Promise,他也被内置到了 ECMAScript2015(ES6) 中,Promise 实际上是利用编程技巧将回调函数改成链式调用,避免了回调地狱,但是 Promise 存在着代码冗余的问题,不管什么操作,放眼一看全都是 then。
在 Promise 的基础上,结合 Generator 提供的切换上下文能力,官方提供了async await这种解决方案,并在 ECMAScript2017 中发布,Node.js 8 中实现。
async、await 可以让我们用同步写法编写异步代码。async 关键字声明函数,使用 await 关键字来等待一个 Promise 被 resolve 或者 reject。
async function 的返回值是一个 Promise pending状态,这个 Promise 要么会通过一个由 async 函数返回的值被解决,要么会通过一个从 async函数中抛出的异常被拒绝。
二、Egg.js 特点
它继承了Koajs的高性能优点,同时又加入了一些约束与开发规范,来规避Koajs框架本身的开发自由度太高的问题。
1、扩展
在 Egg 的框架或者应用中,我们可以定义 app/extend/[application || context || request || response].js 四个文件来扩展 Koa 中的四个对象的原型。通过这个功能我们可以快速地增加更多的辅助功能。
* application 对象:该对象是 Koa
的核心对象,通过该对象来初始化并创建 WebServer
* context 对象:Koa 的 Context 把 node 的 request, response 对象封装进一个单独对象, 并提供许多开发 web 应用和 APIs 有用的方法.
* request 对象:Koa Request
对象是对 node 的 request 进一步抽象和封装,提供了日常 HTTP 服务器开发中一些有用的功能。其中有常用的API,比如:header、method、url、originalUrl、host、query等等。
* response 对象:Koa Response
对象是对 node 的 response 进一步抽象和封装,提供了日常HTTP服务器开发中一些有用的功能。API比如:hearder、status、body、redurec等等。
2、插件
在 Koa 中,经常会引用许许多多的中间件来提供各种各样的红能,譬如 koa-session 提供 Session 的支持,koa-bodyparser 来解析请求body。
Koa的中间件是洋葱模型,也就是说所有的请求经过一个中间件的时候都会被执行两次。
Egg 提供了一个更加强大的插件机制,让这些独立领域的功能模块可以更加容易编写。
一个插件可以包含
- extend:扩展基础对象的上下文,提供各种工具类、属性。
- middleware:增加一个或多个中间件,提供请求的前置、后置处理逻辑。
- config:配置各个环境下插件自身的默认配置项。
一个独立领域下的插件实现,可以在代码维护性非常高的情况下实现非常完善的功能,而插件也支持配置各个环境下的默认(最佳)配置,让我们使用插件的时候几乎可以不需要修改配置项。
三、Egg框架结构
egg-project ├── package.json ├── app.js (可选) ├── agent.js (可选) ├── app | ├── router.js │ ├── controller │ | └── 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
未完~