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