我对这种东西不熟悉,但最近我听到很多关于它有多好的东西 Node.js的 是。考虑到我一般喜欢使用jQuery和JavaScript,我不禁想知道如何决定何时使用Node.js.我想到的Web应用程序是这样的 Bitly - 收集一些内容,归档它。
从我过去几天所做的所有作业中,我获得了以下信息。 Node.js的
- 是一个命令行工具,可以作为常规Web服务器运行,并让一个人运行JavaScript程序
- 利用伟大的 V8 JavaScript引擎
- 当你需要同时做几件事时非常好
- 是基于事件的,所以很棒 阿贾克斯类似的东西可以在服务器端完成
- 让我们在浏览器和后端之间共享代码
- 让我们与MySQL交谈
我遇到的一些消息来源是:
考虑到Node.js几乎可以开箱即用 亚马逊的EC2 实例,我试图了解什么类型的问题需要Node.js,而不是任何强大的国王 PHP, 蟒蛇 和 红宝石。我知道这实际上取决于人们对语言的专业知识,但我的问题更多地涉及一般类别:何时使用特定框架以及它特别适合哪种类型的问题?
你做了很好的总结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和长金字塔轮询。
我相信Node.js最适合实时应用:在线游戏,协作工具,聊天室,或者其他用户需要立即看到一个用户(或机器人?或传感器?)对应用程序做什么的任何事情,没有页面刷新。
我还要提一下,Socket.IO与Node.js相结合,可以比长轮询更进一步减少实时延迟。作为最坏的情况,Socket.IO将回归长轮询,而是使用网络套接字甚至Flash(如果可用的话)。
但是我还应该提一下,使用Node.js可以更好地解决因线程而导致代码阻塞的任何情况。或者您需要应用程序进行事件驱动的任何情况。
此外,Ryan Dahl在一次谈话中说,我曾经参加过Node.js基准测试,与Nginx的常规旧HTTP请求密切相关。因此,如果我们使用Node.js构建,我们可以非常有效地服务我们的常规资源,当我们需要事件驱动的东西时,它就可以处理它了。
另外,它一直都是JavaScript。 Lingua Franca整个堆栈。
使用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会有什么...... :)
简而言之:
Node.js非常适合具有大量并发连接的应用程序,并且每个请求只需要很少的CPU周期,因为在执行函数期间会阻止事件循环(包含所有其他客户端)。
关于Node.js中的事件循环的一篇好文章是 Mixu的技术博客:了解node.js事件循环。
我有一个真实世界的例子,我使用Node.js.我工作的公司有一个客户希望拥有一个简单的静态HTML网站。本网站用于销售一件商品 贝宝 并且客户还希望有一个显示已售商品数量的柜台。客户预计会有大量访问者访问本网站。我决定使用Node.js和 Express.js 框架。
Node.js应用程序很简单。从a获取销售商品金额 Redis的 数据库,在商品售出时增加计数器,并通过商品向用户提供计数器值 API。
在这种情况下我选择使用Node.js的一些原因
- 它非常轻巧,快速。本网站在三周内访问量超过20万次,最小的服务器资源已经能够处理。
- 计数器很容易实时。
- Node.js很容易配置。
- 有很多模块可以免费使用。例如,我找到了PayPal的Node.js模块。
在这种情况下,Node.js是一个很棒的选择。
没有像银弹一样的东西。一切都带来了与之相关的一些成本。就像你吃油腻的食物,你会损害你的健康,健康的食物不会像油性食物一样含有香料。无论他们是否想要健康或香料,都是个人选择。
Node.js考虑在特定场景中使用的方式相同。如果您的应用不适合该方案,则不应将其视为您的应用开发。我只是想到了同样的想法:
何时使用Node.JS
- 如果您的服务器端代码需要很少的CPU周期。在其他世界中,您正在执行非阻塞操作,并且没有繁重的算法/作业,这会消耗大量的CPU周期。
- 如果您来自Javascript,并且在编写单线程代码时非常舒服,就像客户端JS一样。
何时不使用Node.JS
- 您的服务器请求取决于耗费大量CPU的算法/作业。
Node.JS的可扩展性考虑
- Node.JS本身并不利用底层系统的所有核心,默认情况下它是单线程的,你必须自己编写逻辑来利用多核处理器并使其成为多线程。
Node.JS替代品
但是,还有其他选项可用于代替Node.JS Vert.x 似乎非常有前途,并有许多额外的功能,如polygot和更好的可扩展性考虑。
另一个伟大的事情 我认为 没有人提到过Node.js是一个了不起的社区,包管理系统(npm)以及你可以包含的模块数量,只需将它们包含在你的package.json文件中即可。