2010-10-11 48 views
34

我是Node.js的新手,我一直在阅读关于基于Rhino框架的Narwhal。Narwhal和Node.js的区别?

我的问题:

  1. 如果我使用Node.js的,我可以用独角鲸和它的库/模块?
  2. 不是Narwhal IO阻塞的库/模块(为什么Node.js得到这个巨大的普及)?
  3. Node.js仅用于创建Web服务器,还是用于创建常规应用程序,就像Narwhal一样?

回答

49
  1. 如果您使用Node或Narwhal,只能使用与各自引擎兼容的包和模块。目前编写在两个引擎上工作的应用程序,包和模块都有很多细微之处。 Dojo的Kris Zyp花费了相当多的精力使他的软件包在两个系统上都能正常工作,我想不出其他人。

  2. Narwhal的输入和输出模块阻塞,就像Python,Ruby,Perl,C,Java等的标准库一样。

    然而,有一类应用程序无法用阻塞IO有效写入,例如在服务器的内存中保持其状态的游戏以及与众多客户端的有状态通信。只有实验才能揭示线程或事件循环是否对单个应用程序更好地执行。但是,在大多数编程语言和库生态系统中编写“均匀”应用程序更加困难和危险,因为使用任何阻塞IO可以快速消除使用非阻塞IO的好处,并且阻塞IO经常隐藏在体系结构层,甚至与操作系统接口一样低。节点令人兴奋,因为它创建了一个严格异步IO的生态系统,这使得它成为这类应用程序合理易于编写的第一个系统。

    支持者像道格·克罗克福德和马克·米勒认为,异步事件循环编程的方式应用程序应该,因为它更容易推理的数据流量,并发性和安全性在这些系统和盲目撰写此类子系统而不损害正确性或完整性。然而,如果你想利用JavaScript作为一种语言,但不想购买事件循环编程的额外复杂性,那么Narwhal就可以同时适用于Safari浏览器背后的JavaScript引擎JavaScriptCore和也在犀牛身上。使用Rhino可让您访问Google的AppEngine。 Narwhal旨在为您提供JavaScript引擎的灵活性,但并未考虑Node的IO模型。 Narwhal也被280 North软件生态系统广泛使用,用于为卡布奇诺Objective-J应用程序构建工具和服务器,如杰克和杰克。

  3. Node和Narwhal都可用于常规应用程序和Web服务器。节点特别适合网络客户端和服务器。 Narwhal特别适用于Unix风格的程序和类似CGI的Web服务器,并且可以在各种Web服务器上运行JSGI应用程序而无需改动。

编写既适用于Narwhal又适用于Node的应用程序很困难,但是可能的。编写适用于Narwhal和Node的“包”是可能的,但必须有意识地完成。如果一个软件包没有宣告它已经在Narwhal和Node上进行了设计和测试,你可以打赌它只能在其中一个上工作。

io:不使用IO子系统的模块,如解析器,格式器,编码器和解码器,特别适合于在Narwhal和Node之间共享代码。

软件包: NPM(Node Package Manager)和Tusk(Narwhal的软件包管理器)的打包方式有所不同。它们都使用package.json,但“依赖关系”对每个都有不同的含义。 Narwhal即将发布补丁,可以缓解这种不一致。当在Narwhal中安装包时,它们都共享相同的模块名称空间,如Ruby。使用NPM,每个软件包都有一个与软件包同名的模块名称空间的子树。

模块:节点和纳瓦尔都为CommonJS module specification提供了不同的扩展。

  1. 节点提供了额外的自由变量,如__dirname
  2. 节点允许将导出对象重新分配到module.exports = x
  3. Narwhal提供require.once(id, scope)用于执行一个模块(不管是否先前已经加载过),并在范围内使用额外的自由变量(有时错误地称为“全局变量”)。
  4. 节点不提供CommonJS module.path作为当前模块的文件名。
  5. Narwhal和Node提供了不兼容的系统来扩展模块加载器以处理模块的替代语言,如CoffeeScript和ObjectiveJ。
+1

“...一类应用程序无法通过阻止IO有效写入,例如维持服务器内存状态的游戏以及与众多客户端的有状态通信。“ 这似乎是一个强烈的声明 - 我同意NodeJs很可能更多适合写这些类型的应用程序,但不会说通常它们“不能有效地写入”线程和阻塞API。 – oberhamsi 2010-10-12 09:50:04

+1

“Narwhal的输入和输出模块阻塞,就像Python的标准库,Ruby,Tcl ......“我只想说Tcl的标准I/O是非阻塞的(或者更精确地说,可以以非阻塞的方式使用),并且自20世纪90年代以来一直如此。 – slebetman 2011-04-12 04:11:28

+0

A相关除了这个(老)问题之外,纳威尔似乎已经成为一个被遗弃的项目。 – 2013-10-13 14:23:21

-2

Node.js不应该与Narwhal相比,而应该与Rhino进行比较。像Rhino一样,Node.js是一个JavaScript解释器。

Node.js符合模块的CommonJS规范,所以它的所有库都是CommonJS兼容的。它看起来像Narwhal也是CommonJS兼容的,这意味着它们可以在Node中使用。

但首先看看Node的标准模块,因为似乎与Narwhal有很多重叠。另外,看看可用于Node.js的第三方的模块列表:


其他答案:

啊,我现在看到。 Narwhal的确像Node。你说过,纳瓦尔是一个把我抛弃的框架。我现在看到它不是。确实,介绍页面说,你可以在Narwhal解释器之上运行像Nitro这样的框架。

Narwhal和Node之间的区别基本上是Narwhal使用可插入JavaScript引擎架构,而Node只使用V8。这两个都是javascript“炮弹”(现在让我们称它们为避免与术语“解释器”混淆)。

我不确定可以将CommonJS库写入哪个平台并在另一个平台上使用它。我想当然所有的纯JS库都是交叉兼容的。节点确实使用非阻塞I/O模型,因此一些用于Narwhal的二进制模块可能无法在节点上正常工作。

尽管节点确实会强调回调风格编程(以最大限度地利用非阻塞I/O)。对于经验丰富的JS程序员来说,这不是问题,因为我们习惯于setTimeout(),XMLHttpRequest等。事实上,作为一名经验丰富的JS程序员,我更喜欢Node的风格。独角鲸的感觉太像C.


例子:

这就是我的意思是由不同的过独角鲸节点“感觉”。

在独角鲸,对啜文件的例子是:

var fs = require("file"); 
var data = fs.read(myfilename); /* code stops at this point 
           * until all data is read 
           */ 
/* process data here */ 

在Node.js的是:

var fs = require('fs'); 
fs.readFile(myfilename, function(err,data) { 
    /* process data here */ 
}); 

/* readFile returns immediately and code continues 
* executing while file is being read 
*/ 

就像setTimeout,在节点读取文件是异步的(代码需要等待硬盘寻找并读取数据,在此期间您可以运行其他代码段)。

+1

但是犀牛与V8不相媲美吗? – 2010-10-11 06:16:33

+0

是和不是。 Rhino.java与V8相当,Rhino.jar与Node.js相媲美。一个是引擎库,另一个是使库可执行的应用程序。 – slebetman 2010-10-11 06:22:41

+5

Node.js不是JavaScript解释器。 V8和Rhino一样是一个JavaScript解释器。 Node.js是V8的一个平衡I/O框架。维基百科对Node.js提供了相当好的描述:http://en.wikipedia.org/wiki/Node.js – jbeard4 2010-10-11 10:04:07

7

我只是将RingoJS添加到组合中。它是基于Rhino的CommonJS系统,但与Narwhal相比,它更加成熟(其主要作者多年来一直在开发其前身Helma),并且通过遵循这两个Git开发RingoJS似乎更加活跃。最近独角鲸的发展似乎有点缓慢。

1

如果你喜欢Narhwal的同步风格,你也可以用我的Common Node包,它允许你对节点运行同步独角鲸,RingoJS等CommonJS的兼容包以及JSGI的webapps。

相关问题