2013-10-21 55 views

回答

6

我問犀牛郵件列表上一個非常類似的問題了一會兒回來,這裏是孫大信的(犀牛工程師)回覆:

來源:A. Sundararaj的

要:犀牛-dev的@ openjdk.java.net

我忘了補充。 Nashorn不包含任何內置模塊系統。 但是,如果模塊系統是純JS + Java,則必須可以在nashorn上運行 。

犀牛支持「負荷」和 「loadWithNewGlobal」(加載腳本,但到新的全局範圍)(從URL,文件,資源負載腳本) 元,除了好老「EVAL」。因此,它應該是 任何模塊系統都可以在pure JS或可能帶有一些Java代碼的nashorn之上實現。

-Sundar

5

我一直在尋找了一段時間這樣的實現。我一直在使用Rhino-Require的補丁版本。雖然犀牛聲稱是CommonJS兼容,AFAIK,它只實現了模塊,而不是軟件包(package.json)不能被解析。 RingoJS應該是兼容的。但是Nashorn永遠不會是see

後來,甲骨文宣佈項目阿凡達依靠Avatar.jshere。這是非正式名爲Node.jar的官方項目。但截至目前,你必須自己編譯它。該項目非常年輕。

另一個非常年輕的項目是Nodyn,它依賴於dyn.js.因此,如果理解得當,CommonJs應該與avatar-js和nodyn一起工作,但是這兩個仍然很年輕。我不明白爲什麼avatar-js和nashorn並沒有完全分配。

甲種解決辦法是增加一個CommonJS的兼容性腳本像一個用於犀牛這增加importClass/importPackage(mozilla_compat.js),這將增加CommonJS的兼容性到犀牛,種犀牛-要求墊片徹底的測試。

17

看看這裏的jvm-npm https://github.com/nodyn/jvm-npm。這個項目被nodyn用作CommonJS模塊系統。它具有NPM意識,這意味着您可以直接從NPM中加載模塊,但它不提供任何Node.js API。

下面是一個簡單的使用例子:

$ npm install pegjs 
npm http GET https://registry.npmjs.org/pegjs 
npm http 200 https://registry.npmjs.org/pegjs 
[email protected] node_modules/pegjs 
$ jrunscript 
nashorn> typeof require 
undefined 
nashorn> load('./jvm-npm.js') 
nashorn> typeof require 
function 
nashorn> var PEG = require('pegjs'); 
nashorn> typeof PEG 
object 

它主要是所有的Javascript,但文件從文件系統的實際負荷情況,也是使用Java來完成。

5

我有同樣的需求,我用jvm-npm了一段時間,但我需要的東西,甚至會工作,而不讓裏面的JavaScript的Java包的使用,所以我在這裏寫我自己的版本:https://github.com/coveo/nashorn-commonjs-modules

它的實現完全使用Java,並支持從文件系統(Java資源,自定義數據庫等)以外的地方加載模塊。

如果有人想使用它,它將在Maven Central上發佈。

+0

我使用它!幹得不錯! – Aris2World

1

還有nashorn-require,你可以從github上獲得。我用它,我是能夠做到

 engine.eval(reader("src/main/javascript/nashorn-require.js"),bindings); 
     engine.eval("var initRequire = load('src/main/javascript/nashorn-require.js');",bindings); 
     engine.eval("initRequire({mainFile : 'src/main/javascript/foo', debug : true})", bindings); 
     engine.eval("var babel = require('babel');",bindings); 

然後transpile JSX反應的組分與

 Buffer input = findTemplateSource(fileLocation,context); 
     bindings.put("input",input.toString()); 
     result = engine.eval("babel.transform(input,{ presets: ['react', 'es2015'] }).code;",bindings); 

到ES5後來,當我把反應,反應-DOM到我的瀏覽器並加載所產生的JS的組件,事情工作正常,所以我敢肯定巴別爾是完全開心的,雖然我不知道它是否會找到第三方插件或不...

相關問題