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

前端架构师-week6-require源码解析

require 源码解析——彻底搞懂 npm 模块加载原理

require 的使用场景

  • 加载模块类型
    • 加载内置模块:require('fs')
    • 加载 node_modules 模块:require('ejs')
    • 加载本地模块:require('./utils')
  • 支持文件类型
    • 加载 .js 文件
    • 加载 .mjs 文件
    • 加载 .json 文件
    • 加载 .node 文件
    • 加载其他类型文件(视为 .js 文件)

require 源码阅读过程中的一些思考 

  • Commonjs 模块的加载流程
  • require 如何加载内置模块?
  • require 如何加载 node_modules 模块?
  • require 为什么会将非 js/json/node 文件视为 js 文件加载? 

Module 对象

  • id:源码文件路径,如:/Users/sam/Desktop/vue-test/imooc-test/bin/ejs/index.js
  • path:源码文件对应的文件夹,通过 path.dirname(id) 生成
  • exports:模块输出的内容,默认为 {}
  • parent:父模块信息
  • filename:源码文件路径
  • loaded:是否已经加载完毕
  • children:子模块对象集合
  • paths:模块查询范围

require 执行流程

 

  

require 执行流程总结

1. relativeResolveCache[relResolveCacheIdentifier] 查询缓存路径

2. Module._cache[filename] 查询缓存模块

3. Module._resolveFilename 查询模块的真实路径

4. loadNativeModule 加载内置模块

5. new Module 实例化 Module 对象

6. module.load(filename) 加载模块

7. findLongestRegisteredExtension 获取文件后缀

8. Module._extensions[extension](this, filename) 解析模块并执行模块

9. module._compile 编译模块代码

10. compileFunction 将模块代码生成可执行函数

11. exports, require, module, filename, dirname 生成入参

12. compiledWrapper.call 执行模块函数

13. return module.exports 输出模块返回结果 

参考资料

  • 阮一峰 require 源码解读:http://www.ruanyifeng.com/blog/2015/05/require.html
  • UTF8 BOM:https://www.imooc.com/article/26166
  • #!  Shebang:https://blog.csdn.net/u012294618/article/details/78427864

扩展知识

require.main 的妙用

用于测试:https://blog.csdn.net/qq_29438877/article/details/103828845

require 源码执行流程分析

require 加载模块原理详解

require 加载内置模块和四种文件类型原理

require 缓存机制解析和CommonJS加载主模块原理

require 原理总结和回顾

http://www.lryc.cn/news/68005.html

相关文章:

  • 作为 IT 行业的过来人,你有什么话想对后辈说的?
  • 表数据编辑(数据库)
  • 考虑多能负荷不确定性的区域综合能源系统鲁棒规划(Python代码实现)
  • RocketMQ整理
  • Springboot +Flowable,会签、或签简单使用(二)
  • 将核心交换机配置为NTP服务器
  • application.properties文件注释
  • MySql查询报错this is incompatible with sql_mode=only_full_group_by
  • VMware Workstation 网络备忘 + 集群规模
  • 被裁现状,给找工作的同学一些建议
  • 编程到底难在哪里?
  • C++ 仿函数(一)
  • MATLAB连续LTI系统的时域分析(十)
  • HBuilderX使用
  • 【JavaSE】多态(多态实现的条件 重写 向上转移和向下转型 向上转型 向下转型 多态的优缺点 避免在构造方法种调用重写的方法)
  • MySQL学习---13、存储过程与存储函数
  • Mysql日志管理、备份与恢复
  • STM32单片机声控语音识别RGB彩灯多种模式亮度可调WS2812彩灯
  • 高校9大学术工具推荐,一定要用起来哦!
  • 记一次压力测试
  • 一个文明是否有竞争力,在很大程度上取决于信息传递的效率。
  • 测试4年,跳槽一次涨8k,我跳了3次···
  • Redis 入门教程(简单全面版)
  • java并发-AQS
  • openAI图像生成开发文档
  • Python综合案例—利用tkinter实现计算器的程序
  • canvas学习笔记
  • Navicat Premium 15安装注教程
  • yolo v8
  • 2022IDEA的下载、安装、配置与使用