首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DukTape ` `require()`抛出` `TypeError:未定义不可调用`

DukTape ` `require()`抛出` `TypeError:未定义不可调用`
EN

Stack Overflow用户
提问于 2019-02-22 22:31:45
回答 1查看 1.1K关注 0票数 0

我正在尝试为Android和JavaScript绑定使用Duktape

我按照这里的文档进行了https://wiki.duktape.org/HowtoModules.html操作,按照步骤,我有以下调用代码:

代码语言:javascript
复制
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的定义是这样的(开箱即用,我没有对此进行编辑):

代码语言:javascript
复制
/* 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()就可以逃脱?

EN

回答 1

Stack Overflow用户

发布于 2019-02-23 17:44:15

由于模块解析和加载依赖于平台,因此需要您自己实现。duktape附带的模块处理只负责管理加载的模块,并提供require调用(您不需要自己提供此函数)。注册这两个函数很简单(see also the entire code):

代码语言:javascript
复制
// 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);

实际的分辨率和加载代码比较复杂。您可以查看完整的代码in the scripting context class

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54829325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档