本文概述
由于对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 Generator功能完全放弃回调的方式。
优雅的控制流程
Javascript是一种异步编程语言, 并且由于语言本身的这种直觉和Node.js的单线程事件驱动机制, 回调无处不在, 因此臭名昭著的回调地狱。
简化回调嵌套的一种方法是使用Async.js。 Async.js提供了映射, 并行化, 序列化或迭代多个函数的技术, 而无需将其嵌入另一个函数, 然后通过回调函数传递控制流, 一个回调和一个错误处理函数足以将大部分函数组合在一起通过Async.js方法。但是Async.js不能完全清除回调。当使用Async.js编写Node.js代码时, 代码的缩进仍然倾向于向右偏移, 只是不那么深。
另一种更清洁的方法是使用当时可用的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 Generator的一个典型用例是中间件级联, 它允许定制的中间件一个接一个地执行而无需任何讨厌的回调。
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。作为移动混合应用程序中最著名的HTML解决方案, Cordova将网页桥接到移动视图。
数据同步
后端和前端共享数据的主流过程如下:
- 客户端请求数据或某些HTML视图
- 服务器从数据库检索数据, 使用一些模板引擎将数据与HTML视图混合, 然后将其发送回前端
- 客户端以用户友好的方式呈现和显示数据/视图
现代的单页Web应用程序对上述过程进行了一些调整。以AngularJS为例, 它将HTML模板与其他资源(例如前端JavaScript文件, 样式表和图像)一起作为静态文件放置。然后, AngularJS通过使用Ajax RESTful API向后端询问数据来将数据填充到HTML模板中。无论哪种方式, 后端开发人员都完全负责处理来自前端的数据更改请求并将更改保存在数据库中。
Meteor与其他框架的区别之一是服务器和前端/移动应用之间的数据同步机制。在Meteor中, 客户端拥有一个迷你数据库卷影副本, 它是从服务器数据库进行复制的一小部分, 该部分是客户端先前请求并由服务器授权的部分。当客户端想要对数据进行任何更改时, 它使用一致的数据库API作为服务器端来执行任何CRUD指令, 然后数据更改将自动发送到服务器并保存在实际数据库中。每当服务器检测到任何数据修改时, 它将把更新的数据推送到预订这些数据的特定客户端。这种双向数据同步是自动完成的, 无需任何手动干预。为了创造这种魔力, Meteor正在使用WebSocket在后台连接客户端和服务器, 以便任何一端的数据更改都将立即反映到另一端。
构建自动化工具
Meteor不仅使用服务器上的服务器和Web应用程序, 而且借助Cordova(一个将HTML / JavaScript / CSS与本机移动功能捆绑在一起的库), 使用Meteor的名为Isobuild的构建工具, 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视图, 控制器是你在其中放置所有服务器端业务逻辑的位置, 并充当数据和视图之间的粘合剂。
实时通讯
Socket.io不像客户端每次都必须查询服务器数据的HTTP请求或长时间的轮询连接(使服务器处于空闲模式)那样, 而是在客户端和服务器之间建立了基于双向事件的通信。 Sails.js集成了Socket.io, 并使用更高的抽象级别API对其进行包装以提供更多便利, 从而使Sails.js特别适合于创建聊天应用程序或多人游戏。
数据库ORM
在后端逻辑和实际数据库操作之间, 有一个中间的ORM层, 称为”水线”。简而言之, 这个ORM工具提供了一致的语法来访问不同的数据库, 而开发人员不必担心各种数据库查询语言, 例如SQL vs NoSQL, schema vs-less-schema等。
Sails.js具有中等自动化程度。它专注于服务器端逻辑并已准备好投入生产, 并且在不牺牲任何性能或未来可扩展性的情况下, 提供了比Express更快的开发速度。特别是对于大量MVC模式的奉献者, Sails.js的学习曲线相当流畅。
本文总结
本文并没有对不同的Node.js框架进行排名, 而是列出了每个框架中脱颖而出的亮点, 以帮助Node.js开发人员从头开始构建项目时选择最合适的工具箱。
那么, 你最喜欢用于Web开发的Node.js框架是什么?除了我们上面讨论的框架之外, 你还喜欢其他框架吗?在下面的评论部分让我们知道。
相关:为什么我会使用Node.js?个案教程
评论前必须登录!
注册