写点什么

koa2 快速入坑

  • 2019-09-15
  • 本文字数:2231 字

    阅读完需:约 7 分钟

koa2快速入坑

为啥入坑 koa2?


  • koa2 小而美,相比 express 更小、更健壮、更富有表现力;

  • 全面支持 ES6/ES7 语法;

  • 结构优雅,易于扩展,360 的 thinkjs,阿里的 egg.js 全部基于 koa2 开发,源代码只有 4 个文件,500 行代码;

  • 站在 2018 年的节点来看,Koa2 的学习大潮已经到来。

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

没有轮子的年代


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



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


英雄登场


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



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


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



他的自我介绍:


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


社区影响:


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


高产到令人发指,Quora 上甚至有人猜测 TJ 不是一个人,而事实上他就是一个人。


substack/npmtop:对 node npm 社区代码贡献截止目前占到整个社区的 3.04%。



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


初代英雄 Express 诞生



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


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


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




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


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


三代目 koa2




  • 函数式编程

  • 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 的中间件调用机制。源码阅读此处不具体展开,有兴趣可以阅读下。



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


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



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



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


著名的洋葱模型:



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



路由


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




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


静态资源服务


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



SSR 后端渲染


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


# 安装koa模板使用中间件 npm install --save koa-views# 安装ejs模板引擎 npm install --save ejs
复制代码




mongodb 数据库操作



MySQL 数据库操作



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


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


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


本文转载自公众号滴滴技术(ID:didi_tech)。


原文链接:


https://mp.weixin.qq.com/s/0KhR3on2kW8Mc-rkJzqT8Q


2019-09-15 23:181299

评论

发布
暂无评论
发现更多内容

java就业培训 | 面试官如何判断应聘者能力的,这一篇就够了

@零度

JAVA开发

5月券商App行情刷新及交易体验评测报告,四家券商综合评级上升

博睿数据

智能运维 博睿数据 券商排行

低代码如何“拯救”企业?

优秀

低代码 企业管理

个推TechDay直播预告 | 6月22日,开启大数据降本提效的破局之道!

个推

大数据 分布式计算 分布式存储 标签

级联层与层叠上下文了解下?

转转技术团队

CSS JavaScript 前端

如何编写一份简单易用的在线产品手册

小炮

产品宣传手册 产品说明手册

【LeetCode】多个数组求交集Java题解

Albert

LeetCode 6月月更

Open the World:第七届中国开源年会(COSCon'22)正式启动~

开源社

第七届中国开源年会 COSCon'22

InfoQ 极客传媒 15 周年庆征文|跨平台应用开发进阶(二十二) :uni-app Android APP上线准备工作汇总

No Silver Bullet

前端 签名 安全检测 6月月更 InfoQ极客传媒15周年庆

系统困境与软件复杂度,为什么我们的系统会如此复杂

阿里巴巴终端技术

软件 系统设计 软件开发

鲲鹏云开发者分论坛:发挥鲲鹏的潜力,加速云上创新

科技热闻

易观分析《计算机视觉市场研究,2022》研究报告正式启动

易观分析

人工智能

智慧园区效果不满意?请收下ThingJS这份秘籍

ThingJS数字孪生引擎

智慧园区 数字孪生

JMeter集成底座项目压测心得

agileai

压力测试 集成底座 企业服务总线 统一身份管理平台 主数据管理平台

Vue3 响应性原理

转转技术团队

JavaScript Vue 前端

2022年中国Robotaxi行业发展洞察

易观分析

智能汽车

一起认识下浏览器的5种观察器

转转技术团队

JavaScript 前端 浏览器

特定MPC问题包含哪些常见技术,有什么作用,什么场景需要用到?

Jessica@数牍

隐私计算 安全多方计算 特定mpc问题

网络安全实战从0到1彻底掌握XXE

网络安全学海

黑客 网络安全 安全 渗透测试 WEB安全

【6.10-6.16】写作社区精彩技术博文回顾

InfoQ写作社区官方

优质创作周报

Linux系统与Windows系统之间的文件上传与下载

龙空白白

Linux Windows系统

图搜的应用场景

Geek_e369a5

图像检测 图像搜索 图搜的应用场景

自己实现一个大文件切片上传+断点续传

转转技术团队

JavaScript 前端 文件上传

IntelliJ IDEA常见快捷键

龙空白白

IntelliJ IDEA

科创人·数智未来私董会第4期:转型的实证-幸存者偏差与盲人摸象

科创人

dp练习

工程师日月

6月月更

Mysql数据库查询好慢,除了索引,还能因为什么?

C++后台开发

MySQL 数据库 中间件 后端开发 C++后台开发

个推CTO趣谈元宇宙:从概念、成因到核心技术

个推

数据智能 元宇宙

编程技巧│浏览器 Notification 桌面推送通知

可视化 6月月更 Notification 实时通知

BI与SaaS碰撞,让数据处理更加轻松(下)

葡萄城技术团队

数据分析 SaaS BI

云安全是什么样子的?其工作原理是什么?

wljslmz

云安全 6月月更

koa2快速入坑_文化 & 方法_翟广鹏_InfoQ精选文章