koa实战,koa2能干嘛呀

koa实战,koa2能干嘛呀,koa2 从入门到精通(小结)

本文主要介绍koa2从入门到精通。通过示例代码进行了非常详细的介绍,对大家的学习或工作有一定的参考价值。有需要的朋友下面和边肖一起学习。

Koa发布快六年了,作为继express之后的节点服务框架最大黑马,有很多设计思路值得借鉴。本文从简单到复杂一步步介绍koa,适合新手老手阅读。

介绍

这里有一段引自中文原版网站的话。

Koa是一个新的web框架,由Express背后的原始团队创建,致力于成为web应用和API开发领域更小、更具表现力和更健壮的基石。通过使用异步函数,Koa可以帮助您放弃回调函数,并大大增强错误处理。Koa没有捆绑任何中间件,而是提供了一种优雅的方法来帮助您快速愉快地编写服务器端应用程序。

既然是web框架,就要熟悉。通过启动一个节点http服务器并监听一个端口,我们可以通过类似localhost:3000的东西在本地访问我们的服务。这个服务可以是网站、restful接口、静态文件服务等等。

Hello Word

任何语言或框架中都有一个Hello Word示例来表达其最简单的介绍性演示,代码如下

此时,访问浏览器localhost:3000,我们会看到Hello Word被打印出来。此时,一个基于koa的服务启动并完成。

上下文

理解koa的第一步是理解上下文的作用。

比如微信群里有人说外面在下雪,但你跑到窗前,看到万里晴空。然后你才意识到,那也是十月,他在寒冷的北方,你在炎热的南方。

类似地,一个请求将包含用户的登录状态,或者令牌之类的信息,这是上下文的一部分,用于确定请求的环境。

Koa的上下文将节点的请求、响应对象封装到一个对象中,并为开发web应用程序和API提供了许多有用的方法。那些在HTTP server开发中经常用到的,直接在Koa中实现,而不是放在更高层的框架中,这样中间件就不需要重复实现这些常用的功能。

中间件

我们先来看一个官方的例子:

简单解释一下,代码一开始初始化一个koa实例,下面三个中间件方法分别通过use方法加载,执行顺序如下:

进入第一个中间件next()跳到下一个中间件new Data()记录当前时间next()跳到下一个中间件。将ctx.body赋给之前的中间件,再次记录当前时间并计算时差,存储在http头中。回到前面的中间件,在头中打印X-Response-time。

这里的执行序列扩展了经典的洋葱模型。

在一个请求的过程中,我们将通过同一个中间件来回两次,从而允许我们处理不同请求阶段的逻辑。

源码解析

上面介绍了koa中最重要的两个概念。我们来分析一下koa是如何工作的,所谓的洋葱模型是如何建立的。

koa源代码的lib目录很简单。

解放运动

|- application.js

|- context.js

|- request.js

|- response.js

Application 类初始化

入口文件是application.js让我们从这里开始。

应用程序是一个类。这个类继承了node的事件,这里不详细展开。以下内容在构造函数中初始化:

默认情况下,代理不打开

中间件中间件是空数组,这里注意一下。

根据环境变量NODE_ENV。

Context、request、response分别通过Object.create方法将lib目录下对应的文件导入到这个当前上下文中,不要污染导入的对象。

use 方法

按照正常的编码顺序,koa实例初始化后(即const app=new Koa()),我们需要调用app.use()来挂载我们的中间件,那么我们来看看use方法是做什么的。

判断中间件是否是功能性的,简单地将中间件功能推入中间件阵列。

此时你心中有什么资本吗?

其实就是这么直白,也没有什么复杂的逻辑。你们可能都猜到了,中间件中的方法被循环调用来执行它。这里,没有显示洋葱模型是如何产生的。先不展开,继续按代码顺序执行。

listen 方法

按照正常的编码顺序,用了我们的中间件之后,就是app.listen(3000)。

让我们来看看这个监听器做了什么。

这里http.createServer是节点原生启动http服务的方法。这里稍微扩展一下基础知识。该方法接受两个参数。

options[传入消息,服务器响应]只有在节点版本v9.6.0,v8.12.0之后才支持,这里不再赘述。

RequestListener这个参数是函数类型,每个请求中传递两个参数REQ和RES。

不难理解,这里的this.callback()方法一定是返回了一个函数,接收了两个参数(req,res)。让我们看看源代码。

这个回调的信息量有点大,代码本身也不难理解,注释也有说明。从这里开始,自上而下的解释。

compose 方法

这里的compose方法主要负责生成洋葱模型,由koa-compose包实现。源代码如下

从评论中可以看出大致的逻辑,这里的精妙之处在于fn (context,dispatch.bind (null,i 1))。

这个dispatch.bind(null,i 1)是我们通常编写中间件的第二个参数。

当我们执行这个next()方法时,我们实际上获得了下一个中间件的执行。

这就不难理解为什么我们在等待await next()的时候,会等待后面的所有中间件都串行执行。回头看看上面中间件部分的执行顺序,就豁然开朗了。

createContext 方法

展开callback中的解释,看看const CTX=this . create context(req,res)做了什么。

这里req、res、this.request、this.response都挂载在上下文上,通过赋值明确了循环引用层次,为用户提供了方便。

handleRequest 方法

或者回调里的扩展解释。看看this.handleRequest(ctx,fn)是做什么的。

分别获取ctx和compose生成的洋葱模型,开始逐个消耗中间件。

context.js 文件

以上阐明了总体框架。让我们来看看context.js的内部细节,在文件的最后有两大段代理。

这里可以看到req和res的所有方法,所以哪些方法是可读的,哪些是可写的,哪些是既可读又可写的,哪些方法是不允许修改的。

这就是代表图书馆的工作。

委托在内部使用__defineSetter__和_ _ define setter _ _方法来控制读写。当然,我们可以从中学习理念,不能盲从。

通过这两个API在MDN上搜索将给出相同的警告消息。

不赞成使用此功能,而赞成使用对象初始值设定项语法或Object.defineProperty() API来定义setters。

其实建议我们用Object.defineProperty(),vue的代理方法。但是这个库已经四年没有更新了,依然稳定运行,依然得到了koa开发者的认可。

其它

request.js和response.js文件没什么可说的,只是实现了具体的工具和方法,方便开发者调用。有兴趣的可以自己看源代码。

应用

智联前端架构的整个节点服务都是基于koa的,包括我们的vue服务器渲染和节点restful api等。

之所以选择koa,是因为它轻量级,可伸缩,支持async和await的异步,彻底摆脱回调地狱。

也有成熟的基于koa2的企业级解决方案,如eggjs、thinkjs等。

总结

揭开koa的神秘面纱,让开发者关注业务逻辑以及框架本身,有利于问题调查和写作拓展。同时可以学习express和hapi等价框架的思想,结合现有的企业级解决方案,选择适合自己的框架。总之,不管框架是好是坏,只讨论场景。

这就是本文的全部内容。希望对大家的学习有帮助,支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: