Node.js 模块导入的基本流程

Node.js 模块导入的基本流程,主要是 CommonJS 模块加载机制 (即使用 require())的内部执行步骤。下面我用清晰的结构给你梳理一下这个过程:


✅ Node.js 模块导入的基本流程(使用 require())

js 复制代码
const someModule = require('./someModule');

👣 加载流程详解:


① 解析模块路径

  • Node.js 会先判断传入的是:
    • 核心模块 (如 fs, http 等);
    • 第三方模块(node_modules 中找);
    • 相对路径模块 (以 ./ 或 ../ 开头);
    • 绝对路径模块 (如 /Users/...)。

② 定位文件(模块路径解析)

  • 以相对路径为例:require('./someModule'),Node.js 会尝试依次查找以下几种形式:
bash 复制代码
./someModule.js
./someModule.json
./someModule.node
./someModule/index.js   # 如果是目录

③ 缓存检查

  • Node.js 会先查看该模块是否已在 缓存 中(require.cache)。
  • 如果存在缓存,则直接返回缓存结果(即模块导出的对象)。

④ 编译模块

  • Node.js 根据不同文件类型执行不同的加载方式:
文件类型 加载方式
.js 作为 JavaScript 代码加载(包一层函数)
.json 使用 JSON.parse() 解析为对象
.node 使用 C++ 插件方式加载(动态链接库)
  • 对于 .js 文件,Node.js 会将模块代码包装成如下形式:
js 复制代码
(function(exports, require, module, __filename, __dirname) {
  // 原始模块代码
})

这叫做 模块包装(Module Wrapper),让模块拥有自己的作用域。


⑤ 执行模块代码

  • 在模块包装完成后,Node.js 执行模块代码,并把 module.exports 作为结果返回。

⑥ 返回 exports 对象

  • 最终,require() 返回的是 module.exports 的内容。

💡 一个完整的生命周期图示(简略):

text 复制代码
require() 调用
   ↓
路径解析
   ↓
缓存检查(require.cache)
   ↓
文件定位(.js/.json/.node)
   ↓
模块包装(function wrapper)
   ↓
模块执行(module.exports)
   ↓
结果返回

🧠 补充:模块缓存细节

  • 所有加载过的模块都会被缓存(除非手动清理):

    js 复制代码
    delete require.cache[require.resolve('./someModule')];
相关推荐
FungLeo10 小时前
成为全栈·基础补充·Node.js 运行时:事件循环与异步
javascript·node.js·事件循环·后端开发·异步编程·成为全栈
用户087308654871 天前
用 GUI 自动化写了一个群聊 AI:5 个真实事故,和 7 条让 AI 不像机器人的设计
node.js
Dumbness2 天前
毕设后台导出 CSV 的 4 个坑:date 字段漏了公式防护,搜索框输入 % 能扫全表
node.js·express
wno7044 天前
node.js中使用jquery
前端·node.js·jquery
damoluomu5 天前
Node 的 Headless 出厂没有前台,Java 的 Headless 是从门户里长出来的
java·开发语言·node.js
Dumbness5 天前
一个手机号验证码登录接口的五个坑:无限发码、无限试码,传个数字就让 Express 进程退出
node.js·express
怒放的生命19915 天前
本地用 pnpm 省磁盘,团队继续用 npm:极简实践
前端·npm·node.js
Hone6 天前
我把「自动发文章到掘金」做成了一个 Agent 技能:juejin-skills
node.js·ai编程·前端工程化
Dumbness6 天前
二十行手写的 SKILL.md 头部解析,遇到 YAML 的折叠写法、单引号和嵌套键就读错:和 js-yaml 逐条对照
node.js·ai编程