为什么以及何时使用Node.js?

gio*_*_13 134 javascript server-side serverside-javascript node.js

可能重复:
如何决定何时使用Node.js?

对不起,如果我有点模棱两可,但我想了解使用Node.js而不是其他服务器端语言的真正优势.

我是一个JavaScript爱好者,所以我可能会玩Node.js,但我想知道我是否应该在我的项目中使用它.

Ray*_*nos 94

这是事件触发异步非阻塞I/O构建ontop的的V8.

因此,我们获得了V8的所有性能提升,这是Google JavaScript解释器.由于JavaScript性能竞赛尚未结束,您可以期待Google不断更新V8(免费)的性能.

我们有非阻塞I/O,这是执行I/O的正确方法.这基于事件循环并为您的I/O使用异步回调.

它为您提供了有用的工具,如创建HTTP服务器,创建TCP服务器,处理文件I/O.

它是一个低级别的高性能平台,可用于执行任何类型的I/O,而无需从头开始在C中编写整个内容.由于非阻塞I/O,它可以很好地扩展.

因此,如果您希望使用非阻塞I/O编写高度扩展且高效的应用程序,同时仍然使用高级脚本语言,则需要使用Node.js.如果需要,您可以通过在C中编写扩展来手动优化部分代码.

Node.js有很多OS库可以为你提供抽象,比如Express.js现在.

如果你想(慢)高级抽象为你做所有事情,你不想使用Node.js.你不想,如果你想使用Node.js的RAD.如果你不能信任一个年轻的平台,你不想使用Node.js,因为你必须自己编写大量代码来做构建到其他框架中的事情,或者因为你不能使用Node .js,因为API还不稳定,或者它是一个低于1.0的版本.

  • @Gerry RAD由一个非常高级的框架组成,它以非常小的灵活性为代价完成了工作.它基本上为你做了很多通用样板.node是一个低级库. (6认同)
  • @Gerry轨道没什么问题.这只是一个巨大的抽象.有折衷方案.我只是不会在节点顶部构建类似rails的东西,因为节点_有更好的patterns_. (6认同)
  • >"如果你想要RAD,你不想使用节点." 那你的意思是在Node中开发东西通常需要更长的时间吗? (4认同)
  • @Gerry取决于你对"框架"的定义.Express是一个非常有用的http框架,但仍然不能容纳RAD.我相信人们将cakephp和rails移植到节点.这些框架可能允许RAD,但也充满了糟糕的设计和反模式 (3认同)
  • 啊,反模式,因为它最初不是为节点构建的?说得通. (2认同)

Dav*_*ang 29

两个最常被引用的优点是:

  • JavaScript既是服务器端,也是客户端.学习的东西更少,上下文切换更少,并且能够在双方重用代码.
  • 使用非阻塞I/O和Chrome的V8引擎,提供快速,高度可扩展的服务器.

对我来说,最有趣的部分是这个地区发生的活动量.节点正在开发中有很多非常有趣的想法 - 请务必查看Node.js模块列表.

  • 可能会重新订购那些.代码重用并不是什么大不了的事.即兴非阻塞IO和真正快速可扩展的服务器是_big_交易. (6认同)

yoj*_*o87 18

当您(或者即使您不是)JavaScript爱好者时,您可以/应该使用Node.js有多种原因:

  • 它是一个低级,轻量级和独立的框架,它为服务器端环境带来了JavaScript的强大功能.
  • 如果您想了解更多更高层次的抽象,然后有大量的模块NPM包管理器,你可以找到各种各样的准备使用的应用程序.
  • 快速/无阻碍的开发过程 - 例如,您不需要大量额外的工具来开始编写严肃的东西.
  • 基于开源的大型社区,充满了爱好者和非常有才华的人.
  • 用于创建实时的面向Web的应用程序 - 这就是(近)未来的地方.

  • 您不必是JavaScript爱好者! (5认同)

Dem*_*cht 11

就个人而言,我最有可能在以下情况下使用Node.js:

  • 我想编写一个不使用HTTP协议的服务器.
  • 我正在为服务器实现进行原型设计.
  • 我正在编写一个不期望大量流量的服务器(尽管我从未在一个匹配的C++实现旁边描述一个Node.js实现).
  • 我想积极参与社区活动(显然增长很快).

  • @DemianBrecht我想你会发现node.js是一个_really_ fast服务器,可以处理流量的_lot_.如果你想要更好的东西,请在C中写一个HTTP服务器. (3认同)
  • @Raynos可能是因为我不能很好地解释自己.无论如何,我真的需要深入研究node.js :)我并不像我对整个系统架构一样担心优化问题.我意识到编写某些子系统脚本的好处,但是我无法看到在Javascript中开发整个系统框架很好地扩展了可扩展性,这就是为什么我提到你因转向使用a而遭受的损失.强类型,OO,编译语言作为您的基础. (3认同)
  • @DemianBrecht你不会失去任何远离强类型,OO和编译的东西.这只是一种不同的态度.你编写功能样式代码.您可以像在JavaScript中一样轻松地在C++中编写意大利面条维护噩梦.您也可以像在C++中一样在JavaScript中编写同样强大的可维护体系结构.JavaScript不是一种玩具语言.这是Scheme的样子. (3认同)
  • @DemianBrecht我可以在某些方面同意经典的C++风格OO允许您处理大型代码库,其中所有开发人员都具有一系列培训专业知识.至少我可以确认这是基于合理的原因,而不是无知.在节点中编写大型可维护的100k +代码库是一项巨大的任务.C++已经有了它的跟踪和错误阶段.你对SO的一些评论的权利不是要走的路,也许是关于几品脱的辩论? (3认同)
  • @Raynos我认为它可以简单地基于它正在使用V8的事实:)尽管如此,请原谅我的无知,但是imho,在构建大型服务器(比如游戏等)时,你会失去FAR太多键入的,OO,编译语言. (2认同)