koa2快速入坑指南

因为最近一个项目的原因,简单了解了koa2框架。为了帮助小伙伴们刚好的入坑,特整理此文。


为啥入坑koa2?

  • koa2小而美,相比express更小、更健壮、更富有表现力;
  • 全面支持ES6/ES7语法;
  • 结构优雅,易于扩展,360的thinkjs,阿里的egg.js全部基于koa2开发,源代码只有4个文件,500行代码;
  • 站在 2018 年的节点来看,Koa2 的学习大潮已经到来


Node.js技术栈Web服务框架的发展

一、没有轮子的年代

早期nodejs就提供了http服务的能力,当时人们已经开始尝试使用nodejs提供web服务,类似这样:

v2-0a1cd0583faa2ee88ee90c43d180db5f_b.jpg

没有轮子,高级一些的功能和用法全部需要自己编码实现。。。


二、英雄登场

为了降低人们的重复性劳动,更高效的使用nodejs搭建web服务,人们开始发明各种轮子。express是其中最流行的web框架,后来又出现了koa,koa2,hap。

v2-8902159846f89d7d964986fa732d85af_b.jpg

再后来,基于koa,又出现了一些企业级的开发框架,例如360的thinkjs,最近,阿里也开源了它的基于koa2的框架-egg.js。这也证明了koa框架本身结构分拆的优秀,然而,无论是express 还是 koa,这些框架都来自一人之手,TJ。

TJ何许人也,前端的小伙伴们可能了解这位大神。看下面这个图:

v2-cadc69e76f18b639ed620f36e9c357cb_b.jpg

他的自我介绍:

TJ Holowaychuk,程序员兼艺术家,Koa、Co、Express、jade、mocha、node-canvas、commander.js等知名开源项目的创建和贡献者。

社区影响:

nodejsmodules.org 第一页出现次数最多的那个少年,

高产到令人发指,Quora上甚至有人猜测TJ不是一个人,而事实上他就是一个人。
substack/npmtop:对node npm社区代码贡献截止目前占到整个社区的3.04%。

v2-76b8e9bcd93a584a53cc97e67d1c416d_b.jpg

好,膜拜完大神,我们继续看nodejs框架的发展。


三、初代英雄Express诞生

v2-6b20042db35090ad29592e4a7d39b310_b.jpg

Express 早期提供了web服务器各种常用功能的全家桶,提供了例如路由、表单解析等功能模块,中后期做了大量的拆分,将大部分模块都独立出来官方自行维护,或者是采用社区其他开发者提供的中间件模块。虽然进行了拆分,但Express总体来说是相对大而全,API 较为丰富的框架,并且它的整个中间件模型是基于 callback 回调,而 callback 随着逻辑增多,会出现callback hell的问题。

而且express对于中间件完全是顺序调用的,对于一些需要流程控制的场景,解决方案比较复杂。于是TJ大神开动异于常人的脑回路,设计了Koa。


四、二代目-Koa登场 - 我们不一样

v2-24eba6641953d7dccd8971b3d2fd4e6d_b.jpg


v2-5953521a588846e1c68d67473b8bfada_b.jpg

Koa 从一开始就选择了跟 Express 完全不同的架构方向。

首先Koa 与 Express 是在做同样事情上的不同实现,所以意味着他俩对外提供的能力大部分是相同的,我们看不同的地方:Koa 从一开始就是按照功能模块划分,各司其职。koa的 context,也就是 ctx,上面有很多引用,最核心的是 request 和 response,这俩可以对应到 Express 两个对立的 req 和 res,在 Koa 里面,把它俩都集中到 ctx 里面进行管理,分别通过 ctx.request 和 ctx.reponse 进行直接访问,原来 Express 两个独立对象做的事情,现在一个 ctx 就够了,上下文对象都在他手中,想要联系谁就能联系谁。 其次是它的中间件机制,Koa 真正的魅力所在,后面中间件环节,我们会对此进行介绍。


五、三代目koa2

v2-d72b93b9e6dcd0f4abfa9df30b5b1495_b.jpg


v2-442601c5946f21b3831a2bad6babf587_b.jpg

•函数式编程

•ES7官方标准异步方案:async/await


你值得拥有

目前的koa官方github已经全面的使用koa2版本的代码了,并且有一句非常重要的提示Koa requires node v7.6.0 or higher for ES2015 and async function support.。意思是说,koa需要至少node v7.6.0版本和ES2015(es6+async)才能使用。

koa2结合了async/await已经成为了最好的web开发框架。

Koa1 和 koa 框架模型,API基本相同,但是两者的中间件互不兼容,(底层实现不同),官方提供了方便的升级工具,可实现升级。


koa2框架定位:

  • 更小、更健壮、更富有表现力;
  • 免除重复繁琐的回调函数嵌套;
  • 极大地提升错误处理的效率;
  • 轻量、优雅,仅提供web服务最基础的函数库;
  • 通过中间件扩展实现不同的高级需求;

koa2的源码只有四个文件,500行左右。只提供封装好http上下文、请求、响应,以及基于async/await的中间件调用机制。源码阅读此处不具体展开,有兴趣可以阅读下。

v2-d1cea89671aa669ad341225b30b24f56_b.jpg


以下对koa2的语法进行简单介绍

首先是创建一个服务实例:

v2-eea78318053e9d7a4e7b191a6d3eca55_b.jpg

上图中,app.use(function)方法中的function就是一个最简单的中间件,通过多次app.use()方法可以在koa2框架中注册多个中间件。如下图所示:

v2-8dc5b6c578eb602ed120370d1c334ca9_b.jpg

与express最大的不同点,就是中间件再也不是顺序执行,而是类似洋葱和堆栈,先进后出的流程,这样可以提供更好的流程控制,例如日志处理。


著名的洋葱模型:

v2-d6a0ded3043d1e4ea3e4b27bf31295f0_b.jpg

以上代码请求结果如下图所示:

v2-f4f4e09467e5da9ca2978503db2925d5_b.jpg


路由

koa2本身不提供路由模块,但是通过引入独立的路由模块,就可以提供类似express的路由能力,代码如下图:


v2-99ed7f9beb0fc8d11909450a9bd50590_b.jpg

v2-6a7445fc3bae28861130ef89c4ff3194_b.jpg

以上方式实现了接口和业务逻辑的分离,可以提高业务逻辑代码的复用,职责分离。


静态资源服务

koa2通过引入独立的模块,可实现类似nginx的静态资源服务能力,如果不需要反向代理等能力,甚至都不需要部署nginx了。可参考以下代码:

v2-20c0eec5a39dc44cc20502d6b30d6330_b.jpg


SSR后端渲染

为了提高首屏加载速度,有时候需要进行后端渲染,koa2通过加载其他模块也可以支持,代码参考如下:

# 安装koa模板使用中间件 npm install --save koa-views

# 安装ejs模板引擎 npm install --save ejs

v2-9c47ca757276cb17a551b23fe0415c68_b.jpg

v2-89a7d5290cc96bd745dbfd31587a7b5c_b.jpg


mongodb 数据库操作

v2-eeffa80d0be92c13ec7b13ebc1fd91b1_b.jpg


MySQL 数据库操作

v2-0fbe22f4a9e89e6f8a28eb35462dbd59_b.jpg

以上,对koa2的一些常见语法给出了样例参考。

2018年koa2的生态系统已经比较完善,各大厂也基于koa2进行了封装,开源了一些面向工程和业务实践的框架,例如egg.js。

关于Koa2的讲解就先分析到这,希望对大家有所帮助。如有不同的看法,欢迎交流!


参考资料:

1、chenshenhai.github.io/k

2、zhuanlan.zhihu.com/p/26

3、dongliang1993.github.io

4、juejin.im/post/5a6dda1d


滴滴云官网:didiyun.com/?

滴滴云疯狂双十一,服务器最低35折起

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值