Node.js 源码分析 - 原生模块(C++模块)的注册

本文深入分析了Node.js原生模块(C++模块)的注册过程,从RegisterBuiltinModules()展开,揭示了宏定义如何创建全局注册函数。通过对一个原生模块的源码查看,解释了模块注册的实现,明确了模块对象如何添加到全局链表中,为理解Node.js的模块系统提供了清晰的路径。
摘要由CSDN通过智能技术生成

title: Node.js 源码分析 - 原生模块(C++模块)的注册 date: 2018-11-28 21:04:49 tags: - Node.js - Node.js 源码分析 - 源码分析 categories: - Node.js 源码分析


此文最初于四年前发布在个人站上的,现迁移至此重发,原链接:https://laogen.site/nodejs/nodejs-src/register-builtin-modules/ 《Node.js 源码分析》 系列目录页:https://laogen.site/nodejs/nodejs-src/index/

上一篇提到 RegisterBuiltinModules() 注册了原生 C++ 模块没有详细展开,这里就从这个函数展开。

将 RegisterBuiltinModules() 层层展开

/* src/node.cc:3066 */
void RegisterBuiltinModules() {
#define V(modname) _register_##modname();
  NODE_BUILTIN_MODULES(V)
#undef V
}

首先定义了一个宏 V_register_##modname(), 可以看出 V 展开后是一个函数调用类似这样: _register_xx();

随后,RegisterBuiltinModules() 实际是宏 NODE_BUILTIN_MODULES(V) 来实现的,我们看看它的定义:

/* src/node_internals.h:147 */
#define NODE_BUILTIN_MODULES(V)    \
  NODE_BUILTIN_STANDARD_MODULES(V)
// ...

进一步查看 NODE_BUILTIN_STANDARD_MODULES(V) 的定义:

/* src/node_internals.h:106 */
#define NODE_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(options)          \
    V(os)               \
    V(performance)      \
    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(tim
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值