我正在尋找Nashorn的模塊系統。據我所知,CommonJS是關於JS模塊的方法。我已經查看了列表(here和here),並且沒有發現Java的CommonJS實現。如何在Oracle新的Nashorn JS引擎中使用CommonJS模塊?
Narwhal不再有效,它的documentation不再託管在GitHub上。是否有支持Java的現有CommonJS實現或者我應該啓動一個新項目?
我正在尋找Nashorn的模塊系統。據我所知,CommonJS是關於JS模塊的方法。我已經查看了列表(here和here),並且沒有發現Java的CommonJS實現。如何在Oracle新的Nashorn JS引擎中使用CommonJS模塊?
Narwhal不再有效,它的documentation不再託管在GitHub上。是否有支持Java的現有CommonJS實現或者我應該啓動一個新項目?
我問犀牛郵件列表上一個非常類似的問題了一會兒回來,這裏是孫大信的(犀牛工程師)回覆:
來源:A. Sundararaj的
要:犀牛-dev的@ openjdk.java.net
我忘了補充。 Nashorn不包含任何內置模塊系統。 但是,如果模塊系統是純JS + Java,則必須可以在nashorn上運行 。
犀牛支持「負荷」和 「loadWithNewGlobal」(加載腳本,但到新的全局範圍)(從URL,文件,資源負載腳本) 元,除了好老「EVAL」。因此,它應該是 任何模塊系統都可以在pure JS或可能帶有一些Java代碼的nashorn之上實現。
-Sundar
我一直在尋找了一段時間這樣的實現。我一直在使用Rhino-Require的補丁版本。雖然犀牛聲稱是CommonJS兼容,AFAIK,它只實現了模塊,而不是軟件包(package.json)不能被解析。 RingoJS應該是兼容的。但是Nashorn永遠不會是see。
後來,甲骨文宣佈項目阿凡達依靠Avatar.js或here。這是非正式名爲Node.jar的官方項目。但截至目前,你必須自己編譯它。該項目非常年輕。
另一個非常年輕的項目是Nodyn,它依賴於dyn.js.因此,如果理解得當,CommonJs應該與avatar-js和nodyn一起工作,但是這兩個仍然很年輕。我不明白爲什麼avatar-js和nashorn並沒有完全分配。
甲種解決辦法是增加一個CommonJS的兼容性腳本像一個用於犀牛這增加importClass/importPackage(mozilla_compat.js),這將增加CommonJS的兼容性到犀牛,種犀牛-要求墊片徹底的測試。
看看這裏的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來完成。
我有同樣的需求,我用jvm-npm了一段時間,但我需要的東西,甚至會工作,而不讓裏面的JavaScript的Java包的使用,所以我在這裏寫我自己的版本:https://github.com/coveo/nashorn-commonjs-modules
它的實現完全使用Java,並支持從文件系統(Java資源,自定義數據庫等)以外的地方加載模塊。
如果有人想使用它,它將在Maven Central上發佈。
還有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的組件,事情工作正常,所以我敢肯定巴別爾是完全開心的,雖然我不知道它是否會找到第三方插件或不...
我使用它!幹得不錯! – Aris2World