javascript - nojs - npm node js




Narwhal和Node.js之間的差異? (3)

我是Node.js的新手,我一直在閱讀Narwhal,這是一個基於Rhino的框架。

我的問題:

  1. 如果我使用Node.js,我可以使用Narwhal及其庫/模塊嗎?
  2. Narwhal IO中的庫/模塊是不是被封鎖了(為什麼Node.js得到了這麼大的人氣)?
  3. Node.js只用於創建Web服務器,還是用於創建通用應用程序,就像Narwhal一樣?

  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。 使用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應用程序而無需進行任何更改。

編寫適用於Narwhal和Node的應用程序很困難,但可能。 編寫適用於Narwhal和Node的“軟件包”是可能的,但必須刻意完成。 如果一個軟件包沒有宣傳它已經在Narwhal和Node上進行了設計和測試,你可以打賭它只適用於其中一個。

io:不使用IO子系統的模塊,如解析器,格式化器,編碼器和解碼器,特別適合Narwhal和Node之間的代碼共享。

包: NPM(節點包管理器)和Tusk(Narwhal的包管理器)的包佈局有所不同。 它們都使用package.json,但“依賴”對每個都有不同的含義。 即將推出的Narwhal補丁允許它來解決這種不一致問題。 當在Narwhal中安裝軟件包時,它們都共享相同的模塊名稱空間,如Ruby。 對於NPM,每個包都有一個模塊名稱空間的子樹,其名稱與包的名稱相同。

模塊: Node和Narwhal都為CommonJS 模塊規範提供了不同的擴展。

  1. Node提供了額外的自由變量,如__dirname
  2. Node允許使用module.exports = x重新分配導出對象。
  3. Narwhal提供了require.once(id, scope)用於執行一次模塊(無論是否先前已加載),並在範圍內添加額外的自由變量(這些變量有時被錯誤地稱為“全局變量”)。
  4. Node不為當前模塊的文件名提供CommonJS module.path
  5. Narwhal和Node提供了不兼容的系統,用於擴展模塊加載器以處理模塊的替代語言,如CoffeeScript和ObjectiveJ。

不應將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/moduleshttp://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的風格。 獨角鯨感覺太像C了。

例子:

這就是我對Node over 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中讀取文件是異步的(您的代碼需要等待硬盤查找和讀取數據,在此期間您可以運行其他代碼段)。


我只想添加RingoJS 。 它是基於Rhino的CommonJS系統,但與Narwhal相比,它更加成熟(它的主要作者多年來一直在開發它的前身Helma )並且通過跟隨這兩個gits它的開發RingoJS似乎更加活躍。 如今,獨角鯨的發展似乎有點慢。





narwhal