题 如何决定何时使用Node.js?


我对这种东西不熟悉,但最近我听到很多关于它有多好的东西 Node.js的 是。考虑到我一般喜欢使用jQuery和JavaScript,我不禁想知道如何决定何时使用Node.js.我想到的Web应用程序是这样的 Bitly  - 收集一些内容,归档它。

从我过去几天所做的所有作业中,我获得了以下信息。 Node.js的

  • 是一个命令行工具,可以作为常规Web服务器运行,并让一个人运行JavaScript程序
  • 利用伟大的 V8 JavaScript引擎
  • 当你需要同时做几件事时非常好
  • 是基于事件的,所以很棒 阿贾克斯类似的东西可以在服务器端完成
  • 让我们在浏览器和后端之间共享代码
  • 让我们与MySQL交谈

我遇到的一些消息来源是:

考虑到Node.js几乎可以开箱即用 亚马逊的EC2 实例,我试图了解什么类型的问题需要Node.js,而不是任何强大的国王 PHP蟒蛇 和 红宝石。我知道这实际上取决于人们对语言的专业知识,但我的问题更多地涉及一般类别:何时使用特定框架以及它特别适合哪种类型的问题?


2200
2018-02-21 05:20


起源


这个问题正在讨论meta(meta.stackoverflow.com/q/332386/497418)。 - zzzzBov


答案:


你做了很好的总结Node.js的精彩内容。我的感觉是Node.js特别适合于您希望保持从浏览器到服务器的持久连接的应用程序。使用一种称为的技术 “长轮询”,您可以编写一个实时向用户发送更新的应用程序。对许多网络巨头进行长时间的轮询,比如 Ruby on Rails 要么 Django的,会在服务器上产生巨大的负载,因为每个活动客户端都会占用一个服务器进程。这种情况相当于一个 焦油坑 攻击。当您使用Node.js之类的东西时,服务器不需要为每个打开的连接维护单独的线程。

这意味着你可以创建一个 基于浏览器的聊天应用程序 在Node.js中几乎不需要系统资源来为很多客户端提供服务。任何时候你想做这种长轮询,Node.js是一个很好的选择。

值得一提的是Ruby和Python都有工具来做这类事情(EventMachine的 和 扭曲,分别),但Node.js非常好,并从头开始。 JavaScript非常适合基于回调的并发模型,它在这里很有优势。此外,能够使用本机的JSON序列化和反序列化客户端和服务器是非常好的。

我期待在这里阅读其他答案,这是一个很棒的问题。

值得指出的是,Node.js对于在客户端/服务器间隙中重复使用大量代码的情况也很有用。该 流星框架 这让这很容易,很多人都认为这可能是网络开发的未来。我可以从经验中说,在Meteor中编写代码非常有趣,其中很大一部分是花更少的时间考虑如何重构数据,因此浏览器中运行的代码很容易操纵它并将其传回。

这是一篇关于金字塔和长轮询的文章,结果很容易在gevent的帮助下进行设置: TicTacToe和长金字塔轮询


1359
2018-02-21 05:30



是的,我认为认为'node.js特别适合需要从浏览器到服务器的持久连接的应用程序非常重要。 - 例如聊天程序或交互式游戏'如果只是构建一个不一定需要用户/服务器通信的应用程序,那么使用其他框架进行开发就可以了,并且将花费更少的时间。 - user482594
非常感谢...很棒的Q和A ;-)我也考虑过在掌握前端和后端开发的一项伟大技术而不是几个不同的技术;) - Stokedout
为什么要使用长轮询?未来发生了什么事 插座? - hitautodestruct
我的简短回答是后台流程。请求和响应(包括其余API)都可以使用任何其他语言和服务器实现。因此对于那些想要在节点中转换其Web项目的人。再想一想它!使用节点作为后台进程,例如使用imap阅读电子邮件,图像处理,将文件上传到云,或任何冗长或永无止境的进程,这些进程主要是面向事件的... - Vikas


我相信Node.js最适合实时应用:在线游戏,协作工具,聊天室,或者其他用户需要立即看到一个用户(或机器人?或传感器?)对应用程序做什么的任何事情,没有页面刷新。

我还要提一下,Socket.IO与Node.js相结合,可以比长轮询更进一步减少实时延迟。作为最坏的情况,Socket.IO将回归长轮询,而是使用网络套接字甚至Flash(如果可用的话)。

但是我还应该提一下,使用Node.js可以更好地解决因线程而导致代码阻塞的任何情况。或者您需要应用程序进行事件驱动的任何情况。

此外,Ryan Dahl在一次谈话中说,我曾经参加过Node.js基准测试,与Ng​​inx的常规旧HTTP请求密切相关。因此,如果我们使用Node.js构建,我们可以非常有效地服务我们的常规资源,当我们需要事件驱动的东西时,它就可以处理它了。

另外,它一直都是JavaScript。 Lingua Franca整个堆栈。


410
2018-02-21 06:43



只是来自某人在.Net和Node之间切换的观察结果,系统不同区域的不同语言在上下文切换时有很大帮助。当我在看Javascript时,我在客户端工作,C#表示App Server,SQL =数据库。在整个Javascript中工作,我发现自己混淆了各层,或者只是花费更长时间来进行上下文切换。这可能是整天在.NET堆栈上工作和晚上Noding的工件,但它确实有所作为。 - Michael Blackburn
有趣的是,跨文化个体在主流文化和本土文化之间转换时转换方言的做法被称为“代码转换”。 - Michael Blackburn
就在前几天,我在考虑如何为不同的颜色分配不同的颜色 .js 文件不知何故。客户端为绿色,服务器端为蓝色。我自己一直“迷失”。 - AJB
最佳答案。例如,node.js非常适合点对点。 - cpugourou


使用NodeJS的原因:

  • 它运行Javascript,因此您可以使用 同一种语言 在服务器和客户端上,甚至在它们之间共享一些代码(例如,用于表单验证,或在两端呈现视图。)

  • 单线程 事件驱动系统是 快速 即使在处理大量请求时,与传统的多线程相比也很简单 Java的 或ROR框架。

  • 不断增长的游泳池  可通过NPM获取,包括客户端和服务器端库/模块,以及用于Web开发的命令行工具。其中大部分都方便地托管在github上,有时您可以报告问题并在几小时内找到它!把所有东西放在一个屋檐下很好,标准化的问题报告和简单的分叉。

  • 它已成为运行的事实标准环境 与Javascript相关的工具 和别的 与网络相关的工具,包括任务运行器,minifiers,美化器,linters,预处理器,捆绑器和分析处理器。

  • 它似乎非常适合原型设计,敏捷开发和 快速的产品迭代

原因  使用NodeJS:

  • 它运行Javascript,没有编译时类型检查。对于大型,复杂的 安全关键 系统或项目,包括不同组织之间的合作,鼓励的语言 合同接口 并提供 静态类型检查 可以节省一些调试时间(和 爆炸) 从长远来看。 (尽管JVM仍然坚持使用 null,请将Haskell用于您的核反应堆。)

  • 除此之外,NPM中的许多软件包都是一点点 生的,仍处于快速发展阶段。旧框架的一些库已经历了十年的测试和错误修正,而且非常 稳定 目前为止。 Npmjs.org没有评估包的机制这导致包装大量增加或多或少相同,其中很大一部分不再维持。

  • 嵌套的回调地狱。 (当然有 20种不同解决方案 对... ...)

  • 不断增长的软件包可以使一个NodeJS项目出现 根本不同 从下一个。由于可用的选项数量众多(例如Express /),因此在实施方面存在很大差异Sails.js/流星/德比)。这有时会使新开发人员更难进入Node项目。与之形成鲜明对比 轨道 开发人员加入现有项目:他应该能够很快熟悉应用程序,因为鼓励所有Rails应用程序使用 类似的结构

  • 处理文件可能有点痛苦。在其他语言中微不足道的事情,比如从文本文件中读取一行,就是 很奇怪Node.js 有80多个upvotes的StackOverflow问题。有 没有简单的方法可以从CSV文件一次读取一条记录。等等。

我喜欢NodeJS,它既快速又狂野又有趣,但我担心它对可证明的正确性几乎没有兴趣。让我们希望我们最终可以融合两全其美。我很想知道将来取代Node会有什么...... :)


209
2017-11-25 21:47



@nane是的我确实认为他们可以解决这个问题,但是你必须这样做 限制自己 仅使用以类型安全语言编写的库,或者不接受 所有的代码库 是静态类型的。但有一个论点是:因为你应该写 好的测试 对于你的代码,无论语言如何,那么你的 置信水平应该相等 即使是动态类型的代码。如果我们接受这个论点,那么强类型的优点就会减少,以帮助开发/调试时间,可证明性和 优化。 - joeytwiddle
@kervin,我同意一些基准会很棒,但我对在网上找到的东西感到很失望。有些人认为.NET性能是 可比 对于Node来说,但这对你实际做的事情至关重要。节点可能很好地提供具有许多并发连接的小消息,但对于繁重的数学计算则不是那么好。良好的性能比较需要测试各种情况。 - joeytwiddle
@joeytwiddle在处理更大的复杂程序和静态类型检查时,不会像Typescript那样帮助Node.js吗? - CodeMonkey
@joeytwiddle对于它的价值,你可以使用 stillmaintained.com 确定是否仍然维护npm包(因为大多数都在github上)。此外, npm search 和 npm show 将显示最后一次发布包的日期。 - Dan Pantry
通过将rails与节点进行比较,您会将平台与框架混淆。 Rails是Ruby的框架,就像Sails和meteor是Javascript框架一样。 - BonsaiOak


简而言之:

Node.js非常适合具有大量并发连接的应用程序,并且每个请求只需要很少的CPU周期,因为在执行函数期间会阻止事件循环(包含所有其他客户端)。

关于Node.js中的事件循环的一篇好文章是 Mixu的技术博客:了解node.js事件循环


208
2018-01-15 01:48





我有一个真实世界的例子,我使用Node.js.我工作的公司有一个客户希望拥有一个简单的静态HTML网站。本网站用于销售一件商品 贝宝 并且客户还希望有一个显示已售商品数量的柜台。客户预计会有大量访问者访问本网站。我决定使用Node.js和 Express.js 框架。

Node.js应用程序很简单。从a获取销售商品金额 Redis的 数据库,在商品售出时增加计数器,并通过商品向用户提供计数器值 API

在这种情况下我选择使用Node.js的一些原因

  1. 它非常轻巧,快速。本网站在三周内访问量超过20万次,最小的服务器资源已经能够处理。
  2. 计数器很容易实时。
  3. Node.js很容易配置。
  4. 有很多模块可以免费使用。例如,我找到了PayPal的Node.js模块。

在这种情况下,Node.js是一个很棒的选择。


127
2018-05-31 06:34



你是如何主持这样的?你必须在生产服务器上设置nodejs吗?在linux中? - Notflip
有一些PaaS,如nodejitsu和Heroku。或者你确实可以在linux盒子上设置nodejs,即从amazon ec2。看到: lauradhamilton.com/... - Sam Ames
在1,814,400秒内访问200,000次。根本不相关。甚至bash也可以在最慢的服务器上提供许多请求。刮擦服务器。最慢的VM。 - Tiberiu-Ionuț Stan


使用Node启动下一个项目的最重要原因...

  • 所有最酷的家伙都进入了它......所以它 必须 好玩。
  • 你可以在冷却器上进行聚会,并有很多Node冒险来吹嘘。
  • 在云托管成本方面,你是一个便宜的pincher。
  • 用Rails完成了那个
  • 你讨厌IIS部署
  • 你的旧IT工作变得相当沉闷,你希望你处于一个闪亮的新起点。

期待什么......

  • 如果没有您从未需要的所有服务器膨胀软件,您将感受到安全和安全。
  • 像火箭一样运行并且可以很好地扩展。
  • 你梦想着它。你安装了它。节点包repo npmjs.org 是世界上最大的开源库生态系统。
  • 你的大脑会在嵌套回调的土地上扭曲时间......
  • ......直到你学会保持你的 承诺
  • Sequelize 和 护照 是你的新API朋友。
  • 调试大多数异步代码将获得嗯...... 有趣 。
  • 所有Noders掌握的时间 打字稿

谁用它?

  • PayPal,Netflix,沃尔玛,LinkedIn,Groupon,优步,GoDaddy,道琼斯
  • 这就是他们的原因 切换到节点

105
2018-06-12 13:24



是的,我可以用传统方式回答这个问题。我认为我有资格这样做,但大部分都已经说过了,我认为一些轻松愉快会打破单调。我经常就其他问题提供技术答案。 - Tony O'Hagan
+1“调试大部分异步代码将会变得非常有趣。” - Jackson
通过将ES6生成器用于异步代码,可以避免嵌套回调 - refactor
@CleanCrispCode:是的! ES6采用了C#风格 async/await 所以现在我们可以推出更清洁的异步节点代码,它也支持传统的 try/catch。 2016/17 JS编程人员正在转向ES6。 - Tony O'Hagan
成千上万次“没有你从未需要的所有服务器臃肿软件,你会感到安全和安全” - Simone Poggi


没有像银弹一样的东西。一切都带来了与之相关的一些成本。就像你吃油腻的食物,你会损害你的健康,健康的食物不会像油性食物一样含有香料。无论他们是否想要健康或香料,都是个人选择。 Node.js考虑在特定场景中使用的方式相同。如果您的应用不适合该方案,则不应将其视为您的应用开发。我只是想到了同样的想法:

何时使用Node.JS

  1. 如果您的服务器端代码需要很少的CPU周期。在其他世界中,您正在执行非阻塞操作,并且没有繁重的算法/作业,这会消耗大量的CPU周期。
  2. 如果您来自Javascript,并且在编写单线程代码时非常舒服,就像客户端JS一样。

何时不使用Node.JS

  1. 您的服务器请求取决于耗费大量CPU的算法/作业。

Node.JS的可扩展性考虑

  1. Node.JS本身并不利用底层系统的所有核心,默认情况下它是单线程的,你必须自己编写逻辑来利用多核处理器并使其成为多线程。

Node.JS替代品

但是,还有其他选项可用于代替Node.JS Vert.x 似乎非常有前途,并有许多额外的功能,如polygot和更好的可扩展性考虑。


60
2018-04-05 17:17



我不确定“如果您的服务器端请求包含阻止操作,如文件IO或Socket IO”在“何时不使用”中列出。如果我的理解是正确的,那么node.js的优点之一是,它具有强大的异步方法来处理IO而不会阻塞。因此Node.js可以被视为阻止IO的“治愈方法”。 - Ondra Peterka
@OndraPeterka:你是对的,Node.js可以解决阻塞服务器IO的问题,但是如果服务器上的请求处理程序对其他Web服务/文件操作进行阻塞调用,则Node.js在这里没有帮助。它仅对来自服务器的传入请求是非阻塞IO,而不是来自应用请求处理程序的传出请求。 - ajay
@ajay来自 nodejs.org 他们说“非阻塞I / O”,请检查“何时不”2和3。 - Omar Al-Ithawi
在当前版本中,节点实际上通过使用集群支持多核支持。这确实提升了Node应用程序的性能至少两倍。但是,我认为在稳定集群lib时性能应该超过两倍。 - Nam Nguyen
您可以使用node.js进行繁重的计算。使用 fork。看到 stackoverflow.com/questions/9546225/...。 Node可以很好地处理多个内核 cluster 模块。 nodejs.org/api/cluster.html - Jess


另一个伟大的事情 我认为 没有人提到过Node.js是一个了不起的社区,包管理系统(npm)以及你可以包含的模块数量,只需将它们包含在你的package.json文件中即可。


41
2018-06-06 17:42



而且这些包都是相对新鲜的,因此它们具有后见之明的优点,并且倾向于符合最近的Web标准。 - joeytwiddle
尽管如此,npm上的很多软件包都很糟糕,因为 npm没有评估包的机制。后见之明 CPAN 任何人? - Dan Dascalescu
太糟糕了没有任何websockets库可以满足rfc 6455规范。如果给出这个事实,node.js粉丝是聋哑,愚蠢和盲目的。 - r3wt
我不知道你何时发表评论,但截至目前,ws库支持该规范 - Jonathan Gray