模块注册
¥Module registration
Node-API 模块的注册方式与其他模块类似,只是不使用 NODE_MODULE 宏,而是使用以下内容:
¥Node-API modules are registered in a manner similar to other modules
except that instead of using the NODE_MODULE macro the following
is used:
NAPI_MODULE(NODE_GYP_MODULE_NAME, Init) 下一个区别是 Init 方法的签名。对于 Node-API 模块,它如下所示:
¥The next difference is the signature for the Init method. For a Node-API
module it is as follows:
napi_value Init(napi_env env, napi_value exports); Init 的返回值被视为模块的 exports 对象。为方便起见,Init 方法通过 exports 参数传递一个空对象。如果 Init 返回 NULL,则作为 exports 传递的参数由模块导出。Node-API 模块无法修改 module 对象,但可以将任何内容指定为模块的 exports 属性。
¥The return value from Init is treated as the exports object for the module.
The Init method is passed an empty object via the exports parameter as a
convenience. If Init returns NULL, the parameter passed as exports is
exported by the module. Node-API modules cannot modify the module object but
can specify anything as the exports property of the module.
将方法 hello 添加为函数,以便它可以作为插件提供的方法调用:
¥To add the method hello as a function so that it can be called as a method
provided by the addon:
napi_value Init(napi_env env, napi_value exports) {
napi_status status;
napi_property_descriptor desc = {
"hello",
NULL,
Method,
NULL,
NULL,
NULL,
napi_writable | napi_enumerable | napi_configurable,
NULL
};
status = napi_define_properties(env, exports, 1, &desc);
if (status != napi_ok) return NULL;
return exports;
} 要为插件设置 require() 返回的函数:
¥To set a function to be returned by the require() for the addon:
napi_value Init(napi_env env, napi_value exports) {
napi_value method;
napi_status status;
status = napi_create_function(env, "exports", NAPI_AUTO_LENGTH, Method, NULL, &method);
if (status != napi_ok) return NULL;
return method;
} 定义一个类以便创建新实例(通常与 对象封装 一起使用):
¥To define a class so that new instances can be created (often used with Object wrap):
// NOTE: partial example, not all referenced code is included
napi_value Init(napi_env env, napi_value exports) {
napi_status status;
napi_property_descriptor properties[] = {
{ "value", NULL, NULL, GetValue, SetValue, NULL, napi_writable | napi_configurable, NULL },
DECLARE_NAPI_METHOD("plusOne", PlusOne),
DECLARE_NAPI_METHOD("multiply", Multiply),
};
napi_value cons;
status =
napi_define_class(env, "MyObject", New, NULL, 3, properties, &cons);
if (status != napi_ok) return NULL;
status = napi_create_reference(env, cons, 1, &constructor);
if (status != napi_ok) return NULL;
status = napi_set_named_property(env, exports, "MyObject", cons);
if (status != napi_ok) return NULL;
return exports;
} 你还可以使用 NAPI_MODULE_INIT 宏,它充当 NAPI_MODULE 的简写并定义 Init 函数:
¥You can also use the NAPI_MODULE_INIT macro, which acts as a shorthand
for NAPI_MODULE and defining an Init function:
NAPI_MODULE_INIT(/* napi_env env, napi_value exports */) {
napi_value answer;
napi_status result;
status = napi_create_int64(env, 42, &answer);
if (status != napi_ok) return NULL;
status = napi_set_named_property(env, exports, "answer", answer);
if (status != napi_ok) return NULL;
return exports;
} 参数 env 和 exports 被提供给 NAPI_MODULE_INIT 宏的主体。
¥The parameters env and exports are provided to the body of the
NAPI_MODULE_INIT macro.
所有 Node-API 插件都是上下文感知的,这意味着它们可以被加载多次。声明此类模块时有一些设计注意事项。上下文感知的插件 上的文档提供了更多详细信息。
¥All Node-API addons are context-aware, meaning they may be loaded multiple times. There are a few design considerations when declaring such a module. The documentation on context-aware addons provides more details.
宏调用后,变量 env 和 exports 将在函数体内可用。
¥The variables env and exports will be available inside the function body
following the macro invocation.
有关设置对象属性的更多详细信息,请参阅 使用 JavaScript 属性 部分。
¥For more details on setting properties on objects, see the section on Working with JavaScript properties.
有关一般构建插件模块的更多详细信息,请参阅现有 API。
¥For more details on building addon modules in general, refer to the existing API.