Javascript 将Duktape2.1.0中的本机C模块加载到
读了这篇指导性文章后,我还是迷路了Javascript 将Duktape2.1.0中的本机C模块加载到,javascript,node.js,duktape,Javascript,Node.js,Duktape,读了这篇指导性文章后,我还是迷路了 据说 load回调是一个Duktape/C函数,它采用解析的模块ID并:(1)返回模块的Ecmascript源代码,如果没有源代码,则返回未定义的源代码,例如,对于纯C模块,(2)可以填充module.exports本身,(3)可以替换module.exports 但在加载本机C模块时 应该将什么推入值堆栈duk\u push\u undefined(ctx)而不是duk\u push\u字符串(ctx,模块\u源) 加载回调应该向其调用者返回什么返回
- 应该将什么推入值堆栈
而不是duk\u push\u undefined(ctx)
李>duk\u push\u字符串(ctx,模块\u源)
- 加载回调应该向其调用者返回什么<代码>返回0而不是
李>返回1
cb\u load\u模块中调用myobject\u init
(使用中的默认实例)。但duktape抱怨道
TypeError:[对象]不可构造
当我计算var MyObject=require(“MyObject”)
时,无论
- 将undefined推入值堆栈并返回1
- 或者不将任何内容推入值堆栈并返回0
问题已解决。
还有一些细节分散在
- 它是关于Duktape1.x模块加载框架的,但它有助于理解2.x框架
最重要的技巧是:
- module init函数应该返回一个函数(构造函数也是一个函数)。不要使用
duk\u put\u global\u字符串注册函数
duk_ret_t module_init(duk_context* ctx)
{
duk_push_c_function(ctx, module_constructor, num_arguments_for_constructor);
// set properties for the constructor
return 1; // stack: [ ... constructor ]
}
- 函数
cb\u load\u module
必须将module init函数推入值堆栈,然后使用duk\u call
调用它并设置module.exports
。不要直接调用module init函数
duk_ret_t cb_load_module(duk_context *ctx)
{
// stack: [ resolved_id exports module ]
...
duk_push_c_function(ctx, module_init, 0);
duk_call(ctx, 0);
duk_put_prop_string(ctx, 2, "exports"); // obj_idx(module) = 2
return 0; // no .js source for native modules
}