对于一个想成为全栈的前端工程师来讲,Node是必不可少的,写个服务端更是必须,想必大家都比较熟悉Express 和 Koa 这两个超火的框架,然后在两者挑选的时候,发现了一个Egg,Egg 继承于 Koa,Koa 是一个非常优秀的框架,然而对于企业级应用来说,它还比较基础。而 Egg 选择了 Koa 作为其基础框架,在它的模型基础上,进一步对它进行了一些增强。
扩展
在基于 Egg 的框架或者应用中,我们可以通过定义 app/extend/{application,context,request,response}.js
来扩展 Koa 中对应的四个对象的原型,通过这个功能,我们可以快速的增加更多的辅助方法,例如我们在 app/extend/context.js
中写入下列代码:
// app/extend/context.js module.exports = { get isIOS() { const iosReg = /iphone|ipad|ipod/i; return iosReg.test(this.get('user-agent')); }, };
在 Controller 中,我们就可以使用到刚才定义的这个便捷属性了:
// app/controller/home.js exports.handler = ctx => { ctx.body = ctx.isIOS ? 'Your operating system is iOS.' : 'Your operating system is not iOS.'; };
更多关于扩展的内容,请查看扩展章节。
插件
众所周知,在 Express 和 Koa 中,经常会引入许许多多的中间件来提供各种各样的功能,例如引入 koa-session 提供 Session 的支持,引入 koa-bodyparser 来解析请求 body。而 Egg 提供了一个更加强大的插件机制,让这些独立领域的功能模块可以更加容易编写。
一个插件可以包含
extend:扩展基础对象的上下文,提供各种工具类、属性。
middleware:增加一个或多个中间件,提供请求的前置、后置处理逻辑。
config:配置各个环境下插件自身的默认配置项。
一个独立领域下的插件实现,可以在代码维护性非常高的情况下实现非常完善的功能,而插件也支持配置各个环境下的默认(最佳)配置,让我们使用插件的时候几乎可以不需要修改配置项。
egg-security 插件就是一个典型的例子。
更多关于插件的内容,请查看插件章节。
Egg 与 Koa 的版本关系
Egg 1.x
Egg 1.x 发布时,Node.js 的 LTS 版本尚不支持 async function,所以 Egg 1.x 仍然基于 Koa 1.x 开发,但是在此基础上,Egg 全面增加了 async function 的支持,再加上 Egg 对 Koa 2.x 的中间件也完全兼容,应用层代码可以完全基于 async function
来开发。
底层基于 Koa 1.x,异步解决方案基于 co 封装的 generator function。
官方插件以及 Egg 核心使用 generator function 编写,保持对 Node.js LTS 版本的支持,在必要处通过 co 包装以兼容在 async function 中的使用。
应用开发者可以选择 async function(Node.js 8.x+) 或者 generator function(Node.js 6.x+)进行编写。
Egg 2.x
Node.js 8 正式进入 LTS 后,async function 可以在 Node.js 中使用并且没有任何性能问题了,Egg 2.x 基于 Koa 2.x,框架底层以及所有内置插件都使用 async function 编写,并保持了对 Egg 1.x 以及 generator function 的完全兼容,应用层只需要升级到 Node.js 8 即可从 Egg 1.x 迁移到 Egg 2.x。
底层基于 Koa 2.x,异步解决方案基于 async function。
官方插件以及 Egg 核心使用 async function 编写。
建议业务层迁移到 async function 方案。
只支持 Node.js 8 及以上的版本。
还没有评论,来说两句吧...