43

在依赖对象的 package-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,而其中一些列在这两个字段中?

4

2 回答 2

34

默认情况下,npm 将所有包直接安装在node_modules.

但是,假设 packageX依赖于Z1.0 版中的 package 并且 packageY依赖于同一个 package Z,但在 2.0 版中。在这种情况下,我们必须安装这个包的两个版本。一个安装在根node_modules文件夹,另一个安装在node_modules依赖包的文件夹中,例如

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

同样可能的是,npm 可以构建一个不同但仍然正确的包树:

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

package-lock.json文件不仅会尝试描述项目的依赖关系,还会尝试描述此树结构。上面要构建的两棵树中的哪棵将在 JSON 中编码。

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

“requires”反映package.json了这个依赖的文件中的依赖,而dependencies反映了这个依赖的node_modules文件夹中实际安装的依赖。

于 2018-12-09T12:47:52.700 回答
20

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

requires可以在所有其他顶级依赖项之间共享dependencies,同时是独立的,仅属于需要它们的模块。

IE

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

于 2019-08-08T01:16:27.887 回答