Express、Koa、Meteor、Sails.js:天启的四个框架

已发表: 2022-03-11

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

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

在这篇文章中,我们将介绍其中一些众所周知且经过时间考验的 Node.js 框架,这些框架使开发人员不必一遍又一遍地重新发明轮子。 更具体地说,在本文中,我们将了解 Express、Koa、Meteor 和 Sails.js。 与其试图弄清楚这些框架中的每一个如何相互叠加,我们将看到这些框架中的每一个擅长的关键领域以及它们如何与各种项目需求相关。

Express:极简主义的 Web 框架

不用说,Express 是 Node.js 业务最大的一笔交易。 每个 Node.js 玩家都听说过它,并且在不知不觉中使用它。 它目前是第 4 代,有很多基于它构建或受其概念启发的 Node.js 框架。

表现

大多数开发人员都喜欢 Node.js 的原始速度,而当涉及到框架选择时,完美主义者可能会鄙视任何性能危害。 Express 在 Node.js 之上提供了一个薄层,具有 Web 应用程序功能,例如基本路由、中间件、模板引擎和静态文件服务,因此 Node.js 的强大 I/O 性能不会受到影响。

Express 是一个最小的、无主见的框架。 它不应用任何流行的设计模式,例如 MVC、MVP、MVVM 或任何开箱即用的趋势。 对于简单的爱好者来说,这是所有其他框架中的一大优势,因为您可以根据自己的喜好构建应用程序,而无需不必要的学习曲线。 这在创建一个没有历史负担的新个人项目时尤其有利,但随着项目或开发团队的成长,缺乏标准化可能会导致项目/代码管理的额外工作,最坏的情况可能导致无法维护.

发电机

尽管该框架是无主见的,但它确实具有生成特定项目文件夹结构的生成器。 安装 express-generator npm 包并使用 generator 命令创建应用程序骨架后,将创建一个层次结构清晰的应用程序文件夹,以帮助您组织图像、前端静态 JavaScript、样式表文件和 HTML 模板文件。

 npm install express-generator -g express helloapp
 create : helloapp create : helloapp/package.json create : helloapp/app.js create : helloapp/public create : helloapp/public/images create : helloapp/routes create : helloapp/routes/index.js create : helloapp/routes/users.js create : helloapp/public/stylesheets create : helloapp/public/stylesheets/style.css create : helloapp/views create : helloapp/views/index.jade create : helloapp/views/layout.jade create : helloapp/views/error.jade create : helloapp/bin create : helloapp/bin/www install dependencies: $ cd helloapp && npm install run the app: $ DEBUG=helloapp:* npm start create : helloapp/public/javascripts

中间件

中间件基本上只是可​​以完全访问请求和响应对象的函数。

请求处理堆栈

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

 var app = express(); app.use(cookieParser()); app.use(bodyParser()); app.use(logger()); app.use(authentication()); app.get('/', function (req, res) { // ... }); app.listen(3000);

Express 应用程序本质上是具有大量中间件功能的 Node.js,无论您是想自定义自己的中间件还是利用框架的内置中间件,Express 都使过程自然而直观。

模板引擎

模板引擎允许开发人员将后端变量嵌入到 HTML 文件中,并且在请求时,模板文件将呈现为纯 HTML 格式,其中变量插入了它们的实际值。 默认情况下,express-generator 使用 Pug(最初称为 Jade)模板引擎,但 Mustache 和 EJS 等其他选项也可以与 Express 无缝协作。

数据库集成

作为一个最小的框架,Express 并不认为数据库集成是其包中必需的方面,因此它倾向于不使用任何特定的数据库。 在采用特定的数据存储技术时,无论是 MySQL、MongoDB、PostgreSQL、Redis、ElasticSearch 还是其他,只需安装特定的 npm 包作为数据库驱动程序即可。 这些第三方数据库驱动在执行 CRUD 指令时不符合统一语法,这使得切换数据库非常麻烦且容易出错。

Koa:利用下一代 JavaScript 功能

Koa 由 Express 背后的团队开发,其目标是通过不在其核心中捆绑任何中间件来最小化极简主义的 Express。 除了没有中间件之外,Koa 看起来与 Express 非常相似,轻量级且没有意见。 然而,让 Koa 真正脱颖而出的是它通过使用 ES6 生成器功能完全放弃回调的方式。

优雅的控制流

Javascript 是一种异步编程语言,凭借语言本身的这种本能和 Node.js 的单线程事件驱动机制,回调无处不在,因此臭名昭著的回调地狱。

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

逃离回调地狱

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

现在 ES6 带来了一个游戏规则改变者——ES6 Generator。 这个概念对 JavaScript 来说是新的,但在编程世界中根本不是新的。 ES6 Generator 就像 C 中的中断,而不是从上到下一直运行代码行,ES6 Generator 引入了一种方法来运行->暂停并运行其他内容->返回以完成剩余的内容。

Koa 正在利用 ES6 生成器来提供一种优雅的方式来处理 JavaScript 异步编程,因此您无法在纯 Koa 应用程序中看到回调。 Koa 中 ES6 生成器的一个典型用例是中间件级联,它允许自定义中间件一个接一个地执行,而无需任何讨厌的回调。

 var app = koa(); function* responseTimeLogger(next){ var start = new Date; yield next; var ms = new Date - start; console.log(this.method + ' ' + this.url + ': ' + ms); } app.use(responseTimeLogger); // ... app.listen(3000);

我们不能妄下结论断言这种尖端技术优于 Async.js、Promise 或事件发射器等老派解决方案,但可以肯定的是,这种新概念确实需要一些时间来适应。 使用非常规的控制流序列,会给代码调试带来额外的困难。

Meteor:Web、移动和桌面框架

Meteor 是一个一体化的 JavaScript 框架。 区别于 Express 和 Koa 的简化理念,它走向了另一个极端,将自己定义为一个全栈框架,一个涵盖服务器、移动、桌面和 Web 应用程序的完整包。

一站式套餐

如果你仔细观察,你会注意到 Meteor 真的是 Node.js+Blaze/AngularJS/React+Cordova+MongoDB。 Node.js 和 MongoDB 分别负责服务端业务逻辑和数据存储。 Blaze、AngularJS 或 React 之一负责前端 UI。 Cordova 作为最著名的移动混合应用程序 HTML 解决方案,将网页连接到移动视图。

数据同步

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

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

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

自动完成双向数据同步

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

构建自动化工具

Meteor 不仅负责服务器和 Web 应用程序应用程序,在 Cordova 的帮助下使用 Meteor 的名为 Isobuild 的构建工具,这是一个将 HTML/JavaScript/CSS 与本机移动功能捆绑在一起的库,Meteor 使构建 iOS 和 Android 应用程序变得轻而易举。 生成的移动应用程序是运行 JavaScript 或在 WebView 中显示 HTML 页面的混合应用程序。 与原生移动应用程序相比,这种解决方法可能会影响一些用户体验,但对于许多能够在与 Web 应用程序相同的代码库下进行管理的人来说,这是一个很大的卖点,并且可以节省大量的开发成本。

总的来说,Meteor 是一个高度自动化的框架。 这种高水平的自动化使开发人员的生活变得更加轻松,但也带来了危害性能和可扩展性限制的成本。 随着用户群的增长,自动数据同步技术成为扩展的瓶颈。 为了达到与其他手动调整的后端技术相同的容量和性能,Meteor 通常会消耗更多的服务器硬件和带宽资源。 因此,如果想要为所有主要平台制作项目原型,Meteor 可能是一个很好的起点和完美的工具箱,但最终在某个时候,如果原型成为具有足够多的生产项目,则必须以更专业的方式重新设计系统架构客户群。

Sails.js:Node.js 的高级 MVC 框架

Sails.js 与 Express 有许多相似之处。 它是一个项目生成器、中间件和模板引擎。 它实际上是建立在 Express 之上的,加上一些更高级别的功能来加速开发。

MVC

模型视图控制器

Sails.js 从其核心采用 Model-View-Controller 设计模式。 对于那些来自 Ruby on Rails 或 Laravel 的人来说,他们会发现 Sails.js 应用程序的结构非常熟悉。 模型表示反映数据库表/集合模式的数据模型,视图是填充数据的 HTML 视图,控制器是您放置所有服务器端业务逻辑的地方,并充当数据和视图之间的粘合剂。

实时通讯

与客户端每次都必须查询服务器数据的 HTTP 请求,或者使服务器处于空闲模式的长轮询连接不同,Socket.io 在客户端和服务器之间建立了基于事件的双向通信。 Sails.js 集成了 Socket.io 并用一些更高抽象级别的 API 将其包裹起来以提供更多便利,从而使 Sails.js 特别适合创建聊天应用程序或多人游戏。

数据库 ORM

数据库 ORM

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

Sails.js 具有中级自动化程度。 它专注于服务器端逻辑并已准备好生产,它提供了比 Express 更快的开发速度,而不会牺牲任何性能或未来的可扩展性。 尤其是对于大量 MVC 模式爱好者来说,Sails.js 的学习曲线相当流畅。

包起来

本文不是对不同的 Node.js 框架进行排名,而是列出每个框架的闪光点以脱颖而出,以帮助 Node.js 开发人员在从头开始构建项目时选择最适合的工具箱。

那么,您最喜欢哪一个用于 Web 开发的 Node.js 框架? 除了我们上面讨论的框架之外,你更喜欢其他框架吗? 在下面的评论部分让我们知道。

有关的:
  • 为什么我会使用 Node.js? 个案教程
  • Cabin Fever 编码:Node.js 后端教程
  • 构建 Node.js/TypeScript REST API,第 1 部分:Express.js