请解释 Node.js 中模块是如何被加载和解析的?
考察说明
考查对 Node.js 模块系统核心机制的理解,包括模块封装、缓存和解析规则。
回答思路
- 【回答框架 1】Node.js 模块加载机制基于 CommonJS 规范,每个文件被视为独立模块,模块内部代码被包裹在函数中,提供 exports、require、module 等参数。
- 【回答框架 2】模块加载过程包括路径解析、文件定位、编译执行和缓存。require 时先检查缓存,若已加载则直接返回缓存对象,避免重复执行。
- 【回答框架 3】路径解析遵循规则:核心模块优先,相对路径或绝对路径直接定位,非路径模块则从当前目录逐级向上查找 node_modules 目录。
- 【回答框架 4】文件定位时按扩展名尝试 .js、.json、.node,若为目录则读取 package.json 的 main 字段或 index 文件。
- 【回答框架 5】模块加载是同步的,执行完毕后 module.exports 作为模块导出对象被缓存,后续 require 返回同一对象。
- 【关键点 1】模块缓存机制确保同一模块只执行一次,后续 require 返回缓存对象。
- 【关键点 2】路径解析顺序:核心模块、相对/绝对路径、node_modules 逐级查找。
- 【关键点 3】模块代码被包裹在函数中,实现作用域隔离,避免全局污染。
- 【易错点 1】循环依赖时可能出现部分导出对象未初始化,需注意加载顺序。
- 【易错点 2】修改模块缓存对象会影响所有引用方,需谨慎操作。
- 【易错点 3】同步加载机制在大型项目中可能影响启动性能,但通常可接受。