java中調用npm模塊

996.icu

工具和資料

正文

一些小的javascript片斷能夠很方便的直接使用ScriptEngine.eval()直接導入,可是如何使用require方法導入使用npm下載的javascript模塊呢?javascript

答案是使用jvm-npm這個項目。java

  • 首先,建立一個目錄放置全部javascript文件,好比:D:\\path\\to\\js_modules\\
  • 從jvm-npm下載jvm-npm.js,放到上述目錄中
  • 使用npm i <js_module> -g下載你須要引用的npm模塊,注意看最後的提示,即模塊下載目錄
  • 到模塊下載目錄,一般爲<User_Dir>\npm\node_modules\<js_module>,裏面通常有個dist目錄,從裏面找到完整的模塊js文件,複製到上述目錄
  • 見如下Kotlin示例代碼:(注意把js_module換成你須要加載的模塊名)
val JS_ROOT = "D:\\path\\to\\js_modules"
val JSE = ScriptEngineManager().getEngineByName("nashorn").apply {
    System.setProperty("user.dir", JS_ROOT)             // 設定jvm-npm的當前目錄
    eval(Util.readLocalUtfText("$JS_ROOT\\jvm-npm.js")) // 在ScriptEngine中加載jvm-npm.js
    println(eval("typeof require"))                     // 驗證require方法已正確引入
    eval("var mylib = require('js_module')")            // 這時候,就能夠用require()方法來引入當前目錄中的js模塊了
    println(eval("typeof mylib"))                       // 驗證js模塊已正確加載
}
...
val bar = JSE.eval("mylib.foo()")                       // js代碼中能夠使用加載的js模塊了

注意:node

  • jvm-npm有個bug,若是你的js文件大於64K,則會致使文件截斷。
    這種狀況下你須要編寫一個能一次讀取完整File或InputStream的java方法,替換掉下面這句:
return new Scanner(input).useDelimiter('\\A').next()
相關文章
相關標籤/搜索