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

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')];
    
http://www.xdnf.cn/news/1075.html

相关文章:

  • 【Harmony】常用工具类封装
  • Jupyter Notebook 中切换/使用 conda 虚拟环境的方式(解决jupyter notebook 环境默认在base下面的问题)
  • Python爬虫从入门到实战详细版教程Char01:爬虫基础与核心技术
  • 【网络】代理服务器收尾及高级IO
  • vue项目中axios统一或单独控制接口请求时间
  • WPS Office安卓版云文档同步速度与PDF转换体验测评
  • 音视频小白系统入门课-3
  • 媒体发稿攻略,解锁新闻发稿成长新高度
  • 双指针-11.盛水最多的容器-力扣(LeetCode)
  • vue作业-周报管理系统
  • python 执行顺序
  • 程序员学商务英文之Terms of Payment Packing
  • 日志文件太大,如何分卷压缩便于传输
  • pwm驱动呼吸灯
  • 【NCCL】transport建立(一)
  • Express项目实战大事件后台 API 项目(五)——文章管理
  • java集合框架day1————集合体系介绍
  • 服务器监控软件推荐
  • Python Cookbook-6.7 有命名子项的元组
  • RAG vs 微调:大模型定制化技术选型全解析
  • 10、Context:跨维度传音术——React 19 状态共享
  • 【Java核心技术卷Ⅰ-第11版学习-第3章-Java的基本程序设计结构】
  • 每日一题(9) 垃圾箱分布
  • 基于SpinrgBoot+Vue的智慧农业管理平台-031
  • 远程医疗系统如何有效防护CC攻击
  • 智慧教室电子班牌-智能管理系统源码,‌后端‌基于Spring Boot框架,前端‌使用Vue.js框架进行组件化开发
  • 在python中装饰器的使用
  • File工具总结
  • 悟空黑桃A邀请码(31187835)
  • VSCode远程图形化GDB