作者都是各自领域经过审查的专家,并撰写他们有经验的主题. All of our content is peer reviewed and validated by Toptal experts in the same field.
杨楚贤的头像

Chuoxian杨

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

以前在

黑刺李
分享

JavaScript has definitely become one of the most popular languages in recent years, 由于对web应用程序的巨大需求. While coding for multiple browsers, JavaScript is almost the only choice for front-end developers. One may argue that there’s CoffeeScript, TypeScript or Dart as alternatives. 然而, 事实是,CoffeeScript主要被视为一个语法糖,最终归结为JavaScript. TypeScript只是JavaScript的一个超集,它包含了几个面向对象的语言特性, 例如可选的静态类型, 类和接口, 它还处于早期阶段. Dart也是一种面向对象的语言,具有类似c的语法, 但它仍然可以在主流浏览器上编译成JavaScript.

随着的诞生而迅速成长 节点.js, JavaScript不再局限于前端开发. 随着节点的引入.js back-end frameworks, back-end development is no longer rocket science for front-end coders. 人 tend to think of JavaScript as a silver bullet that fits in all situations: front-end, web服务器, 桌面应用程序, 嵌入式系统, 数据库……这个列表越来越长. 事实上,考虑到JavaScript的广泛受众,节点.js+MongoDB+AngularJS/React has made quite a large amount of full stack web developers. 然而,节点.Js被设计成轻量级的,并且只提供作为web服务器的基本功能,以提高web应用程序的开发速度. 在现实世界中,作为npm包提供的一个好用的框架可能是一个更好的选择.

In this post, we will walk through some of these well known and time tested 节点.js框架 that have relieved developers from having to reinvent the wheel over and over. To be more specific, in this article we will take a look at 表达, 洋槐, 流星 and 帆.js. Instead of trying to figure out how each of these frameworks stack against one another, 我们将看到这些框架各自擅长的关键领域,以及它们如何与各种项目需求相关.

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

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

表演

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

表达是一个最小的、不固执己见的节点.js框架. 它不应用任何流行的设计模式,如MVC, 最有价值球员, MVVM之类的东西很流行. 对于崇尚简约的人, 与所有其他框架相比,这是一个很大的优势,因为您可以根据自己的喜好构建应用程序,而且没有不必要的学习曲线. This is especially advantageous when creating a new personal project with no historical burden, 但随着项目或开发团队的成长, lack of standardization may lead to extra work for project/code management, 最坏的情况是它可能导致无法维持.

发电机

尽管表达不是一个固执己见的节点.js框架, it does have the generator that generates specific project folder structure. 在安装 express-generator NPM包和使用生成器命令创建应用程序骨架, an 应用程序lication folder with clear hierarchy will be created to help you organize images, 前端静态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, 表达使这个过程自然而直观.

模板引擎

Template engines allow developer to embed backend variables into HTML files, 当被请求时,模板文件将被渲染为纯HTML格式,并插入变量的实际值. 默认情况下, express生成器使用Pug(最初称为Jade)模板引擎, 但其他选项,如Mustache和EJS,也可以与表达无缝协作.

数据库集成

作为一个最小框架, 表达 does not consider database integration as a required aspect within its package, 因此,它倾向于不使用任何特定的数据库. 同时采用特定的数据存储技术, MySQL也好, MongoDB, PostgreSQL, 复述,, Elastic搜索之类的, it’s just a matter of installing the particular npm package as database driver. These third party database drivers do not conform to unified syntax when doing CRUD instructions, 这使得切换数据库变得非常麻烦并且容易出错.

洋槐:利用下一代JavaScript特性

洋槐是由表达背后的团队开发的, and its goal is to minimize the minimalist 表达 by not bundling any Middleware within its core. 除了没有Middleware之外,洋槐看起来与表达非常相似,轻量级且不固执己见. 然而,是什么让 洋槐 truly standout is its way to ditch callback completely by using the ES6 发电机 feature.

优雅的控制流程

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

扁平化回调嵌套的一种方法是使用异步.js. 异步.Js提供了映射技术, 并行化, 序列化或迭代多个函数,而不必将一个函数嵌入另一个函数,然后用回调函数传递控制流, 一个回调函数和一个错误处理函数对于由异步组合在一起的大量函数已经足够了.js方法. 然而,异步.Js不能完全清除回调. 写节点时.使用异步 . js编写代码.js, the indentation of code still tends to drift to the right, just not as deep.

逃离回调地狱

另一种更简洁的方法是使用then-able Promises. 一些有名气的第三方Promise库是bluebird和q. In the newest edition of JavaScript, ES6, Promise has been taken in as a standardization. 长话短说, Promise通过将实现块/函数与一堆Promise " then "函数连接起来,保证函数以顺序的方式执行和返回. 您可以在每个实现块/函数的末尾“解析”,以便执行下一个“然后”函数, 或者“拒绝”以下实现,以便控制流直接跳转到错误处理. 这种方式, you aggregate all error handling functions to one place and get rid of callbacks thoroughly.

现在ES6带来了一个改变游戏规则的东西——ES6生成器. This notion is new to JavaScript, but not new in the programming world at all. ES6生成器就像C中的中断, 而不是从上到下运行代码行, ES6 发电机 introduces a means to run->halt and run something else->come back to finish what is leftover.

洋槐利用ES6生成器提供了一种优雅的方式来处理JavaScript异步编程, 类中看不到回调 高雅的应用程序. 在洋槐中,ES6 发电机的一个典型用例是Middleware级联, which allows customized Middleware to execute one after another without any nasty callbacks.

Var 应用程序 = koa();

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

应用程序.使用(responseTimeLogger);

// ...

应用程序.听(3000);

我们不能妄下结论,断言这种尖端技术优于老式解决方案(如异步).js, 承诺或事件发射器, but one thing is for sure that this new concept does take some time to get used to. With the unconventional control flow sequence, it could bring extra difficulty to code debugging.

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

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

我为人人包

If you look closely under the hood, you will notice that 流星 is really 节点.js科尔多瓦+火焰/ AngularJS /反应+ + MongoDB. 节点.js and MongoDB are respectively responsible for server side business logic and data storage. Blaze、AngularJS或React中的一个负责前端UI. 和科尔多瓦, 作为移动混合应用中最著名的HTML解决方案, 桥的网页移动视图.

数据同步

The mainstream process for backend and front-end to share data is as follows:

  • 客户端请求数据或某些HTML视图
  • 服务器从数据库中检索数据, mixes data with HTML view using some templating engine and sends it back to the front-end
  • 客户端以用户友好的方式呈现和显示数据/视图

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

自动完成双向数据同步

流星区别于其他框架的特性之一是它在服务器和前端/移动应用程序之间的数据同步机制. 在流星, 客户端持有一个小型数据库影子副本,它是服务器数据库复制的一小部分, a portion that is previously requested by the client and is authorized by server. 当客户端希望对数据进行任何更改时, it uses the consistent database API as server side to perform any CRUD instructions, and then data changes will be automatically sent to server and saved in the actual database. 当服务器检测到任何数据修改时, it will push the updated data to specific clients that subscribe to those data. 这种双向数据同步是自动完成的,无需任何人工干预. 为了创造这种魔力, 流星使用Web套接字在底层连接客户端和服务器,以便一端的任何数据更改都会立即反映到另一端.

构建自动化工具

流星不仅负责服务器和web应用程序, 使用流星的构建工具Isobuild 科尔多瓦, a library that bundles HTML/JavaScript/CSS with native mobile functionalities, 流星让构建iOS和Android应用变得轻而易举. The generated mobile 应用程序s are hybrid 应用程序s that run JavaScript or show HTML pages inside a WebView. This workaround may compromise some user experience when compared to native mobile 应用程序s, 但对于许多人来说,能够在web应用程序的相同代码库下管理这一切是一个相当大的卖点, 它节省了大量的开发成本.

总的来说,流星是一个高度自动化的框架. 这种高级自动化使开发人员的工作更加轻松, yet it comes with a cost of jeopardized performance and scalability restrictions. 随着用户基数的增长,自动数据同步技术成为扩展的瓶颈. To achieve the same capacity and performance as other hand-tuned backend technologies, 流星通常会消耗更多的服务器硬件和带宽资源. 所以,如果你想为所有主流平台创建项目原型,那么流星将是一个很好的起点和完美的工具箱, 但最终,如果原型成为具有足够客户基础的产品项目,则必须以更专业的方式重新设计系统架构.

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

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

MVC

模型视图控制器

帆.js从核心开始采用模型-视图-控制器的设计模式. For those coming from Ruby on Rails or Laravel, they will find the structure for a 帆.Js应用太熟悉了. Model represents data model that reflects database table/collection schema, 视图是填入数据的HTML视图, 控制器是放置所有服务器端业务逻辑的地方,并充当数据和视图之间的粘合剂.

实时通信

Not like an HTTP request where the client has to query for server data every time, 或者长轮询连接,这会使服务器处于空闲模式, 套接字.io establishes a bidirectional event-based communication between client and server. 帆.js集成套接字.io and wraps it up with some higher abstraction level API to provide more convenience, 这样就形成了帆.Js特别适合创建聊天应用程序或多人游戏.

数据库ORM

数据库ORM

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

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

总结

本文将详细介绍一些最好的节点.js框架. 而不是提供一个节点.js框架的性能比较和不同节点的排名.js框架, it lists the shining spots of each framework to stand out from the crowd so as to help 节点.js开发人员 pick up the most suited toolbox when building a project from the ground up.

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

就这一主题咨询作者或专家.
预约电话
杨楚贤的头像
Chuoxian杨

位于 长沙,湖南,中国

成员自 2016年3月4日

作者简介

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

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. All of our content is peer reviewed and validated by Toptal experts in the same field.

以前在

黑刺李

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

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

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

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

Toptal开发者

加入总冠军® 社区.