Node.js开源企业框架egg简介¶
Egg.js是基于Koa.js的框架,相当于框架之上的框架。Egg.js继承了Koa.js的高性能优点,同时又加入了一些约束和开发规范,来规避Koa.js框架自身的开发自由度太高的问题。
Koajs是一个nodejs中比较基层的框架,它本身没有太多约束与规范,自由度非常高,每一个开发者实现自己的服务的时候,都有自己的“骚操作”。而egg为了适应企业开发,加了一些开发时的规范与约束,从而解决Koajs这种自由度过高而导致不适合企业内使用的缺点,Egg便在这种背景下诞生。
egg为了企业中使用相同的规范去开发,本身奉行“约定大于配置”的原则,就如上面这个例子,它本身就约定了这个功能该有怎样的规范去实现,从而使得它能在企业框架域中站住脚,发挥Koajs的价值。
备注
可以将Egg.js视为Koa.js的筛选规范版本,也就是所谓最佳实践。帮助普通开发者能够直接选择使用Koa.js中比较成熟的解决方案。
在阿里内部不同部门又基于egg框架定制了自己的框架,例如蚂蚁的chair,UC的Nut,阿里云的aliyun-egg等。
Egg.js设计原则¶
专注于提供 Web 开发的核心功能和一套灵活可扩展的插件机制。
Egg 的插件机制有很高的可扩展性,一个插件只做一件事。Egg 通过框架聚合这些插件,并根据自己的业务场景定制配置,这样应用的开发成本就变得很低。
Egg 奉行『约定优于配置』,按照一套统一的约定进行应用开发,团队内部采用这种方式可以减少开发人员的学习成本。
另外一个Node.js MVC框架是 sails.js ,和egg不同的是sails集成了众多功能,而egg则不直接提供功能,只是集成各种功能插件,例如egg-blueprint,egg-waterline 等这样的插件,再使用 sails-egg 框架整合这些插件就可以替代 Sails 了。
Egg.js和Koa¶
Koa是流行的Express框架的开发者所开发的新型web框架,两者设计风格类似,底层也都是共用的同一套 HTTP 基础库,但是有几个显著的区别:
异步编程:
Node.js 8 正式进入 LTS 后,async function 可以在 Node.js 中使用并且没有任何性能问题。Koa 2.x框架底层以及所有内置插件都使用 async function 编写
Koa 的中间件和 Express 不同,Koa 选择了洋葱圈模型:
所有的请求经过一个中间件的时候都会执行两次,对比 Express 形式的中间件,Koa 的模型可以非常方便的实现后置处理逻辑。
Context:
和 Express 只有 Request 和 Response 两个对象不同,Koa 增加了一个 Context 的对象,作为这次请求的上下文对象(在 Koa 1 中为中间件的 this
,在 Koa 2 中作为中间件的第一个参数传入)。我们可以将一次请求相关的上下文都挂载到这个对象上。类似 traceId
这种需要贯穿整个请求(在后续任何一个地方进行其他调用都需要用到)的属性就可以挂载上去。相较于 request 和 response 而言更加符合语义。
异常处理
使用 try catch
就可以将按照规范编写的代码中的所有错误都捕获到。这样我们可以很便捷的编写一个自定义的错误处理中间件。
Egg继承于Koa¶
Egg 选择了 Koa 作为其基础框架,在它的模型基础上,进一步对它进行了一些增强:
框架提供了多种扩展点扩展自身的功能:
Application
Context
Request
Response
Helper
插件:
在 Express 和 Koa 中,经常会引入许许多多的中间件来提供各种各样的功能,例如引入 koa-session 提供 Session 的支持,引入 koa-bodyparser 来解析请求 body。而 Egg 提供了一个更加强大的插件机制,让这些独立领域的功能模块可以更加容易编写。
一个插件可以包含:
extend:扩展基础对象的上下文,提供各种工具类、属性。
middleware:增加一个或多个中间件,提供请求的前置、后置处理逻辑。
config:配置各个环境下插件自身的默认配置项。