Narwhal和Node.js之间的差异?

时间:2010-10-11 06:10:59

标签: javascript node.js rhino narwhal

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

我的问题:

  1. 如果我使用Node.js,我可以使用Narwhal及其库/模块吗?
  2. Narwhal IO中的库/模块是不是被封锁了(为什么Node.js受到了极大的欢迎?)
  3. Node.js仅用于创建Web服务器,还是用于创建常规应用程序,就像Narwhal一样?

4 个答案:

答案 0 :(得分:49)

  1. 如果您使用的是Node或Narwhal,请仅使用宣传与各自引擎兼容的软件包和模块。目前在编写适用于两个引擎的应用程序,包和模块方面存在许多细微差别。来自Dojo的Kris Zyp付出了相当大的努力,使他的软件包在两个系统上运行,我无法想到其他任何人。

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

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

    像Doug Crockford和Mark Miller这样的支持者认为,异步事件循环编程是应该编写大多数应用程序的方式,因为它更容易推理这些系统中的数据流,并发性和安全性,以及盲目地撰写这样的子系统而不损害正确性或完整性。

    但是,如果你想利用JavaScript作为一种语言,但又不想购买事件循环编程的额外复杂性,那么Narwhal可以用于JavaScriptCore,Safari背后的快速JavaScript引擎,以及在犀牛。使用Rhino可以访问Google的AppEngine。 Narwhal旨在为您提供JavaScript引擎的灵活性,但它没有考虑Node的IO模型。 Narwhal还广泛用于280 North软件生态系统,用于构建工具和服务器,用于Cappuccino Objective-J应用程序,如Jake和Jack。

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

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

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

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

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

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

答案 1 :(得分:7)

我只想添加RingoJS。它是基于Rhino的CommonJS系统,但与Narwhal相比,它更加成熟(它的主要作者多年来一直在开发它的前身Helma)并且通过跟随两个gits它的开发RingoJS似乎更加活跃。如今,独角鲸的发展似乎有点慢。

答案 2 :(得分:1)

如果您更喜欢Narhwal的同步样式,您还可以使用我的Common Node包,它允许您在Node上运行同步Narwhal,RingoJS和其他CommonJS兼容包以及JSGI webapps。

答案 3 :(得分:-2)

不应将Node.js与Narwhal进行比较,而应将其与Rhino进行比较。和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是一个让我失望的框架。我现在看到它不是。实际上,介绍页面说你可以在Narwhal解释器之上运行像Nitro这样的框架。

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

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

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


示例:

这就是我对Node over Narwhal的不同“感觉”的意思。

在Narwhal中,诽谤文件的例子是:

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中的文件是异步的(您的代码需要等待硬盘查找和读取数据,在此期间您可以运行其他代码段。)