主题
npm
npm CLI:https://docs.npmjs.com/cli/
npm 仓库:https://www.npmjs.com/
node_modules 目录结构
- npm 从 npm 3 开始,使用 扁平化(flatten)安装 依赖。
- node_modules 目录下的包尽可能放在顶层,避免重复安装相同版本的依赖。
- 可能会导致 幽灵依赖(hoisted dependencies) 问题:
- 某个包 A 依赖于 B,但 B 可能被提升到了 node_modules 根目录,使得即使 package.json 没有 B,也能 require('B'),但依赖结构变化后可能会导致 B 丢失。
- npm 7+ 开始默认使用 package-lock.json 和 workspaces 进行优化。
bash
node_modules/
lodash/ # 直接安装的依赖
react/
react-dom/
A/ # A 依赖 B
node_modules/
B/ # A 需要的 B 版本被放在 A 内部(避免版本冲突)
node 模块寻找策略
使用路径(相对路径、绝对路径)写法导入模块,例如:require(./a)
。
- 文件查找
- 首先根据路径寻找
a
文件, - 若找不到,会寻找
a.js
、a.json
文件。
- 首先根据路径寻找
- 文件夹查找
- 若找不到,会进入
a
文件夹,寻找package.json
文件中的main
字段的指定文件。 - 若找不到
package.json
文件或者其main
字段文件不存在,则会在a
文件夹下寻找index.js
、index.json
文件。
- 若找不到,会进入
使用非路径写法导入模块,例如:require(xxx)
。
- 内置模块
- 首先去寻找内置模块,如:fs、path、http ……
- 第三方模块
- 若找不到,会认为是第三方模块,会从
node_modules
文件夹中寻找。并且在node_modules
中寻找的时候,也是遵循 文件查找 和 文件夹查找 的逻辑的。 - 若该层的
node_modules
的没有找到,则会去上层的node_modules
文件夹中寻找。
- 若找不到,会认为是第三方模块,会从