nodejs模块路径解析和加载过程
2021-12-01 本文已影响0人
风雅欢乐
- Node.jS项目模块路径解析是通过require.resolve方法来实现的
- require.resolve 就是通过 Module._resolveFileName 方法实现的
- require.resolve 实现原理:
- Module._resolveFileName 方法核心流程有 3 点:
a. 判断是否为内置模块
b. 通过Module._resolveLookupPaths方法生成node_modules可能存在的路径
c. 通过Module._findPath查询模块的真实路径 - Module._findPath核心流程有4点:
a. 查询缓存(将request和paths通过\xoo合并成cacheKey)
b. 遍历paths,将path与request组成文件路径basePath
c. 如果basePath存在则调用fs.realPathSync获取文件真实路径
d. 将文件真实路径缓存到Module._pathcache(key就是前面生成的cacheKey) - fs.realPathSync核心流程有3点:
a. 查询缓存(缓存的key为p,即Module._findPath中生成的文件路径)
b. 从左往右遍历路径字符串,查询到/时,拆分路径,判断该路径是否为软链接,如果是软链接则查 询真实链接,并生其新路径p,然后继续往后遍历,这里有1个细节需要特别注意:
c. 遍历过程中生成的子路径base会缓存在knownHard和cach&#A避免重复查询
- Module._resolveFileName 方法核心流程有 3 点:
- require.resolve.paths等价于Module._resolveLookupPaths,该方法用于获取所有node_modules可能的路径
- require.resolve.path实现原理:
- 如果路径为/(根目录),直接返回['/node_modules']
- 否则,将路径字符串从后往前遍历,查询到/时拆分路径,在后面加上node_modules,并加入到paths数组,直至查询不到/后返回paths数组