前端/移动开发面试题更新 2026-08-05

请描述在 Node.js 中调用 require 时,模块解析与文件查找的具体流程是怎样的?

前端/移动开发技术原理问题排查Node.js

考察说明

考察对 Node.js 模块解析机制的理解,包括核心模块、文件模块、目录模块和 node_modules 查找规则。

回答思路

  1. 【回答框架 1】require 的解析流程:首先检查是否为核心模块(如 fs、path),核心模块直接加载;否则按路径解析相对路径或绝对路径,并尝试精确匹配文件、添加 .js、.json、.node 扩展名,再尝试作为目录加载(查找 package.json 的 main 字段或 index.js)。
  2. 【回答框架 2】对于非路径模块,从当前文件所在目录开始,逐级向上级目录查找 node_modules 目录,直到根目录。在每个 node_modules 中,按名称匹配目录,再对该目录执行模块解析(含 package.json main 或 index)。
  3. 【回答框架 3】若最终未找到,抛出 MODULE_NOT_FOUND 错误。模块解析结果会缓存于 require.cache,提高重复加载性能。
  4. 【回答框架 4】解析优先级遵循:核心模块 > 相对/绝对路径 > node_modules 查找;在 node_modules 内,同样遵循精确文件、扩展名尝试、目录处理的顺序。
  5. 【回答框架 5】require 支持从 node_modules 子路径直接加载,如 require('lodash/array'),解析时会将子路径拼接到模块目录下查找。
  6. 【关键点 1】核心模块优先于路径模块,无需提供完整路径。
  7. 【关键点 2】相对或绝对路径解析时,尝试扩展名顺序为 .js、.json、.node。
  8. 【关键点 3】目录模块优先读取 package.json 的 main 字段,否则使用 index.js 等。
  9. 【关键点 4】node_modules 查找从当前目录向上逐层进行,直到文件系统根目录。
  10. 【关键点 5】模块加载结果缓存在 require.cache 中,提升二次加载性能。
  11. 【易错点 1】容易忽略还有 .mjs、.cjs 等扩展名,但 require 默认只追加 .js、.json、.node,除非使用实验性标志。
  12. 【易错点 2】当 package.json 的 main 字段指向的文件不存在时,不会自动回退到 index.js,而会直接报错。
  13. 【易错点 3】node_modules 查找可能涉及符号链接,解析路径可能与实际路径不一致,影响模块定位。