当前位置: 首页 > news >正文

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

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


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

const someModule = require('./someModule');

👣 加载流程详解:


解析模块路径

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

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

  • 以相对路径为例:require('./someModule'),Node.js 会尝试依次查找以下几种形式:
./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 会将模块代码包装成如下形式:
(function(exports, require, module, __filename, __dirname) {// 原始模块代码
})

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


执行模块代码

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

返回 exports 对象

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

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

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

🧠 补充:模块缓存细节

  • 所有加载过的模块都会被缓存(除非手动清理):
    delete require.cache[require.resolve('./someModule')];
    

相关文章:

  • 【操作系统间文件共享_Samba】一、Samba 技术基础与核心功能剖析​
  • Python爬虫从入门到实战详细版教程
  • 【leetcode100】零钱兑换
  • list底层原理
  • Python基础知识语法归纳总结(数据类型-2)
  • 调和平均数通俗易懂的解释以及为什么这样定义,有什么用
  • Git ——提交至github,Vercel拉取,更新不了项目的问题解决
  • redis数据类型-基数统计HyperLogLog
  • 典籍知识问答典籍查询界面前端界面设计效果实现
  • C# byte[]字节数组常用的一些操作。
  • 实战交易策略 篇十七:翻倍黑马交易策略
  • npm的基本使用安装所有包,安装删除指定版本的包,配置命名别名
  • 解决方案 | 晶尊微智能马桶着座感应模块
  • nodejs的包管理工具介绍,npm的介绍和安装,npm的初始化包 ,搜索包,下载安装包
  • Git远程操作
  • Java MCP客户端SDK实现
  • Unity 带碰撞的粒子效果
  • Linux 系统监控进阶:htop 命令详解与高效运维
  • 已安装爱思助手和Apple相关驱动,但仍无法有线连接iPhone热点,且网络适配器没有Apple Mobile Device Ethernet,问题解决
  • 比特币三种扩容路径Nubit、Babylon、Bitlayer分析
  • 涡虫首上太空,神舟二十号任务将开展3项生命科学实验
  • 神二十具备执行发射任务的各项条件
  • 李公明|“小时光”与大时代中的地铁阅读者
  • 普京签署有关批准俄罗斯与伊朗全面战略伙伴关系条约的联邦法令
  • “6+2”小复式追加票!松江购彩者擒大乐透1672万头奖
  • 正义网评“一男两女举办婚礼”:“一夫多妻”流量闹剧该歇了