require的加载机制
效果
在我们使用一个模块时,我们会使用require命令来加载这个模块。以加载一个自定义模块为例,require(文件名)的效果是:
- 执行这个文件中的代码(会把代码执行一遍)
- 把这个文件中的
module.exports
对象中的内容返回出来。
以如下代码为例:
// moudule1.js
var a = 1;
var b = 2;
console.log(a+b);
var c = a+b;
module.exports = {
data: c
}
在index.js中使用模块
// index.js
const obj = require('./moudule1.js');
console.log(obj);
//这里的obj对象就是moudule1.js中的module.exports对象
require加载规则:
require
优先加载缓存中的模块。同一个模块第一次require
之后,就会缓存一份,下一次require
时就直接从缓存中去取。- 如果是加载核心模块,直接从内存中加载,并缓存
- 加载核心模块的格式是
const xxx = require("模块名")
。不能写相对路径!
- 加载核心模块的格式是
- 如果是相对路径,则根据路径加载自定义模块,并缓存
- 以
require('./main')
为例( 省略扩展名的情况) - 先加载
main.js
,如果没有再加载main.json
,如果没有再加载main.node(c/c++编写的模块)
,找不到就报错。
- 以
- 如果不是自定义模块,也不是核心模块,则加载第三方模块
以require('XXX')
为例:- node 会去本级 node_modules 目录中找
xxx.js
---->xxx.json
---->xxx.node(找到一个即返回)
,找到并缓存。 - 如果找不到,node 则取上一级目录下找node_modules/xxx 目录,规则同上
- 如果一直找到代码文件的文件系统的根目录还找不到,则报错:模块没有找到。
- node 会去本级 node_modules 目录中找
在module.paths
命令中可以看到搜索路径中包含node_modules这个文件夹
在xxx.js
中输出module.paths
可以查看