egg.js 是国内最热门的 node.js 框架之一,不同于 exporess、koa 等基础框架,egg.js 在应用级的提炼封装,使其更贴近业务场景,更快上手。
入门和理解 egg.js 的设计理念,有助于提升我们在面对大型 node.js 应用时的设计思路。
在本文中,我们从 egg.js 文档出发,你将看到:
这部分从整体应用架构出发,分析 egg 改造 Koa 的意义,以及 MVC 思想是如何落地到 egg 的约定中的。
koa 是 egg 的基础。 egg 在 koa 的基础上做了一层扩展和标准化,那么这里有两个问题要讨论
为什么是 Koa?
市面上不缺乏 node 基础框架,以 Express、Koa 最具影响力,那么相比 Express,Koa 有哪些特点让受到 Egg 青睐呢?
首先,众所周知,二者在::中间件机制::上有差异。
(其实 Express 也可以当洋葱圈用,但 next 异步问题又让大家被迫用成了尾调用)
简单说,Koa 的中间件机制对「异步」和「扩展」都要友好的多。
再者,相对于 Express 的 Request 和 Response 两个对象,Koa 提供了更集合的 ::Context 对象::
这样,App、Context 这两个重要的类,可以分工覆蓋所有的挂载场景:
koa 的 app、context 方便挂载扩展,因此 egg.js 在扩展上大做文章,提供了丰富的扩展方式。
::直接扩展:: application,context,request,response
正常你自己写 koa 是要写入口的,但 egg 把实例化 koa 的代码封装起来,所以本来应该在 index 中做的对 App 的扩展就不能实现了,需要一个配置的地方解决这个问题,顺手加上 context、req、res 的扩展。
这只是最简单的扩展方式。适合扩展一些简单的功能,比如在 Context 上挂个 ua 判断方法
// app/extend/context.js
module.exports = {
get isIOS() {
const iosReg = /iphone|ipad|ipod/i;
return iosReg.test(this.get('user-agent'));
},
};
<< · Back Index ·>>