https://www.jianshu.com/p/a309864c8357 https://blog.csdn.net/u010476739/article/details/80925128 https://www.cnblogs.com/zhoulixue/p/8757546.html http://www.javashuo.com/article/p-bywkbpzj-d.html https://juejin.cn/post/6844903704123211783
加载的模块类型:
1、原生内置模块 存在:原生内置模块缓冲区中,直接返回缓存结果,不实行原生内置模块代码 不存在:原生内置模块缓冲区中,实行原生内置模块代码,把模块加入缓冲区,并返回实行结果
2、路径文件模块 (1)、构建文件绝对路径列表 存在后缀名(.js | .json | .node) 利用path.resolve("路径") 拼接一个绝对路径,推入文件绝对路径列表 不存在后缀名 利用 path.resolve("路径"+".js") 拼接一个绝对路径的 .js 文件,推入文件绝对路径列表 利用 path.resolve("路径"+".json") 拼接一个绝对路径的 .json 文件,推入文件绝对路径列表 利用 path.resolve("路径"+".node") 拼接一个绝对路径的 .node 文件,推入文件绝对路径列表 是否存在 path.resolve("路径") 目录 存在 是否存在package.json文件 存在 是否存在main属性(若main没指定后缀名,那会利用 .js | .json | .node,按照顺序查找) 存在 利用path.resolve(path.jon("路径",'main属性值')) 拼接一个绝对路径的文件,推入 文件绝对路径列表 不存在 利用path.resolve(path.jon("路径",'index.js')) 拼接一个绝对路径的 .js 文件,推入 文件绝对路径列表 利用path.resolve(path.jon("路径",'index.json')) 拼接一个绝对路径的 .json 文件,推入 文件绝对路径列表 利用path.resolve(path.jon("路径",'index.node')) 拼接一个绝对路径的 .node 文件,推入 文件绝对路径列表 不存在 利用path.resolve(path.jon("路径",'index.js')) 拼接一个绝对路径的 .js 文件,推入 文件绝对路径列表 利用path.resolve(path.jon("路径",'index.json')) 拼接一个绝对路径的 .json 文件,推入 文件绝对路径列表 利用path.resolve(path.jon("路径",'index.node')) 拼接一个绝对路径的 .node 文件,推入 文件绝对路径列表 (2)、遍历文件绝对路径列表 ,查看是否在require.cache['文件路径']缓冲区中 存在 读取缓冲区中的模块,不实行文件模块的代码,直接返回缓存的结果(require.cache['文件路径'].exports) 不存在 报错找不到模块
3、第三方包模块 (1)、获取模块可能存在的目录列表 module.paths (2)、构建 文件绝对路径列表 遍历 目录列表 module.paths 第一个元素 利用(path.join(目录元素,包名+".js") 拼接一个绝对路径的 .js 文件,推入 文件绝对路径列表 利用(path.join(目录元素,包名+".json") 拼接一个绝对路径的 .json 文件,推入 文件绝对路径列表 利用(path.join(目录元素,包名+".node") 拼接一个绝对路径的 .node 文件,推入 文件绝对路径列表 判断 path.join(目录元素,包名) 目录是否存 存在 判断目录下是否存在package.json文件 存在 是否存在main属性 存在 利用 path.jon(目录元素",包名,'main属性值')) 拼接一个绝对路径的文件,推入 文件绝对路径列表 不存在 利用 path.jon(目录元素",包名,'index.js')) 拼接一个绝对路径的文件,推入 文件绝对路径列表 利用 path.jon(目录元素",包名,'index.json')) 拼接一个绝对路径的文件,推入 文件绝对路径列表 利用 path.jon(目录元素",包名,'index.node)) 拼接一个绝对路径的文件,推入 文件绝对路径列表 不存在 连续遍历 目录列表 module.paths 不存在 连续遍历 目录列表 module.paths (3)、遍历文件绝对路径列表,查看是否在require.cache['文件路径']缓冲区中 存在 读取缓冲区中的模块,不实行文件模块的代码,直接返回缓存的结果(require.cache['文件路径'].exports) 不存在 报错找不到模块

如果是.js文件,则经由fs模块同步读取文件为字符串,然后包装字符串为匿名函数字符串,然后利用vm.runInThisContext实行为JavaScript代码,末了调用传参。 如果是.json文件,则经由fs模块同步读取文件往后用 JSON.parse() 解析返回结果 如果是.node文件,则经由 dlopen()方法 加载末了编译天生的工具。.node 是C/C++编写的扩展文件