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

IT技术 javascript node.js web-applications
2021-01-22 08:48:30

我是这种东西的新手,但最近我听到了很多关于Node.js有多好的消息考虑到我通常非常喜欢使用 jQuery 和 JavaScript,我不禁想知道如何决定何时使用 Node.js。我想到的 Web 应用程序类似于Bitly - 获取一些内容,将其存档。

从我这几天做的所有作业中,我获得了以下信息。节点.js

  • 是一种命令行工具,可以作为常规的 Web 服务器运行,并可以运行 JavaScript 程序
  • 利用强大的V8 JavaScript 引擎
  • 当你需要同时做几件事时非常好
  • 是基于事件的,所以所有美妙的类似 Ajax的东西都可以在服务器端完成
  • 让我们在浏览器和后端之间共享代码
  • 让我们来谈谈 MySQL

我遇到的一些来源是:

考虑到 Node.js 几乎可以在Amazon 的 EC2实例上开箱即用地运行,我试图了解什么类型的问题需要 Node.js,而不是像PHPPythonRuby这样的任何强大的国王. 我知道这真的取决于一个人对一种语言的专业知识,但我的问题更多地属于以下一般类别:何时使用特定框架以及它特别适合什么类型的问题?

6个回答

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

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

值得一提的是,Ruby 和 Python 都有做这种事情的工具(分别是eventmachinetwisted),但是 Node.js 做得非常好,而且从头开始。JavaScript 非常适合基于回调的并发模型,它在这方面表现出色。此外,能够使用客户端和服务器本地的 JSON 进行序列化和反序列化非常漂亮。

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

值得指出的是,Node.js 也非常适合在客户端/服务器之间重用大量代码的情况。流星框架使得这个非常容易,而且很多人都暗示这可能是网络发展的未来。我可以从经验中说,在 Meteor 中编写代码非常有趣,其中很大一部分是花更少的时间思考如何重构数据,因此在浏览器中运行的代码可以轻松地操纵它并将其传回。

这是一篇关于 Pyramid 和长轮询的文章,结果证明在 gevent 的帮助下很容易设置:TicTacToe 和 Long Polling with Pyramid

谢谢你...很棒的问答 ;-) 我也会考虑掌握一项伟大的技术,用于前端和后端开发的几个不同的技术;)
2021-03-13 08:48:30
我的简短回答是后台进程。请求和响应(包括rest API)都可以用任何其他语言和服务器来实现。所以对于那些想在 node.js 中转换他们的 web 项目的人来说。再想想也是一样的!将节点用作后台进程,例如使用 imap 阅读电子邮件、图像处理、将文件上传到云,或任何冗长或永无止境的进程,这些进程主要是面向事件的……
2021-03-18 08:48:30
为什么要使用长轮询?未来和套接字发生了什么
2021-03-23 08:48:30
是的,我认为认为 'node.js 特别适合需要从浏览器到服务器的持久连接的应用程序非常重要。- 例如聊天程序或互动游戏' 如果只是构建一个不一定需要用户/服务器通信的应用程序,那么使用其他框架开发就可以了,并且花费的时间会少得多。
2021-04-08 08:48:30

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

我还应该提到,与长轮询相比,Socket.IO 与 Node.js 相结合将进一步降低您的实时延迟。在最坏的情况下,Socket.IO 将回退到长轮询,而是使用 Web 套接字甚至 Flash(如果它们可用)。

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

此外,Ryan Dahl 在一次演讲中说,我曾经参加过,Node.js 基准测试在常规旧 HTTP 请求方面与 Nginx 相媲美。因此,如果我们使用 Node.js 构建,我们可以非常有效地为我们的普通资源提供服务,并且当我们需要事件驱动的东西时,它已准备好处理它。

此外,它一直都是 JavaScript。整个堆栈中的通用语。

只是有人在 .Net 和 Node 之间切换时的观察,系统不同区域的不同语言在上下文切换时有很大帮助。当我查看 Javascript 时,我在客户端工作,C# 表示应用服务器,SQL = 数据库。在整个 Javascript 中工作,我发现自己混淆了层,或者只是花费了更长的时间来进行上下文切换。这可能是整天在 .NET 堆栈上工作而在晚上使用 Noding 的产物,但它确实有所作为。
2021-03-15 08:48:30
有趣的是,跨文化个体在主流文化和本土文化之间转换时转换方言的做法被称为“代码转换”。
2021-03-16 08:48:30
就在前几天,我正在考虑如何.js以某种方式为不同的文件分配不同的颜色客户端绿色,服务器端蓝色。我自己一直在“迷失”。
2021-03-20 08:48:30

使用 NodeJS 的原因:

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

  • 单线程事件驱动系统是快速甚至还可以同时处理大量的请求时,也简单,相比传统的多线程的Java或ROR框架。

  • 可通过 NPM 访问的不断增长的软件包,包括客户端和服务器端库/module,以及用于 Web 开发的命令行工具。其中大部分都方便地托管在 github 上,有时您可以在那里报告问题并在数小时内修复!很高兴将所有内容都集中在一个屋檐下,具有标准化的问题报告和易于分叉。

  • 它已成为运行Javascript 相关工具和其他Web 相关工具(包括任务运行器、缩小器、美化器、linter、预处理器、捆绑器和分析处理器)的事实上的标准环境

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

使用 NodeJS 的原因

  • 它运行 Javascript,它没有编译时类型检查。对于大型、复杂的安全关键系统,或包括不同组织之间协作的项目,从长远来看,鼓励契约接口并提供静态类型检查的语言可能会为您节省一些调试时间(和爆炸)。(虽然 JVM 被卡住了null,所以请为你的核react堆使用 Haskell。)

  • 此外,NPM 中的许多包都有些原始,并且仍在快速开发中。一些旧框架的库已经经历了十年的测试和错误修复,现在非常稳定Npmjs.org 没有评估包的机制,这导致了或多或少做同样事情的包的激增,其中很大一部分不再维护。

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

  • 不断增长的包池可以使一个 NodeJS 项目看起来与下一个完全不同由于可用的选项数量众多(例如 Express/ Sails.js / Meteor / Derby,实现方式存在很大差异这有时会使新开发人员更难加入 Node 项目。加入现有项目Rails开发人员形成对比:他应该能够很快熟悉应用程序,因为鼓励所有 Rails 应用程序使用类似的结构

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

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

通过将 rails 与 node 进行比较,您将平台与框架混淆了。Rails 是Ruby 的框架,就像Sails 和meteor 是Javascript 的框架一样。
2021-03-12 08:48:30
@joeytwiddle 在处理大型复杂程序和静态类型检查时,像 Typescript 这样的东西不会帮助 Node.js 吗?
2021-03-14 08:48:30
@kervin,我同意一些基准测试会很棒,但我对在网上找到的内容感到失望。有些人认为 .NET 的性能可以Node相媲美,但这对您实际执行的操作至关重要。Node 可能擅长通过许多并发连接传递少量消息,但对于繁重的数学计算则不是那么好。良好的性能比较需要测试各种情况。
2021-03-16 08:48:30
@joeytwiddle 对于它的value,您可以使用stillmaintained.com来确定是否仍然维护 npm 包(因为大多数都在 github 上)。此外,npm searchnpm show会告诉你一个包的最后一个版本的日期。
2021-03-18 08:48:30
@nane 是的,我确实认为他们可以解决这个问题,但是您必须限制自己只使用以类型安全语言编写的库,或者接受并非所有代码库都是静态类型的。但有一个论点是:既然你应该为你的代码编写好的测试而不管语言是什么,那么即使对于动态类型的代码,你的置信度也应该相等如果我们接受这个论点,那么强类型的优势就会减少到有助于开发/调试时间、可证明性和优化
2021-04-03 08:48:30

简而言之:

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

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

我有一个使用 Node.js 的真实示例。我工作的公司有一个客户想要拥有一个简单的静态 HTML 网站。该网站用于使用PayPal销售一件商品,客户还希望有一个计数器来显示已售商品的数量。客户预计本网站将有大量访问者。我决定使用 Node.js 和Express.js框架制作计数器

Node.js 应用程序很简单。Redis数据库中获取已售商品数量,在商品售出时增加计数器并通过API将计数器值提供给用户

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

  1. 它非常轻巧且快速。该网站在三周内的访问量已超过 200000 次,最少的服务器资源已经能够处理这一切。
  2. 计数器真的很容易成为实时的。
  3. Node.js 很容易配置。
  4. 有很多module可以免费使用。例如,我发现了一个用于 PayPal 的 Node.js module。

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

有一些 PaaS,例如 nodejitsu 和 Heroku。或者您确实可以在 linux 机器上设置 nodejs,即来自亚马逊 ec2。见:lauradhamilton.com/...
2021-03-29 08:48:30
1,814,400 秒内 200,000 次访问。根本不相关。即使 bash 也可以在最慢的服务器上处理那么多请求。刮服务器。最慢的虚拟机。
2021-04-02 08:48:30
你如何主持这样的事情?那么你必须在生产服务器上设置 nodejs 吗?在 linux 中?
2021-04-03 08:48:30