Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将Duktape2.1.0中的本机C模块加载到_Javascript_Node.js_Duktape - Fatal编程技术网

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源) 加载回调应该向其调用者返回什么返回

读了这篇指导性文章后,我还是迷路了

据说

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源)
  • 加载回调应该向其调用者返回什么<代码>返回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
        }