为什么 `require` 会导致 Duktape 出错?

cay*_*lik 4 javascript duktape

我正在使用 Duktape 嵌入 JavaScript,但使用require总是会导致错误:

int main(){
  duk_context *ctx = duk_create_heap_default();
  duk_peval_file(ctx, "example.js");
  printf("file load err %s", duk_safe_to_string(ctx, -1));
  duk_destroy_heap(ctx);
}
Run Code Online (Sandbox Code Playgroud)

例子.js

var mylib = require("mylib")
print (mylib.hello)
Run Code Online (Sandbox Code Playgroud)

mylib.js

exports.hello = "Hello"
Run Code Online (Sandbox Code Playgroud)

错误:

文件加载错误类型错误:不可调用

堆栈转储 说:

duk_js_call.c:682
需要本机严格的preventyield
eval example.js:1 preventyield

num*_*pad 5

Duktape 要求(无双关语)您提供模块搜索功能以保持可移植性。但是,即使您对 Duktape 几乎没有经验,实现它也是一项非常简单和直接的任务。
一个非常简单但功能齐全的模块搜索功能是:

Duktape.modSearch = function(id) {
    return readFileAsString(id);
}
Run Code Online (Sandbox Code Playgroud)

这将允许您require(filename)使用文件名作为参数从 Duktape Javascript 环境调用并将其用作模块。更高级的功能将处理错误或搜索多个路径和文件夹。

要使用该require()函数,您现在必须创建一个 C/C++ 函数来处理读取文件并将其内容作为字符串返回,并将此函数绑定到 Duktape 引擎(此示例位于Duktape主页上)。
现在从 Duktape 运行时调用此函数定义(例如使用duk_eval_string(ctx, "Duktape.modSearch = ...");),您应该能够调用require().