require优先加载缓存中的模块。同一个模块第一次require之后,就会缓存一份,下一次require时就直接从缓存中去取。
require加载模块可分为下面三种情况:
- 如果是加载核心模块,直接从内存中加载,并缓存
-加载核心模块的格式是const xxx = require("模块名")
。不能写相对路径! - 如果是相对路径,则根据路径加载自定义模块,并缓存
- 以require('./main')
为例( 省略扩展名的情况)
- 先加载main.js
,如果没有再加载main.json
,如果没有再加载main.node
(c/c++编写的模块),找不到就报错。 - 如果不是自定义模块,也不是核心模块,则加载第三方模块,以
require('XXX')
为例:
- node 会去本级 node_modules 目录下的xxx文件夹中找,找到就缓存。找的规则如下:
- ①查找第三方模块文件夹xxx下的 package.json 文件
- ②查找 main 属性,并加载 main 属性所指向的模块
- ③如果 main 属性不存在,则尝试加载名为 index.js 的模块
- ④如果 index.js 加载失败,报错
- 如果找不到,node 则取上一级目录中的node_modules下找 ,node_modules/xxx
目录,规则同上
- 如果一直找到代码文件的文件系统的根目录还找不到,则报错:模块没有找到。
可以通过console.log(module.paths)
来观察查找路径