提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
我们在开发过程中,经常使用require或import去引入模块,而在使用过程中,会发现有很多简写方式,如引入index/index.js
我们直接require('/index')
即可,为什么会这样,是因为node中有一套自己的查找规则
一、模块分类
node中加载的模块总共可以分为三个类
- 核心模块
fs、http这些内置模块,在编译时已经注入到内存中
- 本地模块
自己本地开发的模块
- npm下载的模块
值得一提的是,模块在第一次引入后就会缓存在内存中,再次引入时,会直接读取在内存中的模块缓存。所以即使多此require同一个文件也不会多次执行
二、查找机制
我们引入模块时,基本上都是两种使用方式,
模块名
requir(‘fs’)路径
require(‘/index’)
-
在使用模块名时
require('lib')
- 首先会在使用require(‘模块名’)文件的
同级目录
寻找node_modules文件夹 - 如果没有node_modules文件夹则向上级目录寻找,没有找到则继续向上级寻找,直到系统的根目录为止。此时,没有找到则报错
- 如果有
node_modules
文件夹,在里面寻找与模块名相同的目录或文件
,如果查找到文件
则引入文件,如果是目录
则优先寻找同级中package.json文件,如果存在则寻找package.json
文件中的main
配置,如果没有。则寻找index.(js|json)
,如果再没有则向上级目录中的node_modules
文件夹中继续寻找。
- 首先会在使用require(‘模块名’)文件的
-
使用地址时
require('./lib')
- 先寻找
./lib/package.json
中的main
配置 - 没有则寻找
./lib.js
- 没有则寻找
./lib.json
- 没有则寻找
./lib/index.js
- 没有则寻找
./lib.json
- 没有则报错
- 先寻找
后缀补全
在省略文件后缀时,会按照以下优先级去自动补全文件后缀
- 补全.js拓展名加载
- 补全.json拓展名加载
- 补全.node拓展名加载
- 加载失败,终端报错