Package-lock.json - 需要 vs 依赖项

Package-lock.json - requires vs dependencies

在依赖对象的包-lock.json中,我有requiresdependencies字段,例如

  "requires": {
    "@angular-devkit/core": "0.8.5",
    "rxjs": "6.2.2",
    "tree-kill": "1.2.0",
    "webpack-sources": "1.3.0"
  },
  "dependencies": {
    "rxjs": {
      "version": "6.2.2",
      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz",
      "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==",
      "dev": true,
      "requires": {
        "tslib": "1.9.3"
      }
    }
  }

这两者有什么区别?为什么一些依赖项列在 requires 中,另一些列在 dependencies 中,而其中一些列在这两个字段中?

默认情况下,npm 会直接在 node_modules.

中安装所有包

但是,假设包 X 在版本 1.0 中依赖于包 Z,包 Y 依赖于同一个包 Z,但在版本2.0。在这种情况下,我们必须安装该软件包的两个版本。一个安装在根node_modules文件夹,另一个安装在依赖包的node_modules文件夹,如

package.json
node_modules
    /X
    /Y
        /node_modules
            /Z@2.0
    /Z@1.0

同样有可能,npm 可以构建一个不同的,但是 still correct,包树:

package.json
node_modules
    /X
        /node_modules
            /Z@1.0
    /Y
    /Z@2.0

package-lock.json 文件不仅会尝试描述项目的依赖关系,还会尝试描述此树结构。 JSON.

中将对上面要构建的两棵树中的哪一棵进行编码

有了这些知识,就很容易理解了:

“requires”反映来自此依赖项的 package.json 文件的依赖项,而 dependencies 反映此依赖项的 node_modules 文件夹中实际安装的依赖项。

看完上面的回答,也许我可以说得更简单:

requires 可以 共享 在所有其他顶级依赖项中,而 dependencies 独立的 ,属于仅适用于需要它们的模块。

"@angular-devkit/core": "0.8.5""tree-kill": "1.2.0""webpack-sources": "1.3.0" 不属于 模块。它们与需要它们的模块处于同一级别。相比之下,"rxjs": "6.2.2" 仅因模块需要而存在,并且仅由该模块使用。