标题:Node.js源码分析-原生模块(C++模块)的注册日期:2018-11-2821:04:49tags:-Node.js-Node.js源码分析-源码分析分类:-Node.js源码分析本文四年前发表于个人网站,现转载于此,原文链接:https://laogen.site/nodejs/no...《Node.js 源码分析》系列目录页:https://laogen.site/nodejs/no...上一篇文章提到RegisterBuiltinModules()注册原生C++模块,没有详细展开.这里我们就从这个功能来展开。逐层展开RegisterBuiltinModules()/*src/node.cc:3066*/voidRegisterBuiltinModules(){#defineV(modname)_register_##modname();NODE_BUILTIN_MODULES(V)#undefV}首先定义一个宏V为_register_##modname(),可以看出V展开后就是这样的函数调用:_register_xx();那么,RegisterBuiltinModules()实际上是由宏NODE_BUILTIN_MODULES(V)实现的,我们看一下它的定义:/*src/node_internals.h:147*/#defineNODE_BUILTIN_MODULES(V)\NODE_BUILTIN_STANDARD_MODULES(V)//...进一步查看NODE_BUILTIN_STANDARD_MODULES(V)的定义:/*src/node_internals.h:106*/#defineNODE_BUILTIN_STANDARD_MODULES(V)\V(async_wrap)\V(buffer)\V(cares_wrap)\V(config)\V(contextify)\V(domain)\V(fs)\V(fs_event_wrap)\V(heap_utils)\V(http2)\V(http_parser)\V(inspector)\V(js_stream)\V(messaging)\V(module_wrap)\V(选项)\V(操作系统)\V(性能)\V(pipe_wrap)\V(process_wrap)\V(serdes)\V(signal_wrap)\V(spawn_sync)\V(stream_pipe)\V(stream_wrap)\V(string_decoder)\V(symbols)\V(tcp_wrap)\V(timer_wrap)\V(trace_events)\V(tty_wrap)\V(types)\V(udp_wrap)\V(url)\V(util)\V(uv)\V(v8)\V(worker)\V(zlib)这个宏定义多次调用了宏V。你还记得这个宏吗?上面定义了:#defineV(modname)_register_##modname();,那么我们展开后就是:/*src/node_internals.h:106*/#defineNODE_BUILTIN_STANDARD_MODULES(V)\_register_async_wrap();_register_buffer();_register_cares_wrap();_register_config();_register_contextify();_register_domain();_register_fs();_register_fs_event_wrap();_register_heap_utils();_register_http2();_注册er_http_parser();_register_inspector();_register_js_stream();_register_messaging();_register_module_wrap();_register_options();_register_os();_register_performance();_register_pipe_wrap();_register_process_wrap();_register_serdes();_register_signal_wrap();_register_spawn_sync();_register_stream_pipe();_register_stream_wrap();_register_string_decoder();_register_symbols();_register_tcp_wrap();_register_timer_wrap();_register_trace_events();_register_tty_wrap();_register_types();_register_udp_wrap();_register_url();_register_util();_register_uv();_register_v8();_register_worker();_register_zlib();最后,RegisterBuiltinModules()扩展如下:voidRegisterBuiltinModules(){_register_async_wrap();_register_buffer();//..._register_os();//...}经过层层宏展开,我们看到了RegisterBuiltinModules()的原貌,它调用了一些全局的注册函数,这样我们就可以理解了。接下来,我们打算看看这些注册函数是在哪里定义的。我在全球范围内搜索了整个代码目录,但找不到任何这些函数,这些函数似乎又是通过宏定义的。那我们挑一个nativemodule的源码看看上面有没有注册函数的定义。我选择了一个名为os的模块,它的源代码位于src/node_os.cc:查看一个原生模块的源代码/*src/node_os.cc*/namespacenode{namespaceos{//...staticvoidGetHostname(constFunctionCallbackInfo&args){//...}staticvoidGetOSType(constFunctionCallbackInfo&args){//...}staticvoidGetOSRelease(constFunctionCallbackInfo&args){//...}staticvoidGetPUInfo(constFunctionCallbackInfo&args){//...}staticvoidGetFreeMemory(constFunctionCallbackInfo&args){//...}staticvoidGetTotalMemory(constFunctionCallbackInfo&args){//...}staticvoidGetUptime(constFunctionCallbackInfo&args){//...}staticvoidGetLoadAvg(constFunctionCallbackInfo&args){//...}staticvoidGetInterfaceAddresses(constFunctionCallbackInfo&args){//...}staticvoidGetHomeDirectory(constFunctionCallbackInfo&args){//...}staticvoidGetUserInfo(constFunctionCallbackInfo&args){//...}staticvoidSetPriority(constFunctionCallbackInfo&args){//...}staticvoidGetPriority(constFunctionCallbackInfo&args){//...}//这个初始化函数是每个native模块定义的,参数也是一致的voidInitialize(Local