Node.js有何独特之处?[关闭]


48

最近,Node.js得到了很多好评。我不是一个经常接触网络应用程序的开发人员。从对Nodes.js的裸露理解中,它的优点是:我们只有一个线程可以处理多个连接,提供基于事件的体系结构。

但是,例如在Java中,我只能使用NIO / AIO创建一个线程(据我的理解,这是非阻塞API),并使用该线程处理多个连接,并且我提供了一个基于事件的体系结构来实现数据处理逻辑(通过提供一些回调等不那么困难)?

鉴于JVM是比V8更成熟的VM(我希望它也可以运行得更快),并且基于事件的处理体系结构似乎很难创建,我不确定Node.js为何吸引了如此多的关注。我错过了一些要点吗?


3
我想知道为什么它被否决了...我觉得这个问题更多是编程讨论,所以我没有放在stackoverflow中。我也尝试搜索类似的主题,但只找到有关Nodes.js强度的信息,但我的问题是我真的不明白为什么“强度”如此独特(我仍然找不到)
Adrian Shum

6
尝试在Java中实现该模式。当然可以。但是您会看到一件事:Java中非常冗长:您需要大量的回调,这几乎总是意味着创建新类。这听起来像是个小问题,但是在大型程序中,它很快就会变得丑陋和无用。
约阿希姆·绍尔

6
Java回调很容易变得笨拙-与Java IMO中相比,在Java中调试和重构此类意大利面条要容易得多。
funkybro 2012年

5
@AdrianShum:这是一个斜线效果,任何与团队思维方式不符的东西都会被否决-像在/上赞扬Microsoft。
gbjbaanb 2012年

3
我很惊讶没有看到任何人提到炒作。
deadalnix

Answers:


33

尽管该概念确实可以用多种语言实现(并且如dodgy_coder所述,但至少已在Ruby和Python中实现),但它并不像您所说的那么琐碎。

的确,Java具有非阻塞IO API。因此,您可以以非阻塞方式进行原始磁盘/网络IO。但是,每个以某种方式包装处理 IO的API都必须以非阻塞方式实现。每个XML解析器,每个数据库驱动程序,每个文件格式转换器都需要编写以支持非阻塞IO。因为如果单个库阻塞了这种模式,那么这会使您的服务器性能降低到难以接受的程度。

Node.js具有该库基础结构,因为它总是这样设计的:每个努力变得流行的库必须提供异步API,否则将不被使用。


18
是的 换句话说:Node.js最重要的优势是ECMAScript最重要的劣势:令人难以置信的ECMAScript标准库。由于Node.js开发人员无论如何都必须彻底改造每个轮子,因此他们有机会以正确的方式进行改造。
约尔格W¯¯米塔格

4
嗯,据我所知,ECMAScript始终被设计为嵌入式语言,因此不需要任何类型的OS级API(即使网络IO大多也被抽象化了)。的确确实是Node.js的优势。
约阿希姆·绍尔

“每个努力变得流行的库都必须提供异步API,否则将不会使用它。”我认为这正是我所寻找的。是否有任何资源可用于研究如何在Node.js中为XML解析和数据库访问提供异步api?
Adrian Shum 2012年

1
通常,@ AdrianShum寻找事件驱动的编程示例。特定的实现可以用多种语言找到。除了Node.js模块之外,您还可以查看Python中的Twisted示例,twistedmatrix.com / trac / wiki,Perl中的POE示例,poe.perl.org和Ruby中的EventMachine,github.com
eventmachine /

19

可能的主要原因是,它使用JavaScript编写了诸如Web服务器,Web应用程序或Web服务之类的服务器端组件。这将传统的前端(客户端)开发语言JavaScript与服务器端语言统一在一起。

您是对的-使用Reactor模式不是唯一的事实-在使用其他语言和框架(例如Ruby的EventMachine或Python的Twisted)之前就已经做到了。


5
很少有技术具有真正独特的功能,独特性来自其特殊的他们所有的功能组合
JK。

1
同意,这里有所有主要语言都支持它的库的列表
。Wikipedia

10

我要给出的三个主要原因是:

  1. 非阻塞IO /异步IO。这在网络上和以前的海报中无处不在。我要贡献的一件事是,将代码设计为显式地假定异步行为有助于编译器引擎最大限度地利用硬件。是的,许多JIT编译器和超线程处理器采用同步代码并帮助并行执行。当然,这是尽力而为的方法。相反,显式地为异步io构建应用程序,则可以确保引擎和硬件可以最大化代码的执行时间。诚然,我没有可量化的数据来证明这一点,但是这让我感到内心的温暖。

  2. 客户端和服务器的单一代码库。这具有许多优点:通过能够将业务逻辑从服务器转移到客户端来帮助优化数据中心成本;帮助重用业务逻辑/数据验证;降低了支持产品所需的开发人员技能的复杂性(与Python和javascript相比)。

  3. 进入门槛低。在许多方面,Javascirpt类似于Yester Year的Basic,Pascal和Perl。开始编写代码非常容易,并且不需要很多领域知识。通过吸引更多的Jr开发人员并加快项目开发的进度,这也有助于降低开发成本。[当然,您需要克服那些认为编程语言应该很难排除那些功能低下的开发人员的思想家]


我不确定我是否建议完全使用jr建立一个Node团队。JS开发人员。在更多的jr级Web / UI项目中,架构并不是我们真正需要考虑的事情,即使您可以相对地获得结果,JS也需要花费很长时间才能真正擅长于长期构建,就像其他任何语言一样在较不复杂的项目上以比典型水平低的速度获得快速的经验。
埃里克·雷彭

我同意@ErikReppen; 一个完全由初级开发人员(无论语言如何)组成的建筑团队就像完全由擅长建造椅子,桌子和狗屋的木匠设计和建造房屋。
2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.