我是 Node.js 的新手,我一直在阅读关于基于 Rhino 的框架的Narwhal 。
我的问题:
- 如果我使用的是 Node.js,我可以使用 Narwhal 及其库/模块吗?
- Narwhal I/O 中的库/模块不是被阻塞了吗(为什么 Node.js 如此受欢迎)?
- Node.js 是仅用于创建 Web 服务器还是用于创建通用应用程序,就像 Narwhal 一样?
我是 Node.js 的新手,我一直在阅读关于基于 Rhino 的框架的Narwhal 。
我的问题:
如果您使用的是 Node.js 或 Narwhal,请仅使用宣传与您各自引擎的兼容性的包和模块。目前,编写适用于两种引擎的应用程序、包和模块存在许多细微差别。Dojo 的 Kris Zyp 付出了相当多的努力来让他的包在这两个系统上都能运行,我想不出还有其他人。
Narwhal 的输入和输出模块是阻塞的,很像 Python、Ruby、Perl、C、Java 等的标准库。
然而,有一类应用程序无法通过阻塞 I/O 有效编写,例如将其状态保持在服务器内存中的游戏以及与众多客户端的有状态通信。只有实验才能揭示线程或事件循环是否对单个应用程序性能更好。但是,在大多数编程语言和库生态系统中编写“事件”应用程序更加困难和危险,因为使用非阻塞 I/O 的好处可以通过使用任何阻塞 I/O 和阻塞 I/O 快速消除。 O 经常隐藏在架构的各个层中,甚至低至操作系统接口。Node.js 令人兴奋,因为它正在创建一个严格异步 I/O 的生态系统,
像Douglas Crockford和 Mark Miller 这样的支持者认为,异步事件循环编程是大多数应用程序应该编写的方式,因为它更容易推理这些系统中的数据流、并发性和安全性,并且可以在不影响正确性或完整性的情况下盲目地组合这些子系统。
但是,如果您想利用 JavaScript 作为一门语言,但又不想购买事件循环编程的额外复杂性,Narwhal 旨在同时在 JavaScriptCore(Safari背后的快速 JavaScript 引擎)和Rhino上工作. 使用 Rhino 可以让您访问Google App Engine。Narwhal 旨在为您提供 JavaScript 引擎的灵活性,但它没有考虑 Node.js 的 I/O 模型。Narwhal 还被 280 North 软件生态系统广泛使用,用于为Jake和 Jack等Cappuccino Objective-J应用程序构建工具和服务器。
Node.js 和 Narwhal 都可用于一般应用程序和 Web 服务器。Node.js 特别适合网络客户端和服务器。Narwhal 特别适用于 Unix 风格的程序和 JSGI、类 CGI 的 Web 服务器,旨在无需更改即可在各种 Web 服务器上运行 JSGI 应用程序。
编写适用于 Narwhal 和 Node.js 的应用程序很困难,但可能。编写适用于 Narwhal 和 Node.js 的“包”是可能的,但必须刻意完成。如果一个包没有宣传它是在 Narwhal 和 Node.js 上设计和测试的,你可以打赌它只能在其中一个上工作。
io:不使用 I/O 子系统的模块,如解析器、格式化程序、编码器和解码器,特别适合 Narwhal 和 Node.js 之间的代码共享。
包: NPM(节点包管理器)和 Tusk(Narwhal 的包管理器)的包布局方式有所不同。它们都使用 package.json,但“依赖项”对每个都有不同的含义。Narwhal 即将发布一个补丁,允许它容忍这种不一致。当包安装在 Narwhal 中时,它们都共享相同的模块名称空间,如 Ruby。使用 NPM,每个包都有一个与包同名的模块名称空间的子树。
模块: Node.js 和 Narwhal 都为 CommonJS模块规范提供了不同的扩展。
Node.js 提供了额外的自由变量,例如__dirname
.
Node.js 允许以module.exports = x
.
Narwhalrequire.once(id, scope)
允许在范围内使用额外的自由变量(这些有时被错误地称为“全局变量”)执行一次模块(无论它是否先前已加载)。
Node.js 没有为当前模块的文件名提供CommonJS module.path
。
Narwhal 和 Node.js 提供了不兼容的系统来扩展模块加载器以处理模块的替代语言,例如CoffeeScript和 Objective-J。
如果你更喜欢 Narhwal 的同步风格,你也可以使用我的Common Node包,它允许你在 Node.js 上运行同步的 Narwhal、RingoJS 和其他 CommonJS 兼容包以及JSGI Web 应用程序。
Node.js 不应与 Narwhal 相提并论。相反,它应该与Rhino进行比较。和 Rhino 一样,Node.js 是一个 JavaScript 解释器。
Node.js 符合CommonJS模块规范,因此它的所有库都与 CommonJS 兼容。看起来 Narwhal 也兼容 CommonJS,这意味着它们可以在 Node.js 中使用。
但首先看一下 Node.js 的标准模块,因为那里似乎与 Narwhal 有很多重叠。另外,查看可用于 Node.js 的第三方模块列表:http: //github.com/ry/node/wiki/modules
补充回答:
啊,我现在明白了。Narwhal 确实像 Node.js。你说独角鲸是一个让我失望的框架。我现在看到它不是。事实上,介绍页面说您可以在 Narwhal 解释器之上运行 Nitro 等框架。
Narwhal 和 Node.js 的区别基本上是 Narwhal 使用可插拔的 JavaScript 引擎架构,而 Node.js 只使用V8。两者都是 JavaScript 的“shell”(为了避免与术语“解释器”混淆,我们暂时称它们为“解释器”)。
我不确定为任一平台编写的 CommonJS 库并在另一个平台上使用它能走多远。我想肯定所有纯 JavaScript 库都是交叉兼容的。Node.js 确实使用非阻塞 I/O 模型,因此 Narwhal 的某些二进制模块可能无法在 Node.js 上正常工作。
Node.js 确实强调回调样式编程(以最大限度地利用非阻塞 I/O)。对于一个经验丰富的 JavaScript 程序员来说,这不是问题,因为我们已经习惯了setTimeout()
,XMLHttpRequest
等等。事实上,作为一个经验丰富的 JavaScript 程序员,我有点喜欢 Node.js 的风格。独角鲸感觉太像 C.
例子:
这就是我所说的 Node 与 Narwhal 不同的“感觉”。
在 Narwhal 中,slurping 文件的示例是:
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.js 中读取文件是异步的(您的代码需要等待硬盘寻找和读取数据,在此期间您可以运行其他代码段)。