DukTape `require ()` генерирует `TypeError: undefined не вызывается` - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь использовать Duktape для привязок Android и JavaScript.

Я следовал приведенной здесь документации https://wiki.duktape.org/HowtoModules.html, и в соответствии с шагами у меня есть следующий код вызова:

DuktapeContext::DuktapeContext(JavaVM* javaVM)
    : m_context(duk_create_heap(nullptr, nullptr, nullptr, &m_context, fatalErrorHandler))
    , m_objectType(m_javaValues.getObjectType(getEnvFromJavaVM(javaVM))) {
  if (!m_context) {
    throw std::bad_alloc();
  }
  duk_module_duktape_init(m_context); //<~~~ adds support for `require()`
  // Stash the JVM object in the context, so we can find our way back from a Duktape C callback.
  duk_push_global_stash(m_context);
  duk_push_pointer(m_context, javaVM);
  duk_put_prop_string(m_context, -2, JAVA_VM_PROP_NAME);
  duk_pop(m_context);
}

duk_module_duktape_init определяется так (готово, я не редактировал это):

/* Register `require` as a global function. */
duk_eval_string(ctx,
                "(function(req){"
                "var D=Object.defineProperty;"
                "D(req,'name',{value:'require'});"
                "D(this,'require',{value:req,writable:true,configurable:true});"
                "D(Duktape,'modLoaded',{value:Object.create(null),writable:true,configurable:true});"
                "})");
duk_push_c_function(ctx, duk__require, 1 /*nargs*/);

В моем javascript файле sample.js У меня естьследующая строка:

var mod = require('tester');

, которая при оценке скрипта через Duktape выдает исключение Caused by: com.squareup.duktape.DuktapeException: TypeError: undefined not callable at JavaScript.eval (строка, в которой вызывается require())

Должен ли я также реализовать функцию Duktape.modSearch()?Я думал, что смогу уйти, просто используя require()?

1 Ответ

0 голосов
/ 23 февраля 2019

Поскольку разрешение и загрузка модуля зависит от платформы, вам необходимо реализовать это самостоятельно.Работа с модулями, которая поставляется с duktape, имеет дело только с управлением загруженными модулями и обеспечивает вызов require (вам не нужно предоставлять эту функцию самостоятельно).Регистрация двух функций проста ( см. Также весь код ):

// Module loading support.
duk_push_object(_ctx);
duk_push_c_function(_ctx, resolveModule, JSExport::VarArgs);
duk_put_prop_string(_ctx, -2, "resolve");
duk_push_c_function(_ctx, loadModule, JSExport::VarArgs);
duk_put_prop_string(_ctx, -2, "load");
duk_module_node_init(_ctx, normalizeFilename);

Фактическое разрешение и загрузка кода немного сложнее.Вы можете увидеть полный код в классе контекста сценария .

...