首页 存档 技术 查看内容

你们是不是想看框架大战?

2018-3-30 13:00 |来自: 互联网 410 0

摘要: 本文先从具体应用场景对会先概述 Node.js 的应用场景,各种框架比较(express、koa、thinkjs、hapi、restify、meteor、sails、egg 等),最后给出技术选型和框架选型技巧。先从具体应用场景对各种框架进行比较,再给 ...

本文先从具体应用场景对会先概述 Node.js 的应用场景,各种框架比较(express、koa、thinkjs、hapi、restify、meteor、sails、egg 等),最后给出技术选型和框架选型技巧。先从具体应用场景对各种框架进行比较,再给出技术选型和框架选型技巧。
作者介绍

前言

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 等),最后给出技术选型和框架选型技巧。

Node.js 的应用场景


这是现代 web 里 Node.js 参与的部分。其实 Node.js 的应用场景,远远不止这些,目前都用的比较浅,大部分围绕在前端和 Proxy 层,这其实是不够的,但由于历史原因,很多遗留问题,目前 Node.js 只能先搞定前端,然后做 Proxy 层,然后继续在 Proxy 组装 rpc 服务,让 Java 等专注提供服务就好,这是一个理想的边界,对 Node.js 和 Java 来说是双赢的,将服务组装和 api 交给 Node.js 能够更灵活、应变,当线上系统遇到崩溃的时候,前端直接改就好了,同时又不影响 Java 优点的使用。

Node.js 能干什么?

  • 网站(如 express/koa 等)

  • im 即时聊天 (socket.io)

  • api(移动端,pc,h5)

  • http proxy(淘宝首页)

  • http proxy 延伸,组装 rpc 服务,作为微服务的一部分

  • 前端构建工具 (grunt/gulp/bower/webpack/fis3...)

  • 写操作系统(NodeOS)

  • 跨平台打包工具(nw.js、electron、cordova/phonegap)

  • 命令行工具(比如 cordova)

  • 编辑器(atom,vscode)

更多的见 https://github.com/sindresorhus/awesome-nodejshttp://stackshare.io/nodejs/in-stacks

异步流程演进

这里加异步流程演进部分,目的是为了后面讲述框架变化做铺垫,同时异步流程控制也是 Node.js 非常核心的内容,是每个开发者都必须掌握的。

JavaScript 流程控制的演进过程,分以下 6 部分:

  1. 同步代码

  2. 异步 JavaScript: callback hell

  3. Thunk

  4. Promise/a

  5. 生成器 Generators/yield

  6. Async 函数 / Await(以前说是 ES7 stage-3)

看起来挺简单的,作为 * js(沾边)工程师的各位自测一下,当前是哪个阶段?我对异步流程控制的总结:

  • Async 函数是趋势,如果 Chrome 52. v8 5.1 已经支持 Async 函数 (https://github.com/nodejs/CTC/issues/7) 了,Node.js 已经支持,Node.js 7.x 版本需要加 flag 才能开启,在明年的 8.x 里会默认开启。

  • Async 和 Generator 函数里都支持 promise,所以 promise 是必须会的。

  • Generator 和 yield 异常强大,不过不会成为主流,所以学会基本用法和 promise 就好了,没必要所有的都必须会。

  • co 作为 Generator 执行器是不错的,它更好的是当做 Promise 包装器,通过 Generator 支持 yieldable,最后返回 Promise,是不是有点无耻?

我整理了一张图,更直观一些。

红色代表 Promise,是使用最多的,无论 async 还是 generator 都可用

  • 蓝色是 Generator,过度货

  • 绿色是 Async 函数,趋势

结论:Promise 是必须会的,那你为什么不顺势而为呢?

推荐:使用 Async 函数 Promise 组合,如下图所示。

Web 框架大战
Express or Koa?

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) =

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部