使用 jvm-npm 解決 graalvm js common js 模組載入問題
阿新 • • 發佈:2020-08-27
jvm-npm 是一個很不錯的js hack,可以方便的用來解決 java js 引擎的 的npm 問題,以下是一個使用說明
程式碼說明
- 專案結構
- 使用程式碼
init 主要是npm common 機制的hack
public static void init(Engine engine,Context context) throws IOException {
Source mysource = Source.newBuilder("js","load(\"src/main/resources/jvm-npm.js\");","demoapp").build();
context.eval(mysource);
}
呼叫npm 包
public static void global(Engine engine,Context context) throws IOException {
Source mysource = Source.newBuilder("js","var demoapp = require(\"src/main/resources/mydemo\")","demoapp").build();
context.eval(mysource);
Value callapp = context.getBindings("js").getMember("demoapp");
Value result = callapp.execute("dalong",333);
System.out.println(result.asString());
}
mydemo.js
function demoapp(name,age) {
return `${name}-----${age}`
}
module.exports = demoapp
- 說明
為了方便,複用了engine 以及context 這樣可以複用一些公用部分(比如npm 機制)
Engine engine = Engine.newBuilder().option("js.load-from-url","true").allowExperimentalOptions(true).build();
Context context = Context.newBuilder().allowAllAccess(true).engine(engine).build();
執行效果
說明
以上是一個簡單的整合試用,context 共享會有點不安全,實際推薦的還是基於執行緒隔離,engine 我們可以共享,實現一些編譯優化