Skip to content

npm

npm CLI:https://docs.npmjs.com/cli/
npm 仓库:https://www.npmjs.com/

node_modules 目录结构

  1. npm 从 npm 3 开始,使用 扁平化(flatten)安装 依赖。
  2. node_modules 目录下的包尽可能放在顶层,避免重复安装相同版本的依赖。
  3. 可能会导致 幽灵依赖(hoisted dependencies) 问题:
    • 某个包 A 依赖于 B,但 B 可能被提升到了 node_modules 根目录,使得即使 package.json 没有 B,也能 require('B'),但依赖结构变化后可能会导致 B 丢失。
  4. 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)

  1. 文件查找
    1. 首先根据路径寻找 a 文件,
    2. 若找不到,会寻找 a.jsa.json 文件。
  2. 文件夹查找
    1. 若找不到,会进入 a 文件夹,寻找 package.json 文件中的 main 字段的指定文件。
    2. 若找不到 package.json 文件或者其 main 字段文件不存在,则会在 a 文件夹下寻找 index.jsindex.json文件。

使用非路径写法导入模块,例如:require(xxx)

  1. 内置模块
    1. 首先去寻找内置模块,如:fs、path、http ……
  2. 第三方模块
    1. 若找不到,会认为是第三方模块,会从 node_modules 文件夹中寻找。并且在 node_modules 中寻找的时候,也是遵循 文件查找文件夹查找 的逻辑的。
    2. 若该层的 node_modules 的没有找到,则会去上层的 node_modules 文件夹中寻找。

基于 MIT 许可发布