2010-10-11 17 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。

相關問題