- 狼书(卷2):Node.js Web应用开发
- 狼叔
- 872字
- 2025-02-20 23:08:40
1.3.4 新兴Web开发框架Koa
前面介绍了从http模块到Connect再到Express的演进过程,目的就是让大家能够对Node.js Web框架的发展有一个好的大局观。相比较而言,Koa是一个更年轻、更有前途的Web框架。
➘ 你好,Koa
和Express非常类似,Koa其实也对原始的http模块进行了抽象,只是中间件形式不一样,示例如下。

很明显,Koa把http.createServer里的内容封装到app.callback()里了。那么app.callback()里到底有什么呢?
○ app是Koa对象。
○ app.use里使用的是Koa中间件写法。
○ app.callback()把app.use里的内容转成了function(req,res){...}。
相信大家一定已经看出了差别,Koa和Express中间件写法的不一样之处在于,http.createServer()函数的参数不同,其他的部分几乎一模一样。
➘ 中间件对比
中间件是Web框架的核心,无论是在Express还是Koa的学习过程中,都应该重视它。写法和特性是相辅相成的,尤其是应用中常见的各种模块,绝大多数都是对中间件的封装。从http模块到中间件,这是一个非常好的演进路线。同样,从Express中间件进化到Koa中间件,也是非常重要的变革。
下面是Express中间件的经典写法。

相比之下,Koa中间件的写法显得更高级,具体如下。

对比以上两段代码,要点解读如下。
○ Koa中将req和res都绑定ctx上下文,这样语义上更清晰,扩展起来更容易。
○ Express中间件只能捕获单向的请求流,而Koa中间件可以双向拦截,在一个中间件里同时对req和res进行拦截能够让代码更加精简、高效。
○ 从语义上说,Koa中间件更明确一点,不过这不是绝对优势,毕竟Express也是可以使用async函数语法的。
➘ 多URL处理
使用Koa中间件来处理多URL也比较麻烦,和原始的http模块类似,示例如下。

那么为什么基于Express的多URL处理写法可以那么简单呢?其实是因为,Express内置了路由,而且它将路由方法和中间件结合在一起,最终绑定到了app对象上。
很不幸的是,Koa并没有内置这样的中间件,但社区里有非常多路由中间件的实现,比如前面在koa-generator里用过的koa-router。这里再介绍一个不一样的koa-trie-router,它是基于Trie树数据结构编写的。Trie树又被称为字典树、单词查找树或前缀树,是一种用于快速检索的多叉树结构,代码如下。

这里的use、get等方法实现,是不是跟Express里的用法很像?对于大部分程序开发者来说,用到数据结构的机会不多,但对于时常进行编写框架或阅读源码等深度定制的开发者来说,数据结构是基础,必须重视。