2015-09-18 25 views
4

我試圖使用babel.transform而不是JSXTranformer作出反應。如何運行babel.transform與Nashorn進行反應?

... 
ScriptEngineManager mgr = new ScriptEngineManager(); 
ScriptEngine nashorn = mgr.getEngineByName("nashorn"); 
nashorn.eval("var process = {env:{}}"); // node-modules expect that 
nashorn.eval(getScript("com/facebook/babel/jvm-npm.js")); 
babel = (JSObject) nashorn.eval("require('babel');"); 
... 

巴別通天塔和核心安裝爲全球節點模塊,並且我得到了一個錯誤:

Testsuite: com.my.app.BabelTransformerTest
Cannot find module ./lib/api/node.js
Cannot load module babel-core LOAD_ERROR
Cannot load module babel LOAD_ERROR
Cannot load module babel-core LOAD_ERROR
Cannot load module babel LOAD_ERROR
Cannot find module ./lib/api/node.js
Cannot load module babel-core LOAD_ERROR
Cannot load module babel LOAD_ERROR

./lib/api/node.js是那裏的C:\Users\***\AppData\Roaming\npm\node_modules

我聽說,這是可能從Nashorn運行babel.transform

也許有隻加載某個babel模塊作爲JavaScript文件的方法嗎?

+0

只是好奇,爲什麼你用nashorn而不是常規的Node.js? –

+0

這是一個圖書館。爲更大的Java項目。我認爲是這樣的...... –

回答

7

我已完成了與Babel Standalone工作在jdk1.8.0_45與下面的腳本:

FileReader babelScript = new FileReader("babel.js"); 
ScriptEngine engine = new ScriptEngineManager().getEngineByMimeType("text/javascript"); 

SimpleBindings bindings = new SimpleBindings(); 
engine.eval(babelScript, bindings); 

bindings.put("input", "<Component />"); 
Object output = engine.eval("Babel.transform(input, { presets: ['react'] }).code", bindings); 
System.out.println(output); 

將返回:

React.createElement(Component, null); 

的ES2015預設工作爲好。

+0

謝謝你很快就會檢查! –

+0

並且,對於解構支持,添加'stage-2'預設 – bertie

2

您應該直接加載babel.js,然後評估babel.transform("...")。不應該有任何需要從npm或節點加載任何東西。

但是,唉,您必須等待修復JDK bug 8135190才能發佈,因爲加載babel.js會導致「方法代碼過大」異常失敗。

+0

Oracle更新週期太遺憾了...直到Java 9才能解決它。這很糟糕。 – dasniko

+1

根據該錯誤,根據[OpenJDK發佈時間表](http://openjdk.java.net/projects/jdk8u/releases/8u72.html),該錯誤在8u72中得到修復,應該在2016年1月發佈。 – Vroo

+0

哦,我沒有看到「backports」。好消息! – dasniko

相關問題