官方文档:https://www.nodeapp.cn/modules.html#modules_modules
1、在 Node.js 模块系统中,每个文件都被视为独立的模块。
2、当 Node.js 直接运行一个文件时,require.main 会被设为它的 module。 这意味着可以通过 require.main === module 来判断一个文件是否被直接运行。
1 require函数
用来加载目标js库,并返回目标js库公开的属性成员函数/变量。
伪代码
functionrequire(/* ... */){constmodule={exports:{}};((module,exports)=>{// 模块代码在这。在这个例子中,定义了一个函数。functionsomeFunc(){}exports=someFunc;// 此时,exports 不再是一个 module.exports 的快捷方式,// 且这个模块依然导出一个空的默认对象。module.exports=someFunc;// 此时,该模块导出 someFunc,而不是默认对象。})(module,module.exports);returnmodule.exports;}加载顺序
1、内置模块(fs、http…)
优先级最高,直接返回 native 绑定,即使本地装了同名包也会被忽略 。
2、相对路径文件模块(./foo、…/lib/bar)
会把文件当成一个“包”,按 .js → .json → .node 顺序补全扩展名 。
3、目录模块(require(‘./dir’))
先看 dir/package.json 的 main 字段 → 没有就退回到 dir/index.js 。
4、第三方包(require(‘lodash’))
触发“node_modules 向上漂移”算法:
当前文件父级 → 再父级 → … → 根目录,直到找到第一个 node_modules/lodash 。
2 module对象
在每个模块中,module 的自由变量是一个指向表示当前模块的对象的引用。 为了方便,module.exports 也可以通过全局模块的 exports 对象访问。 module 实际上不是全局的,而是每个模块本地的。
参考文档
浅析nodejs的require函数分别加载自定义模块和npm开源库的不同加载原理、NodeJS模块加载机制require和module的理解
Node.js的模块解析机制