12

我正在使用 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();

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

它告诉我使用 modsearch,但我不知道如何做或应该放置它,即使它适用于 Duktape Android(https://github.com/square/duktape-安卓)。

有没有人成功做到这一点,可以阐明这个问题?

4

2 回答 2

2

假设您想在 duktape中包含下划线。

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

  2. 创建一个 java 接口,duktape 将使用它来获取此 js 文件的输入流。某事喜欢:

```

public interface DuktapeHelper {

    @JavascriptInterface
    String getUnderScore();
}

````

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

```

duktape.bind("helper", DuktapeHelper.class, <instance of your DuktapeHelperImplementation>);

```

  1. 使用您之前注入的接口modSearch在 duktape 中实现功能。helper

```

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

```

于 2018-06-19T14:39:13.923 回答
2

在 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 评估整个文件。

于 2018-04-23T15:08:00.513 回答