require 具体实现原理

122 阅读1分钟

require 基本原理

require 和 module.exports 干的事情并不复杂,我们先假设有一个全局对象{},初始对象是空的,当你require某个文件时,就将这个文件拿出来执行,如果这个文件里面存在module.exports,当运行到这行代码时将module.exports的值加入到这个对象,键为对应的文件名,最终这个对象就长这样:

{
  "a.js": "hello world",
  "b.js": function add(){},
  "c.js": 2,
  "d.js": { num: 2 }
}

当你再次require某个文件时,如果这个对象里面有对应的值,就直接返回给你,如果没有就重复前面的步骤,执行目标文件,然后将它的module.exports加入这个全局对象,并返回给调用者。这个全局对象其实就是我们经常说的缓存。所以require和module.exports并没有什么黑魔法,就只是运行并获取目标文件的值,然后加入缓存,用的时候拿出来就行。

require查找路径

image.png 具体可以看看这篇  深入 Node.js 的模块加载机制,手写 require 函数
还有这篇 require 具体实现原理是什么