2012-09-08 33 views
1

我想知道是否有人試圖將編譯實現CommonJS API(require())的JavaScript文件編譯成本地Java代碼。將需要CommonJS功能的JavaScript編譯爲本地Java

我現在有一個網站,我的建築,將使用類似這樣的一個文本編輯器,計算器開源(WMD編輯器的端口): http://code.google.com/p/pagedown/

該項目自帶一些JavaScript文件,它將編輯器的標記語言清理並轉換爲有效的HTML。

在Rhino 1.7R4上玩了一段時間後,我已經設法在運行時加載JavaScript文件/模塊,並且能夠在需要時執行require函數。

但是,我寧願將這些腳本預編譯爲本機Java代碼。我已經成功地編譯腳本單不使用CommonJS的功能,下面這個犀牛DOC:

https://developer.mozilla.org/en-US/docs/Rhino/JavaScript_Compiler

但我在茫然,編譯實現CommonJS的功能多依賴腳本的正確方法,而犀牛本身並沒有很好的記錄。

這個想法是有本地Java代碼的標記轉換和sanitisation,沒有編寫/維護兩個不同的代碼庫的轉換成本(通過只是將JS轉換爲JAVA)。

乾杯

+0

可能重複(http://stackoverflow.com/questions/11074836/resolving-modules-using-require-js-and-java-rhino ) –

回答

0

RingoJS可以做這樣的事情:

林戈實現了CommonJS的模塊規範。簡而言之,這意味着:

每個JavaScript文件都被視爲一個生活在自己頂級範圍內的模塊。

附加到模塊導出對象的任何函數或屬性都將被公開。

require()函數返回模塊的exports對象。

如果給定的標識符字符串以./或../開頭,Ringo的模塊加載程序將搜索文件並嘗試加載它。因此require('./ foo')建議Ringo加載文件./foo.js作爲模塊。

否則Ringo會在模塊路徑的每個文件夾中查找模塊。

模塊路徑是Ringo將查找模塊的標準位置的列表。

模塊路徑可以通過以下方法進行設置:

設置RINGO_MODULE_PATH環境變量。

設置ringo.modulepath Java系統屬性。

對ringo命令行工具使用-m或--modules選項。

在JsgiServlet中使用模塊路徑servlet初始參數。

將要素添加到require.paths或從Ringo內部刪除類似數組的屬性。

軟件包提供了將幾個模塊和其他資源捆綁到一個單元中的方法。包是包含package.json包描述符文件的目錄。在的package.json描述符中的主要屬性是由Ringo的模塊加載器識別爲主要切入點模塊:

{ 
    "main": "lib/main.js" 
} 

如果一個模塊ID直接解析爲一個程序包目錄的package.json定義一個主要的屬性,Ringo會嘗試加載指定的資源。主屬性的值必須是相對於包根的路徑。

如果模塊ID解析爲不包含package.json文件的目錄,或者package.json未定義主屬性,則Ringo將嘗試在該目錄中加載文件index.js。

如果模塊id的一部分解析爲包目錄,Ringo將嘗試解析該包的lib目錄的id的剩餘部分。 lib目錄的位置可以使用package.json中的directories.lib屬性重寫。

{ 
    "directories": { 
     "lib": "new-lib" 
    } 
} 

的CommonJS的模塊規範保持故意小。 Ringo爲出口和進口產品提供了一些額外的細節。使用這些代碼的缺點是代碼與Ringo綁定,但將代碼轉換爲「純粹的」CommonJS相對容易,並且還有一個用於此目的的命令行工具。

一個Ringo擴展是包含功能。這與require相似,但不是將其他模塊的exports對象作爲整體返回,而是直接將其每個屬性複製到調用模塊的作用域,使它們像本地定義的那樣可用。

包括非常適合外殼工作和快速腳本,其中打字經濟至關重要,這就是它的意義。將它用於大型,長期生活的程序通常不是一個好主意,因爲它隱藏了程序中使用的頂級函數的起源。

爲此,它更建議使用需要組合使用JavaScript 1.8解構賦值明確包括在局部範圍從另一個模塊中選擇屬性:

var {foo, bar} = require("some/module"); 

以上陳述進口直接在調用範圍內由「some/module」導出的API的「foo」和「bar」屬性。

用Ringo編寫命令行腳本非常簡單。

ringo [script-file] [script-arg1] [script-arg2] ... 

林檎加載腳本文件,並提供經由系統模塊的args數組參數:每個任意的JavaScript文件可以爲[腳本文件]參數向林檎命令被傳遞。 args數組中的第一個元素是腳本文件的名稱。

參考