本文作者:问几许

Egg.js 初学记录(一)

问几许 3年前 ( 2019-05-10 ) 1866 抢沙发
Egg.js 初学记录(一)摘要: 对于一个想成为全栈的前端工程师来讲,Node是必不可少的,写个服务端更是必须,想必大家都比较熟悉Express 和 Koa 这两个超火的框架,然后在两者挑选的时候,发现了一个Egg...

对于一个想成为全栈的前端工程师来讲,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 及以上的版本。


文章版权及转载声明

作者:问几许本文地址:https://wenjixu.com/blog/114.html发布于 3年前 ( 2019-05-10 )
文章转载或复制请以超链接形式并注明出处问几许

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享

发表评论

快捷回复:

评论列表 (暂无评论,1866人围观)参与讨论

还没有评论,来说两句吧...