面试题答案
一键面试- 文件模块:
- 查找路径:相对路径查找,基于当前文件所在目录,若以
./
或../
开头,Node.js会从当前模块的目录开始查找。例如在/project/src/a.js
中引入./b.js
,就会在/project/src
目录找b.js
。 - 缓存:文件模块在第一次加载后会被缓存,再次引入时直接从缓存中获取。但缓存是基于文件路径的,若通过不同路径引入同一文件模块(实际指向同一物理文件),会被视为不同模块进行加载。
- 加载过程:先根据文件扩展名确定加载方式,
.js
文件通过fs.readFileSync
读取文件内容并使用vm.runInThisContext
编译执行;.json
文件通过fs.readFileSync
读取内容后用JSON.parse
解析;其他扩展名或无扩展名会先当作.js
文件处理。
- 查找路径:相对路径查找,基于当前文件所在目录,若以
- 核心模块:
- 查找路径:Node.js在编译时就已经确定核心模块的存放位置,加载时直接从核心模块的内置路径查找,无需像文件模块那样基于相对路径查找。例如
http
模块,无论在项目什么位置引入,都直接从核心模块位置加载。 - 缓存:核心模块也有缓存机制,并且在Node.js启动时部分核心模块就已经被加载并缓存,后续引入直接从缓存获取,效率更高。
- 加载过程:核心模块是由C++编写并编译进Node.js二进制文件中的,加载时直接执行编译好的代码,无需像文件模块那样进行文件读取和JavaScript代码编译等操作,所以加载速度更快。
- 查找路径:Node.js在编译时就已经确定核心模块的存放位置,加载时直接从核心模块的内置路径查找,无需像文件模块那样基于相对路径查找。例如