- 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数组
nodejs模块路径解析和加载过程
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 更多个人博客:(https://github.com/zenglinan/blog) 如果对你有帮助,欢迎star...
- 一、前言 我们知道,Node.js是基于CommonJS规范进行模块化管理的,模块化是面对复杂的业务场景不可或缺的...