ModuleManager模块加载流程是什么样的
========================

napi\_module结构体包含模块注册所需的信息，具体定义如下：

static napi\_module demoModule = {
  .nm\_version = 1, _// Nm version number, default value is 1, type is int_
  .nm\_flags = 0, _// Nm identifier, type unsigned int_
  .nm\_filename = nullptr, _// File name, not currently paid attention to, use default value, type is char\*_
  .nm\_register\_func = Init, _// Specify the entry function for nm, type napi\_addon\_register\_func_
  .nm\_modname = "entry", _// Specify the module name for TS page import, type char\*_
  .nm\_priv = ((void\*)0),  _// Not paying attention for now, just use the default, type is void\*_
  .reserved = { 0 } _// Not paying attention for now, just use the default value, type is void\*_
};

在requireNapi中，loadNativeModule加载模块，会先通过FindNativeModuleByCache在缓存中寻找目标module，如果在缓存中找到，使用GetNativeModulePath拼接so路径，最后用LoadModuleLibrary打开so；如果没有在缓存中找到，则要先查找dlopen打开对应so，打开so后，native中的extern "C" \_\_attribute\_\_((constructor)) void RegisterModule(void)函数进行NativeModule加载，然后完成static napi\_value Init(napi\_env env, napi\_value export)中的实际注册动作，返回一个js对象export，该js对象上挂载了开发者提供的native方法，以便于开发者在js侧调用。模块加载流程简介如下图：

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/8d/v3/qBud7DYqT1KXCO5owkCX2A/zh-cn_image_0000002654835189.png?HW-CC-KV=V1&HW-CC-Date=20260709T133804Z&HW-CC-Expire=86400&HW-CC-Sign=6FF0D90B0EA77DA4B09D018AB2F47455630EF547E4293066B398C649551EDC40 "点击放大")