不管是 CommonJS 的 require
还是 ES6 的 import
,都涉及到 Node 的模块查找方式,主要分为以下几种查找方式
- 文件查找
- 文件夹查找
- 内置模块
- 第三方模块
文件查找
如果模块是以 相对路径(…/ ./) 或 绝对路径(/)导入,则启用文件查找
首先会尝试自动补充后缀,.js .json,如果有则导入该文件,若仍然找不到则进入文件夹查找。
文件夹查找
require("./a")
既然不是文件,会当做文件夹处理,找到 a 文件夹,并根据其根目录下 package.json
中的配置查找,如果找到,则正确导入。
// main.js
require("./a")
// a > b.js
console.log("b.js")
// a > package.json
{
"main":"./b.js"
}
如果没有 package.json
或 package.json
中没有 main
配置 或 package.json
中 main
配置了一个错误路径,则会直接查找文件夹下名为 index.js 或 index.json 的文件。
内置模块 与 第三方模块
如果导入时没使用绝对/相对路径,则视为内置模块 或 第三方模块。
- 首先判断是否为内置模块,如fs、path、http。
- 如果并不是内置模块,则视为第三方模块,会去
node_modules
中查找该模块。
逻辑同 文件查找 和 文件夹查找
第三方模块通常也都会在 package.json 中声明