Mozilla Rhino 和 Node.js 兼容嗎?

Mozilla Rhino 和 Node.js 算是競爭關係嗎?


這個問題用今天的視角來回答或許可以有不同的答案。

Mozilla Rhino是一個純JavaScript語言的實現;而Node.js是一套JavaScript程序的運行時環境,不但包括由V8提供的JavaScript核心語言的實現,還包括豐富的庫,最有特點的就是其基於事件的I/O庫。用一句話描述Node.js就是其廣告詞之一:「Evented I/O for V8 JavaScript」。

那麼為什麼Rhino會被跟Node.js放在一起討論?很明顯這是來自在伺服器端使用JavaScript編程的需求。
基於JVM的語言實現是伺服器端程序的流行選擇之一,而Rhino正是用Java實現、運行在JVM上的JavaScript引擎,可以無縫使用Java豐富的核心庫和第三方庫,所以有不少基於Rhino的伺服器端JavaScript解決方案。
而Node.js則是基於Google V8 JavaScript引擎,自己實現I/O等核心庫,後來開始流行基於NPM來管理各種第三方庫,成為當下流行的新興伺服器端JavaScript解決方案。

可以參考這個Wiki頁面來看伺服器端JavaScript都有哪些選擇:Comparison of server-side JavaScript solutions

回到樓主的直接問題:Rhino是否兼容Node.js。答案是:不兼容。兼容Node.js意味著要提供與其相同的基於事件的核心庫封裝,而Rhino只是個純JavaScript引擎,並不提供Node.js的核心庫API。
有個比較出名的基於Rhino的伺服器端JavaScript框架,由Hannes Wallnofer編寫的RingoJS,既提供了非同步I/O的API,也可以使用傳統Java的同步I/O,這個與Node.js可以說得上是競爭關係的。可參考Hannes自己發表的對比介紹:RingoJS vs. Node.js: Runtime Values

但現在在JVM上有了新的選擇:Oracle新研發了Nashorn,一個新的、替代Rhino的、基於JVM的JavaScript引擎。在此基礎上Oracle還研發了Node.jar,一個基於Nashorn的Node.js兼容實現。這與原生Node.js構成直接競爭的關係,恐怕是樓主最有可能感興趣的東西。


不知道你想問什麼?Rhino是一個用Java寫的JavaScript引擎,而Node.js是伺服器端JavaScript環境,使用的是V8引擎。兩者是不同的東西,不存在直接的競爭關係,也談不上兼容不兼容。


Rhino、v8、spidermonkey 才是一類東西。node.js 使用的是 v8。Mozilla 為什麼在有了 spidermonkey 之後還用 Java 寫個 Rhino 呢?我覺得是為了方便在 Java 中使用,所以它的應用領域就不同。
spidermonkey 相對於 v8 來說,支持的標準更新一些,具體版本不記得了,反正可以 var [a, b] = [1, 2] 這樣,應該也支持 let (和在火狐里一樣)。


推薦閱讀:

TAG:JavaScript | Mozilla | Nodejs | Rhino |