希望这篇文章能给大家在Node.js后端框架的选择上带来一些帮助。JavaScript语言的设计虽然受到很多人的诟病,但由于占据浏览器且使用方便,因此广受欢迎。后来随着Node.js的出现,npm包管理带来的强大生态如虎添翼(截至2017年3月,npm共有43万个包)。但这也造成了JS社区的异常快速迭代。大家都说跟不上了。框架太多,选择太多,眼花缭乱。下图是Node.js开发框架在2016年的发展势头排名(根据Github上2016年增加的star数)。有关上图的更多详细信息,请参阅2016年JavaScript新星。提示:您可以通过网站npms.io快速了解npm包的质量。更多关于如何判断一个包的好坏可以参考《如何挑选高质量的 Node.js 模块?》下面是基于上图对各个框架的简单介绍。令Meteor感到惊讶的是,上述2016年JavaScript新星并未包括Meteor。Meteor是目前Github上star最多的Web应用程序开发框架。请注意,它不限于JS范围。它已经超越了Ruby的Rails和PHP的Laravel。(参考GithubwebappframeworksRank)。当然,星星的数量并不能说明全部问题。Meteor最近没有活跃,这可能是他们团队忙于开发基于GraphQL的Apollo框架的原因。(推荐大家关注Apollo,会给前后端交互带来很大的创新)。Meteor是一个有点“异构”的全栈框架。首先,它使用WebSocket代替HTTP进行前后端通信,所以实时性非常好,但它不是REST框架,虽然可以通过简单的改造提供RESTfulAPI;其次,Meteor绑定了MongoDB,让喜欢关系型数据库的同学爱不释手。但是现在Meteor也可以使用Apollo与关系型数据库进行交互,比REST架构更加方便。但阿波罗仍处于开发阶段。Express和Koa是Node.js最基本的两个后端框架。因为太基础了,做一个app还是要写很多脚手架的代码,所以在它们之上出现了很多其他的框架来减少写这样的代码。Express应该是装机最多的,而Koa比较新,使用了更多新颖的技术,比如promises和asyncfunction,不再有回调函数嵌套的问题。Feathers.JSFeathers.JS建立在Express4.0的基础上,Express的中间件可以直接在Feathers中使用。Feathers的另一个特点是兼容WebSocket的实时和HTTP的REST。但请注意,用户认证默认使用JWT而不是传统的session。我觉得JWT更适合比较大的项目,比如需要调用API的移动端。节点和PostgreSQL绑定。我对这个框架不熟悉,感觉是为云服务商stdlib.com定制的一个比较封闭的框架。KeystoneJSKeystoneJS是一个CMS框架,有点像PHP的Drupal,功能全面,适用于后台管理和内容管理。内置的用户管理功能非常方便。LoopBackLoopBack是StrongLoop基于Express开发的开源框架。前年被IBM收购。这是一个大而全的企业级框架,适用于多终端、与其他后端服务集成的场景。这篇文章解释了为什么LoopBack不流行?.主要观点是目前在大型系统中Java框架仍然是主导体系,Node.js更多的应用在前端和中间层。很多人拿它和hapi比较,因为都是用来开发RESTfulAPI的。我个人认为,LoopBack之所以不流行,是因为它的限制性有点太强,没有hapi那么灵活,更适合现在快速迭代的开发方式。从名字上看,Sails和Trails应该都是从Ruby的Rails学来的MVC框架。我以前没有用过Rails,所以对它们了解不多。估计适合RubyonRails转过来的同学。从名字可以看出,hapi和restify是构建RESTful服务的框架,适用于后端为微服务的架构。两人个人比较喜欢hapi(来自沃尔玛团队),这里安利一篇中文hapi文章。个人推荐这个框架来开发面向服务的API。Egg阿里巴巴开源(据说不是KPI开源项目)Egg.js号称是企业级框架和应用。它有点像Feathers,但基于Koa;并且与Feathers不同的是,Egg没有自带认证功能,使用的是cookie/session认证。详见阿里开源企业级Node.js框架egg如何评价?.感觉是一个不错的企业级Node.js框架。理念先进,功能齐全。Gatsby和Hexo静态站点生成。适用于文档和博客站点。加载速度比动态网络应用程序快。基于React,Gatsby比Hexo更新且维护更好。那么,那么多的框架该如何选择呢?关键看你的应用场景。您需要单体应用程序还是微服务?需要什么样的认证和授权?数据库偏好?说说我的浅见吧。刚开始尝试Node.js,学习Express,Koa如果只是想尝试学习Node.js开发后端服务,建议从Express入手,因为够简单,而且是基础许多其他框架,并且易于扩展。如果你熟悉JavaScript中的promises和async,你也可以从Koa入手。开发内容管理网站,简单的后台管理用Keystone,不介意用MongoDB的就用Meteor。如果你想开发一个不太复杂的内容管理应用,比如一些频繁更新内容和图片的网站,以及用户权限等后台管理,那么KeystoneJS是一个很好的选择,因为它已经内置了很多这样的功能。Meteor当然也适合。企业应用首选EggFeathers和Egg适合开发企业应用。日志、安全、多进程通信都有解决方案,很方便。Feathers中文文档少,使用Express和JWT,主打实时交互;Egg是阿里开发的,使用的是Koa,感觉更适合国内企业应用开发。使用Meteor的实时Web应用程序如果您想开发涉及聊天、IoT功能的实时应用程序,那么Meteor和Feathers是合适的。hapi是构建微服务RESTAPI的首选如果你想开发一些简单的微服务后端,那么hapi和restify比较合适。如果是一个大型的复杂应用,甚至是建立在现有的微服务之上,那么LoopBack可能是一个不错的选择,它可以将很多服务粘合在一起。它还可以与StrongLoop的API网关结合使用。静态网站生成首选Gatsby,不使用React则使用Hexo。最后建议大家在选择的时候不要太纠结,差不多就好了。因为不可能在项目一开始就想好所有的事情,关键是大方向,快速出MVP。根据多年的经验,一个项目要么死得很快,要么幸存下来被重写。使用哪一个并不重要,只需选择一个并开始工作即可。
