Todavía estoy perdido después de leer el artículo de instrucciones.
Se dice que
La devolución de llamada de carga es una función Duktape/C que toma el ID del módulo resuelto y: (1) devuelve el código fuente de Ecmascript para el módulo o indefinido si no hay código fuente, por ejemplo, para módulos C puros, (2) puede completar módulos.exportaciones mismo, y (3) puede reemplazar module.exports.
Pero al cargar un módulo C nativo,
duk_push_undefined(ctx) en lugar de duk_push_string(ctx, module_source) ?return 0 en lugar de return 1 ? Traté de llamar a myobject_init (usando la instancia predeterminada en http://wiki.duktape.org/HowtoNativeConstructor.html ) en la devolución de llamada de carga cb_load_module . Pero duktape se queja
TypeError: [objeto Objeto] no construible
cuando evalúo var MyObject = require("MyObject") , no importa si
Problema resuelto. Hay algunos detalles más dispersos en
Los trucos más importantes son:
La función de inicio del módulo debe devolver una función (el constructor también es una función). NO registre la función usando duk_put_global_string .
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 ] } La función cb_load_module debe insertar la función de inicio del módulo en la pila de valores, luego usar duk_call para llamarla y configurar module.exports . NO llame directamente a la función de inicio del módulo.
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 }