Node.js 从 2009 横空出世之后,至今已经 7 年有余,各种 web 框架也林林总总,目前大约在 npm 上有 35 万左右包,刨去前端和一些无意义的封装,也是有非常可观的优秀的模块的。其中 web 框架也是特别抢眼的,从早期的 express 到现在 koa,对异步流程控制的改进前仆后继。 随着移动端崛起面向 api 的框架 hapi 和 restify 也如火如荼,更有一些面向特性的框架,比如 thinkjs 对 es6/es7/typescript 支持,整体来说,质量都是非常不错的,算百花齐放,还是那句话,即使不优化,你也能用这些框架获得较高的性能。本文先概述 Node.js 的应用场景,各种框架比较(express、koa、thinkjs、hapi、restify、meteor、sails、egg 等),最后给出技术选型和框架选型技巧。 这是现代 web 里 Node.js 参与的部分。其实 Node.js 的应用场景,远远不止这些,目前都用的比较浅,大部分围绕在前端和 Proxy 层,这其实是不够的,但由于历史原因,很多遗留问题,目前 Node.js 只能先搞定前端,然后做 Proxy 层,然后继续在 Proxy 组装 rpc 服务,让 Java 等专注提供服务就好,这是一个理想的边界,对 Node.js 和 Java 来说是双赢的,将服务组装和 api 交给 Node.js 能够更灵活、应变,当线上系统遇到崩溃的时候,前端直接改就好了,同时又不影响 Java 优点的使用。 Node.js 能干什么?
更多的见 https://github.com/sindresorhus/awesome-nodejs 和 http://stackshare.io/nodejs/in-stacks 这里加异步流程演进部分,目的是为了后面讲述框架变化做铺垫,同时异步流程控制也是 Node.js 非常核心的内容,是每个开发者都必须掌握的。 JavaScript 流程控制的演进过程,分以下 6 部分:
看起来挺简单的,作为 * js(沾边)工程师的各位自测一下,当前是哪个阶段?我对异步流程控制的总结:
我整理了一张图,更直观一些。 红色代表 Promise,是使用最多的,无论 async 还是 generator 都可用
结论:Promise 是必须会的,那你为什么不顺势而为呢? 推荐:使用 Async 函数 Promise 组合,如下图所示。 Express 是 Node.js 世界里最著名的框架,非常成熟、稳定,目前也是大家用的最多的框架。 先看一下演进的历史,最早是有 connect,一个中间件框架,是对 Node.js 内置的 http 模块的补充,主要是提供了中间件机制。然后有了 express,在 express 4.0 之前都是内置 connect 作为中间件内核的,在 4.0 之后就剔除了 connect,express 自己实现中间件机制,但兼容 connect 系列的中间件,所以很多书(比如 Node.js in action)介绍 http 之后介绍 connect 之后介绍 express,虽然 Node.js 版本老点,当整体来看,说不过时的。 在 express 下一个版本里 router 也会被独立出去,但 2 年了,迟迟未发,中间颇为周折,最开始是 tj 名下的,后来 tj 象征性的转让给 strongloop,但是转过去之后并不是很愉快,导致很多人呼吁独立,毕竟商业公司和开源不一样,所以就转到 express org 下面,独立了,由 dougwilson 一直维护。express 的代码和测试都非常不错,大家可以看看,尤其是测试,会扒出无数没有遇到的场景,是学习的非常的途径。 说完了 express 再说说 Koa,koa 仍然是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。一个追求极致的框架,代码大约只有 550 行。对 express 基本上是 0 兼容,无论是中间件,还是用法、异常处理等,标新立异的让了解 express 的人咋舌,但破旧才能立新,也未尝是坏事。 Koa 最初是利用 generator 来实现异步控制,让代码在 generator 里看起来像同步调用,这其实是 tj 对 generator 的 hack 用法,后来还衍生出了 co 这个很有名的库,koa 1.x 就是基于 co generator 作为核心的。 用了 generator 就会有一个问题,generator 里只能使用 this 来处理上下文,所以 this 肆虐,到处都是。另外一个问题就是有 generator co 导致 koa 的中间件和 express 中间件完全不一样,应该这样说,是强大了很多。这就是 koa 经典的洋葱模型 - 中间件机制,和 Django Middleware 非常像。 它可以出来请求之前和请求穿过中间件后回来的请求,这样的便利非常大,代码精简,异常等都能有更好的处理。 但 this 的问题还是很头疼,而且还要支持 async/await,于是就有 koa 2.x,为了把 koa 的中间件改写,koa 团队改变了 co 为 promise-based 模式,继而提供 co.wrap 处理 generator,同时又提供了 compose 将中间件转成 (ctx,next) = |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|