Egg简介
设计原则
Egg 的插件机制有很高的可扩展性,一个插件只做一件事。Egg 通过框架聚合这些插件,并根据自己的业务场景定制配置,这样应用的开发成本就变得很低。
Egg 奉行『约定优于配置』,按照一套统一的约定进行应用开发。Egg 有很高的扩展性。使用Loader可以让框架根据不同环境定义默认配置,还可以覆盖 Egg 的默认约定。
与Express和Sails的差异
Express 是 Node.js 社区广泛使用的框架,简单且扩展性强,非常适合做个人项目。但框架本身缺少约定,标准的 MVC 模型会有各种千奇百怪的写法。Egg 按照约定进行开发,奉行『约定优于配置』,团队协作成本低。
Sails 是和 Egg 一样奉行『约定优于配置』的框架,扩展性也非常好。但是相比 Egg,Sails支持了其他很多的功能,这些功能都是由Sails提供的。而 Egg 不直接提供功能,只是集成各种功能插件。
特性
可以定制上层框架
高度可扩展的插件机制
内置多进程管理
基于koa开发,性能优异
框架稳定,测试覆盖率高
渐进式开发
异步编程
异步的问题:(1)callback嵌套问题(2)异步函数中可能同步调用 callback 返回数据,带来不一致性。
可以采用Promise的方式解决,同时async function这个官方解决方案已经在ECMAScript 2017发布
async function
async function是语言层面提供的语法糖,在 async function 中,我们可以通过 await
关键字来等待一个 Promise 被 resolve(或者 reject,此时会抛出异常), Node.js 现在的 LTS 版本(8.x)已原生支持。
const fn = async function() {
const user = await getUser();
const posts = await fetchPosts(user.id);
return { user, posts };
};
fn().then(res => console.log(res)).catch(err => console.error(err.stack));
Koa
Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。
Koa 和 Express 的设计风格非常类似,底层也都是共用的同一套 HTTP 基础库,但是有几个显著的区别,除了上面提到的默认异步解决方案之外,主要的特点还有下面几个。
中间件
Koa 的中间件和 Express 不同,Koa 选择了洋葱圈模型。
express koa 中间件执行顺序 https://blog.csdn.net/qq_24884955/article/details/80332816
express, koa 中间件执行顺序 https://blog.csdn.net/fantian001/article/details/80204037
多个koa中间件执行顺序 https://www.jianshu.com/p/b0d813f6fd76
context
和 Express 只有 Request 和 Response 两个对象不同,Koa 增加了一个 Context 的对象,作为这次请求的上下文对象(在 Koa 2 中作为中间件的第一个参数传入)
同时 Context 上也挂载了 Request 和 Response 两个对象。和 Express 类似,这两个对象都提供了大量的便捷方法辅助开发,例如:get request.query、get request.hostname、set response.body、set response.status。
异常处理
通过同步方式编写异步代码带来的另外一个非常大的好处就是异常处理非常自然,使用 try catch 就可以将按照规范编写的代码中的所有错误都捕获到。这样我们可以很便捷的编写一个自定义的错误处理中间件。
插件
众所周知,在 Express 和 Koa 中,经常会引入许许多多的中间件来提供各种各样的功能,例如引入 koa-session 提供 Session 的支持,引入 koa-bodyparser 来解析请求 body。而 Egg 提供了一个更加强大的插件机制,让这些独立领域的功能模块可以更加容易编写。
一个插件可以包含
extend:扩展基础对象的上下文,提供各种工具类、属性。
middleware:增加一个或多个中间件,提供请求的前置、后置处理逻辑。
config:配置各个环境下插件自身的默认配置项。
一个独立领域下的插件实现,可以在代码维护性非常高的情况下实现非常完善的功能,而插件也支持配置各个环境下的默认(最佳)配置,让我们使用插件的时候几乎可以不需要修改配置项。 egg-security 插件就是一个典型的例子。
参考:Egg.js 与 Koa - 为企业级框架和应用而生 https://eggjs.org/zh-cn/intro/egg-and-koa.html