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 选择了洋葱圈模型:

../../_images/koa_onion.png

所有的请求经过一个中间件的时候都会执行两次,对比 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:配置各个环境下插件自身的默认配置项。

参考