如何在Android中使用Duktape访问Javascript模块

我使用Kotlin在我的Android应用程序中使用Duktape成功解析和评估了一个javascript文件。

val file_name = "lib.js" val js_string = application.assets.open(file_name).bufferedReader().use { it.readText() } val duktape = Duktape.create() try { Log.d("Greeting", duktape.evaluate("'hello world'.toUpperCase();").toString()) duktape.evaluate(js_string) } finally { duktape.close() } 

javascript文件是使用Browserify创建的,因此它是一个包含所有内容的单个文件,并且工作正常。 但是我需要从模块中请求一个模块和一个方法,例如:

 var test = require('testjs-lib'); test.EVPair.makeRandom().toWTF(); 

除了这个链接,我不知道怎么做,也没有find任何例子: http : //wiki.duktape.org/HowtoModules.html

它告诉我使用modsearch,但我不知道该怎么做或应该放在哪里,即使它适用于Duktape Android( https://github.com/square/duktape-) android )。

有没有人成功地做过这件事可以解释一下这个问题?

在testjs-lib.js中,添加使用模块testjs-lib.js本身导出的JS代码。 例如:

 function myModule() { this.hello = function() { return 'hello!'; } this.goodbye = function() { return 'goodbye!'; } } module.exports = myModule; //You code goes here console.log(myModule.hello()); console.log(myModule.goodbye()); 

然后请Duktape评估整个文件。

假设您想在duktape中包含Underscore。

  1. 将模块/库代码放在单独的js文件中。 在android项目中,您可以将此js文件放在Assets文件夹中。 在我们的例子中,它就像: underscore.js

  2. 创建一个duktape用来获取此js文件的输入流的java接口。 就像:

“`

 public interface DuktapeHelper { @JavascriptInterface String getUnderScore(); } 

““

  1. 将此java接口绑定到duktape实例中的js接口。

“`

 duktape.bind("helper", DuktapeHelper.class, ); 

“`

  1. 使用之前注入的helper接口在duktape中使用modSearch函数。

“`

  duktape.evaluate("Duktape.modSearch = function (id) {\n" + " if (id == \"underscore\") {" + " return helper.getUnderScore();" + " } " + " throw new Error('cannot find module: ' + id);" + " };" + "var _ = require('underscore')._; "); 

“`