作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
杨楚贤的头像

Chuoxian杨

chuxian是一名全栈开发者和科技公司创始人,从蓝图到发布,他建立了多个大型项目.

以前在

黑刺李
分享

JavaScript无疑是近年来最流行的语言之一, 由于对web应用程序的巨大需求. 在为多个浏览器编写代码时,JavaScript几乎是前端开发人员的唯一选择. 有人可能会说,有CoffeeScript、TypeScript或Dart可以替代. 然而, 事实是,CoffeeScript主要被视为一个语法糖,最终归结为JavaScript. TypeScript只是JavaScript的一个超集,它包含了几个面向对象的语言特性, 例如可选的静态类型, 类和接口, 它还处于早期阶段. Dart也是一种面向对象的语言,具有类似c的语法, 但它仍然可以在主流浏览器上编译成JavaScript.

随着的诞生而迅速成长 节点.js, JavaScript不再局限于前端开发. 随着节点的引入.Js后端框架,后端开发不再是前端编码人员的火箭科学. 人们倾向于认为JavaScript是适用于所有情况的灵丹妙药:前端, web服务器, 桌面应用程序, 嵌入式系统, 数据库……这个列表越来越长. 事实上,考虑到JavaScript的广泛受众,节点.js+MongoDB+AngularJS/React已经造就了相当多的全栈web开发人员. 然而,节点.Js被设计成轻量级的,并且只提供作为web服务器的基本功能,以提高web应用程序的开发速度. 在现实世界中,作为npm包提供的一个好用的框架可能是一个更好的选择.

在这篇文章中,我们将介绍一些众所周知的和经过时间考验的方法 节点.js框架 这让开发者不再需要一次又一次地重新发明轮子. 更具体地说,在本文中,我们将看看表达, 洋槐, 流星和帆.js. 而不是试图弄清楚这些框架是如何相互叠加的, 我们将看到这些框架各自擅长的关键领域,以及它们如何与各种项目需求相关.

表达:一个极简节点.js Web框架

那是不用说的 表达 对节点来说最大的交易是什么.js业务. 每个节点.Js的玩家已经听说过它,并且有意无意地使用它. 它目前是第四代,有相当多的节点.基于它或受其概念启发而构建的Js框架.

表演。

大多数开发人员都喜欢节点.Js的原始速度, 当涉及到框架选择时, 完美主义者可能不屑于任何表现上的危险. 表达在节点之上提供了一个薄层.带有web应用程序特性(如基本路由)的Js, Middleware, 模板引擎和静态文件服务, 因此,节点的I/O性能非常出色.Js不会妥协.

表达是一个最小的、不固执己见的节点.js框架. 它不应用任何流行的设计模式,如MVC, 最有价值球员, MVVM之类的东西很流行. 对于崇尚简约的人, 与所有其他框架相比,这是一个很大的优势,因为您可以根据自己的喜好构建应用程序,而且没有不必要的学习曲线. 这在创建没有历史负担的新个人项目时尤其有利, 但随着项目或开发团队的成长, 缺乏标准化可能会导致额外的项目/代码管理工作, 最坏的情况是它可能导致无法维持.

发电机

尽管表达不是一个固执己见的节点.Js框架中,它有生成特定项目文件夹结构的生成器. 在安装 express-generator NPM包和使用生成器命令创建应用程序骨架, 将创建一个具有清晰层次结构的应用程序文件夹,以帮助您组织图像, 前端静态JavaScript, 样式表文件和HTML模板文件.

NPM install express-generator
表达hello应用程序

   创建hello应用程序
   创建:hello应用程序/package.json
   创建hello应用程序/应用程序.js
   创建hello应用程序/public
   创建hello应用程序/public/images
   创建:hello应用程序/routes
   创建:hello应用程序/routes/index.js
   创建hello应用程序/routes/users.js
   创建hello应用程序/public/stylesheets
   创建hello应用程序/public/stylesheets/style.css
   创建:hello应用程序/views
   创建:hello应用程序/views/index.玉
   创建:hello应用程序/views/layout.玉
   创建:hello应用程序/views/error.玉
   创建:hello应用程序/bin
   创建hello应用程序/bin/www

   安装的依赖关系:
     $ CD hello应用程序 && npm安装

   运行应用程序:
     $ DEBUG=hello应用程序:* npm start

   创建:hello应用程序/public/javascripts

Middleware

Middleware基本上就是对请求和响应对象都有完全访问权限的函数.

请求处理堆栈

顾名思义, Middleware在将控制移交给实际业务逻辑或下一层Middleware之前应用一些过滤指令. 一些常见的任务包括检查用户登录状态, 验证用户权限, 或者防止跨站攻击最好提取为Middleware.

Var 应用程序 = express();

应用程序.使用(cookieParser ());
应用程序.使用(bodyParser ());
应用程序.使用(记录器());
应用程序.使用(身份验证());

应用程序.Get ('/', function (req, res) {
  // ...
});

应用程序.听(3000);

表达应用程序本质上是节点.Js和一系列Middleware函数, 无论您是想定制自己的Middleware还是利用框架的内置Middleware, 表达使这个过程自然而直观.

模板引擎

模板引擎允许开发者将后端变量嵌入到HTML文件中, 当被请求时,模板文件将被渲染为纯HTML格式,并插入变量的实际值. 默认情况下, express生成器使用Pug(最初称为Jade)模板引擎, 但其他选项,如Mustache和EJS,也可以与表达无缝协作.

数据库集成

作为一个最小框架, 表达不认为数据库集成是其包中的必要方面, 因此,它倾向于不使用任何特定的数据库. 同时采用特定的数据存储技术, MySQL也好, MongoDB, PostgreSQL, 复述,, Elastic搜索之类的, 只需将特定的NPM包安装为数据库驱动程序即可. 这些第三方数据库驱动程序在执行CRUD指令时不遵守统一的语法, 这使得切换数据库变得非常麻烦并且容易出错.

洋槐:利用下一代JavaScript特性

洋槐是由表达背后的团队开发的, 它的目标是通过在核心中不捆绑任何Middleware来最小化极简表达. 除了没有Middleware之外,洋槐看起来与表达非常相似,轻量级且不固执己见. 然而,是什么让 洋槐 真正突出的是它通过使用ES6生成器特性完全抛弃了回调.

优雅的控制流程

Javascript是一种异步编程语言, 再加上语言本身的这种本能和节点的单线程事件驱动机制.Js,回调无处不在,因此有了臭名昭著的回调地狱.

扁平化回调嵌套的一种方法是使用异步.js. 异步.Js提供了映射技术, 并行化, 序列化或迭代多个函数,而不必将一个函数嵌入另一个函数,然后用回调函数传递控制流, 一个回调函数和一个错误处理函数对于由异步组合在一起的大量函数已经足够了.js方法. 然而,异步.Js不能完全清除回调. 写节点时.使用异步 . js编写代码.在Js中,代码的缩进仍然倾向于向右移动,只是没有那么深.

逃离回调地狱

另一种更简洁的方法是使用then-able Promises. 一些有名气的第三方Promise库是bluebird和q. 在JavaScript的最新版本ES6中,Promise已经成为一种标准. 长话短说, Promise通过将实现块/函数与一堆Promise " then "函数连接起来,保证函数以顺序的方式执行和返回. 您可以在每个实现块/函数的末尾“解析”,以便执行下一个“然后”函数, 或者“拒绝”以下实现,以便控制流直接跳转到错误处理. 这种方式, 将所有错误处理函数聚集到一个地方,并彻底消除回调.

现在ES6带来了一个改变游戏规则的东西——ES6生成器. 这个概念对JavaScript来说是新的,但在编程世界中并不新鲜. ES6生成器就像C中的中断, 而不是从上到下运行代码行, ES6 发电机 introduces a means to run->halt and run something else->come back to finish what is leftover.

洋槐利用ES6生成器提供了一种优雅的方式来处理JavaScript异步编程, 类中看不到回调 高雅的应用程序. 在洋槐中,ES6 发电机的一个典型用例是Middleware级联, 哪一种Middleware可以让定制Middleware一个接一个地执行,而不需要任何讨厌的回调.

Var 应用程序 = koa();

函数* responseTimeLogger(下){
  var start =新的日期;
  收益率下;
  var ms = new日期开始;
  控制台.日志(这.Method + ' ' + this.Url + ': ' + ms);
}

应用程序.使用(responseTimeLogger);

// ...

应用程序.听(3000);

我们不能妄下结论,断言这种尖端技术优于老式解决方案(如异步).js, 承诺或事件发射器, 但有一件事是肯定的,这个新概念确实需要一些时间来适应. 由于控制流顺序非常规,给代码调试带来了额外的困难.

流星: Web、移动和桌面框架

流星是一个一体化的JavaScript框架. 区别于表达和洋槐的简化哲学, 它走向了另一个极端,将自己定义为全栈框架, 一个完整的包 这包括服务器、移动、桌面和网络应用.

我为人人包

如果仔细观察,您会注意到流星实际上是节点.js科尔多瓦+火焰/ AngularJS /反应+ + MongoDB. 节点.. js和MongoDB分别负责服务器端业务逻辑和数据存储. Blaze、AngularJS或React中的一个负责前端UI. 和科尔多瓦, 作为移动混合应用中最著名的HTML解决方案, 桥的网页移动视图.

数据同步

后端和前端数据共享的主流流程如下:

  • 客户端请求数据或某些HTML视图
  • 服务器从数据库中检索数据, 使用一些模板引擎将数据与HTML视图混合,并将其发送回前端
  • 客户端以用户友好的方式呈现和显示数据/视图

现代的单页web应用程序稍微调整了一下上述过程. 以AngularJS为例, 它将HTML模板作为静态文件与其他资产(如前端JavaScript文件)放在一起, 样式表和图像. 然后,AngularJS通过使用Ajax RESTful API向后端请求数据,将数据填充到HTML模板中. 无论哪种方式, 后端开发人员完全负责处理来自前端的数据更改请求,并将更改保存在数据库中.

自动完成双向数据同步

流星区别于其他框架的特性之一是它在服务器和前端/移动应用程序之间的数据同步机制. 在流星, 客户端持有一个小型数据库影子副本,它是服务器数据库复制的一小部分, 先前由客户端请求并由服务器授权的部分. 当客户端希望对数据进行任何更改时, 它使用一致的数据库API作为服务器端来执行任何CRUD指令, 然后数据更改将自动发送到服务器并保存在实际的数据库中. 当服务器检测到任何数据修改时, 它将更新的数据推送到订阅这些数据的特定客户端. 这种双向数据同步是自动完成的,无需任何人工干预. 为了创造这种魔力, 流星使用Web套接字在底层连接客户端和服务器,以便一端的任何数据更改都会立即反映到另一端.

构建自动化工具

流星不仅负责服务器和web应用程序, 使用流星的构建工具Isobuild 科尔多瓦, 一个将HTML/JavaScript/CSS与原生移动功能捆绑在一起的库, 流星让构建iOS和Android应用变得轻而易举. 生成的移动应用程序是在WebView中运行JavaScript或显示HTML页面的混合应用程序. 与原生移动应用相比,这种解决方法可能会损害一些用户体验, 但对于许多人来说,能够在web应用程序的相同代码库下管理这一切是一个相当大的卖点, 它节省了大量的开发成本.

总的来说,流星是一个高度自动化的框架. 这种高级自动化使开发人员的工作更加轻松, 然而,它的代价是损害性能和可伸缩性限制. 随着用户基数的增长,自动数据同步技术成为扩展的瓶颈. 实现与其他手动调优后端技术相同的容量和性能, 流星通常会消耗更多的服务器硬件和带宽资源. 所以,如果你想为所有主流平台创建项目原型,那么流星将是一个很好的起点和完美的工具箱, 但最终,如果原型成为具有足够客户基础的产品项目,则必须以更专业的方式重新设计系统架构.

帆.节点的高级MVC框架.js

帆.js 与表达有许多相似之处. 它是一个项目生成器、Middleware和模板引擎. 实际上,它是建立在表达之上的,加上一些更高级别的功能来加快开发速度.

MVC

模型视图控制器

帆.js从核心开始采用模型-视图-控制器的设计模式. 对于那些来自Ruby on Rails或Laravel的人来说,他们会找到帆的结构.Js应用太熟悉了. Model表示反映数据库表/集合模式的数据模型, 视图是填入数据的HTML视图, 控制器是放置所有服务器端业务逻辑的地方,并充当数据和视图之间的粘合剂.

实时通信

不像HTTP请求,客户端每次都必须查询服务器数据, 或者长轮询连接,这会使服务器处于空闲模式, 套接字.IO在客户端和服务器之间建立了基于事件的双向通信. 帆.js集成套接字.io并将其包装成一些更高抽象级别的API,以提供更多的便利, 这样就形成了帆.Js特别适合创建聊天应用程序或多人游戏.

数据库ORM

数据库ORM

在后端逻辑和实际的数据库操作之间,有一个称为水线的中间ORM层. 简单地说, 这个ORM工具提供了一致的语法来访问不同的数据库,而开发人员不必担心不同的数据库查询语言, 比如SQL vs NoSQL, 模式vs无模式等等.

帆.Js具有中级自动化程度. 它专注于服务器端逻辑,并且已经为生产做好了准备, 它提供了比表达更快的开发速度,而不会牺牲任何性能或未来的可伸缩性. 特别是对于大量的MVC模式爱好者,帆.Js具有相当平滑的学习曲线.

总结

本文将详细介绍一些最好的节点.js框架. 而不是提供一个节点.js框架的性能比较和不同节点的排名.js框架, 它列出了每个框架的亮点,以便从人群中脱颖而出,从而提供帮助 节点.js开发人员 在从头开始构建项目时,选择最适合的工具箱.

那么是哪个节点.你喜欢Js后端框架吗? 除了我们上面讨论的框架之外,您是否更喜欢其他框架? 请在下面的评论区告诉我们.

聘请Toptal这方面的专家.
现在雇佣
杨楚贤的头像
Chuoxian杨

位于 长沙,湖南,中国

成员自 2016年3月4日

作者简介

chuxian是一名全栈开发者和科技公司创始人,从蓝图到发布,他建立了多个大型项目.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

以前在

黑刺李

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

Toptal开发者

加入总冠军® 社区.