1. 程式人生 > 實用技巧 >使用 jvm-npm 解決 graalvm js common js 模組載入問題

使用 jvm-npm 解決 graalvm js common js 模組載入問題

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 我們可以共享,實現一些編譯優化

參考資料

https://github.com/nodyn/jvm-npm