require 函数功能:导入文件(模块)中导出的对象。
require 查找规则
导入对象语法如下:
require(X);
常用查找规则:
- 情况一:X 为一个核心模块,比如 path、http
- 则 require 直接返回核心模块,并且停止查找
- 情况二:X 是以 ./ 或 …/ 或 /(根目录)起始,按照以下顺序查找文件(直至找到对应文件)。
- step01:将 X 当作文件在对应目录下查找
- 拥有后缀名,按照 X.后缀名 格式查找对应的文件
- 没有后缀名
- 直接查找文件 X
- 查找 X.js 文件
- 查找 X.json 文件
- 查找 X.node 文件
- step02:为找到对应的文件,将 X 作为一个目录,查找该目录下名为 index 的文件
- 查找 X/index.js 文件
- 查找 X/index.json 文件
- 查找 X/index.node 文件
- step03:仍然没有找到,报错:not found
- 情况三:只有 X(没有路径),并且 X 并不是一个核心模块,查找顺序如图:
- 仍然没有找到,报错:not found
- step01:将 X 当作文件在对应目录下查找
require 注意事项
- require() 为同步函数,即查找到文件的代码会在本文件的代码之前执行
- 模块在被第一次引入时,模块的 js 代码会被运行一次
- node缓存机制,如果该文件已经被引入过一次,那么该文件会进入缓存,待再被引入时会直接从缓存中获取该文件,此时该文件代码并不会自动执行
- 该模块是否被引入过由 Module.loaded (Boolean 类型)记录,未被加载过 Module.loaded: false。已被加载过 Module.loaded: true。
- 循环引入模块时,Node采用深度优先算法
- 图示加载顺序为:main -》aaa -》ccc -》ddd -》eee -》bbb
- 图示加载顺序为:main -》aaa -》ccc -》ddd -》eee -》bbb