Narwhal和Node.js之间的区别?

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

我的问题:

  1. 如果我使用Node.js,我可以使用Narwhal,它是库/模块?
  2. 不是Narwhal IO中的库/模块被阻塞(为什么Node.js得到了这个巨大的普及)?
  3. Node.js仅用于创buildWeb服务器还是用于创build一般应用程序,就像Narwhal一样?
  1. 如果您使用的是Node或Narwhal,则只能使用与各自引擎兼容的包和模块。 目前在编写在两个引擎上工作的应用程序,包和模块都有很多细微之处。 Dojo的Kris Zyp已经花费了相当多的精力使他的软件包在两个系统上都能正常工作,我想不出其他人。

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

    但是,有一类应用程序无法有效地用阻塞IO来编写,例如在服务器的内存中保持其状态的游戏以及与众多客户端的有状态通信。 只有实验才能揭示线程或事件循环是否对个别应用程序更好地执行。 但是,在大多数编程语言和库生态系统中编写“应用程序”是非常困难和危险的,因为使用任何阻塞IO可以快速避免使用非阻塞IO的好处,阻塞IO经常隐藏在架构层,甚至低至操作系统界面。 节点是令人兴奋的,因为它正在创build一个严格的asynchronousIO的生态系统,这使得它成为这类应用程序合理编写的第一个系统。

    像Doug Crockford和Mark Miller这样的支持者认为,asynchronous事件循环编程是大多数应用程序编写的方式,因为更容易推理这些系统中的数据stream,并发性和安全性,并在不影响正确性或完整性的情况下盲目编写这些子系统。

    然而,如果你想利用JavaScript作为一种语言,但又不希望陷入事件循环编程这个额外的复杂性,那么Narwhal就可以同时在JavaScriptCore,Safari后面的快速JavaScript引擎和Rhino上运行。 使用Rhino可以访问Google的AppEngine。 Narwhal旨在为您提供JavaScript引擎的灵活性,但并未考虑Node的IO模型。 Narwhal也被280 North软件生态系统广泛用于构build卡布奇诺Objective-J应用程序的工具和服务器,例如Jake和Jack。

  3. Node和Narwhal都可以用于一般应用程序和Web服务器。 节点特别适合于networking客户端和服务器。 Narwhal特别适用于Unix风格的程序和JSGI,类CGI的Web服务器,并且被devise为在不改变的情况下在各种Web服务器上运行JSGI应用程序。

编写适用于Narwhal和Node的应用程序是困难的,但是可能的。 为Narwhal和Node编写“软件包”是可能的,但必须刻意去做。 如果一个软件包没有宣告它已经在Narwhal和Node上进行了devise和testing,那么你可以打赌它只能在其中一个上工作。

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

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

模块: Node和Narwhal都为CommonJS 模块规范提供了不同的扩展。

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

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

如果你喜欢Narhwal的同步风格,你也可以使用我的公共节点包,它允许你运行同步的Narwhal,RingoJS和其他CommonJS兼容包以及Node上的JSGI webapps。

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

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

但首先看看Node的标准模块,因为似乎与Narwhal有很多重叠。 另外,请看Node.js的第三方模块列表: http : //github.com/ry/node/wiki/modules


附加答案:

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

Narwhal和Node的区别基本上是Narwhal使用可插拔的JavaScript引擎架构,而Node只使用V8。 这两个都是javascript的“炮弹”是正确的(让我们打电话给他们,以避免与“解释器”这个词混淆)。

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

节点虽然强调callback风格编程(以最大限度地利用非阻塞I / O)。 对于经验丰富的JS程序员来说,这不是一个问题,因为我们习惯于setTimeout()XMLHttpRequest等。事实上,作为一个经验丰富的JS程序员,我更喜欢Node的风格。 Narwhal觉得太像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一样,在Node中读取文件是asynchronous的(您的代码需要等待硬盘寻找和读取数据,在此期间您可以运行其他代码)。