Why and when to use Node.js?
Possible Duplicate:
How to decide when to use Node.js?
抱歉,如果我有点含糊不清,但是我试图理解使用node.js而不是其他服务器端语言的真正优势。
我是一个JavaScript爱好者,所以我可能会玩node.js,但我想知道是否应该在我的项目中使用它。
- 可能想看看这个视频
- @Raynos感谢视频分享。
- @kjy112我推荐你谷歌视频搜索"ryan dahl node.js",应该有4个。一切都好。
- zgadzaj.com/…
- 我觉得奇怪的是,这些答案中没有一个能与目前最具可比性(且使用最广泛)的替代方案node.js进行比较/对比,php!
它是发生在V8的异步非阻塞I/O构建本体上的。
所以我们有了V8的所有性能增益,它是GoogleJavaScript解释器。由于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的操作系统库可以提供抽象,比如express.js和now。
如果您希望(缓慢的)高级抽象为您做任何事情,就不希望使用node.js。如果需要rad,则不想使用node.js。如果你不能信任一个年轻的平台,你不想使用node.js,要么是因为你必须自己编写大量的代码来做其他框架中内置的事情,要么是因为你不能使用node.js,因为API还不稳定,要么是Sub1.0版本。
- >"如果需要rad,就不想使用node。"这是否意味着在node中开发东西通常需要更长的时间?
- @GerryRad由一个非常高级别的框架组成,它以很少的灵活性为代价为您做了很多工作。它基本上为你做了很多通用的样板文件。节点是一个低级库。
- 好的,谢谢你的回答。尽管使用节点框架可能会改变这一点?
- @Gerry取决于你对"框架"的定义。Express是一个非常有用的HTTP框架,但仍然不适应RAD。我相信人们把cakephp&rails移植到节点上。这些类型的框架可能允许RAD,但也充满了糟糕的设计和反模式
- 我懂了。在非主题注释中,您是否有一个链接描述了您提到的Rails中的反模式。我现在正在学习Rails,所以我很好奇。
- @格瑞,铁轨没什么问题。这只是一个巨大的抽象。这是一种权衡。我只是不想在节点顶部构建类似Rails的东西,因为节点有更好的模式。
- 因为它不是为节点构建的,所以它是反模式?有道理。
- 通常,您在Java、PHP、Python、Cyz中编写代码,以"阻塞"传统方式,这意味着当任务执行时,其他任务必须等待它在Nodejs完成(队列中),基本概念是"非阻塞"方式,这意味着当任务执行时,其他任务不必等待它完成。
- imho,"服务器端javascript"的主要"替代"是php。虽然你的答案很有信息性,但我注意到它并没有解决这个问题。
引用最多的两个优点是:
- javascript既是服务器端,又是客户端。要学习的东西更少,上下文切换更少,并且能够跨双方重用代码。
- 使用非阻塞I/O和Chrome的V8引擎,提供快速、高度可扩展的服务器。
不过,对我来说,最有趣的部分是这一领域发生的活动量。node的开发中有很多非常有趣的想法——一定要查看node.js模块的列表。
- 可能需要重新订购。代码重用没什么大不了的。事件非阻塞IO和一个真正快速可扩展的服务器是一件大事。
- 我们几乎必须使用JavaScript客户端。我认为,当有比Python更好的语言可用时,使用IT服务器端是一个缺点。
当你是(或者即使你不是)一个javascript爱好者时,你可以/应该使用node.js有很多原因:
- 这是一个低级、轻量级和独立的框架,它为服务器端环境带来了JavaScript的强大功能。
- 如果您喜欢更高级别的抽象,那么有大量的模块和NPM包管理器,您可以在其中找到各种现成的应用程序。
- 快速/无阻碍的开发过程-例如,您不需要大量的额外工具来开始编写重要的东西。
- 大型开放源码社区,充满了狂热者和非常有才华的人。
- 专为创建面向Web的实时应用程序而设计—这正是(不久的)未来所在。
就我个人而言,我最有可能在以下情况下使用node.js:
- 我想写一个不使用HTTP协议的服务器。
- 我正在构建一个服务器实现的原型。
- 我正在编写一个不希望有大量流量的服务器(虽然我从来没有对NoDE.js实现作一个描述,比如说,一个匹配的C++实现)。
- 我想在社区里活跃起来(很明显,这个社区发展得很快)。
- @demianbrecht我想您会发现node.js是一个非常快速的服务器,可以处理大量的流量。如果你想要更好的东西,用C语言手工编写一个HTTP服务器。
- @Raynos我认为它可以简单地基于这样一个事实:它使用的是V8引擎。我说过,请原谅我的无知,但我不知道,在构建大型服务器(比如游戏等)时,在强类型、OO、编译语言中会损失太多。
- @demianbrecht从什么时候开始是javascript强类型&;compiled;)。对于大型服务器,您要做的是使用JavaScript编写易于维护的脚本,并通过使用C库扩展节点手动优化代码的某些部分。比如你如何使用Lua。
- @雷诺斯可能是我解释得不够好。无论如何,我真的需要深入研究node.js:)我不担心优化,因为我是整个系统架构。我认识到编写一些子系统脚本的好处,但是我看不到用JavaScript开发一个完整的系统框架能够很好地扩展自己,等等,这就是为什么我提到了您会因为使用一种强类型的OO编译语言作为基础而遭受的损失。
- 然而,我可以看到,用C++或Java编写自己的服务器,然后将V8引擎集成到脚本子系统中(使用V8作为LUA解释器的替代)。
- 在任何情况下,它都很有趣,投资回报率极高,并且已经有了大量的追随者:)
- @德米安布雷希特,你不会失去任何远离强类型、OO和编译的东西。只是态度不同而已。您正在编写功能样式代码。你可以像在JavaScript中一样轻松地在C++中写意大利面条维护噩梦。你也可以在C++中用JavaScript编写一个同样强大的可维护体系结构。javascript不是一种玩具语言。这是个计划。
- @雷诺斯,我同意这不是一种玩具语言,在过去的几年里,它肯定取得了长足的进步(不是语言本身,而是我们如何使用它)。我也同意,你可以找到可怕的意大利面条代码写在C++中。但是,与基于原型的语言相比,使用真正的OO语言的全部功能的架构良好的系统总是更容易维护、扩展和调试。实际上,这是一个完全主观的对话,接近宗教性(旧(ER)学校与新学校?);)我觉得我们只能同意不同意;)
- @德米安布莱希特,我还是要说你错过了整个功能性进近艇。是的,古典OO比原型更强大。但我们有一流的功能。你可以通过传递函数和使用闭包来编写同样强大的代码。我会说,正是你缺乏对写得好的功能架构的了解,才导致了这一点。现在关于调试,您有一个有效的观点。EventLoop会终止堆栈,这是一个已知问题,节点团队正在处理此问题。还有你的建议,没有好的C架构;)
- @雷诺斯-这两种方法都有其优缺点。是的,您可以编写同样强大的代码。是的,你可以破解任何语言,创建可怕的代码。我接触过功能和OO架构,并听取过支持和反对这两者的论据。我自己的经验让我相信,当你处理数十万行代码的代码库时,OO架构似乎更容易处理,特别是当你在团队环境中工作时,当你同时处理"人"变量时,比如营业额和培训。
- [继续]但是,所有的论点都是非常主观的,虽然这是一个很好的讨论,而且我相信随着越来越多的人加入到节点(和其他功能架构)的潮流中,很多人都会有这样的想法,但是我们中的任何一方都需要更多的评论来动摇;)
- 我可以在一些方面同意经典C++风格的OO允许你处理大的代码库,在那里所有的开发人员都有一系列的培训专长。至少我可以确认这是基于合理的理由,而不是无知。在节点中编写大型可维护的100k+代码库是一项艰巨的任务。C++已经有了它的跟踪和错误阶段。你的权利,虽然有一些评论,所以不是去的方式,也许是一个关于两品脱的辩论?
- @雷诺斯-洛尔-你在温哥华的任何时候:)
- @德米安布莱希特,那不好。不过你在伦敦的时候告诉我。
- 我只是想指出,强类型OO和作为第一类对象方法的函数不是互斥的。我认为JS和其他脚本语言真正擅长的地方是它们使语法更加简洁。例如,在Java中编写匿名方法是缓慢而丑陋的!