在NPM package.json文件中,dependencies、devDependencies和peerDependencies有什么区别?

2859

这份文档回答了我的问题,但解释得不够清楚。有没有人能用更简单的话来说一下?如果难以选择简单的词语,可以举例说明吗?

另外,我还添加了peerDependencies,这个也与之密切相关,可能会引起混淆。


78
现在还有“optionalDependencies”(可选依赖项)optionalDependencies - Aidan Feldman
310
"optionalDependencies" 是我今天学到的矛盾词。 - Nick Bull
6
npm文档表示: "dependencies": 应用程序在生产环境中需要的包。 "devDependencies": 仅在本地开发和测试中需要的包。请查看链接:https://docs.npmjs.com/specifying-dependencies-and-devdependencies-in-a-package-json-file - Deke
依赖项是您的库使用的软件包引用,如果没有这些引用,它将无法工作,并且必须随您的库安装一起自动安装。在查看peerDependencies时,npm会发出警告消息,以防找不到指定的软件包。它不会为您安装任何软件包。有关详细说明,请参阅链接:https://medium.com/p/16f43d6c7e45 - Goofy
17个回答

11
简而言之:
  1. 依赖项(Dependencies) - npm install <package> --save-prod 安装在生产环境中应用程序所需要的包。

  2. 开发依赖项(DevDependencies) - npm install <package> --save-dev 只安装本地开发和测试所需的包。

  3. 只需键入 npm install 即可安装 package.json 中提到的所有包。

因此,如果您正在本地计算机上工作,请键入 npm install 并继续操作 :)

9

依赖项与开发依赖项

开发依赖项是在开发过程中才需要使用的模块,而依赖项则是在运行时必须要使用的。如果您部署应用程序,则必须安装依赖项,否则您的应用程序将无法工作。从代码中调用的库可以视为依赖项,这些库使程序能够运行。

例如 - React,React-dom

在生产服务器上不需要安装开发依赖项,因为您不会在该机器上进行开发。将您的代码转换为JavaScript的编译器、测试框架和文档生成器可以视为开发依赖项,因为它们只在开发过程中需要使用。

例如 - ESLint,Babel,webpack

@FYI,

mod-a
  dev-dependents:
    - mod-b
  dependents:
    - mod-c

mod-d
  dev-dependents:
    - mod-e
  dependents:
    - mod-a

----

npm install mod-d

installed modules:
  - mod-d
  - mod-a
  - mod-c

----

checkout the mod-d code repository

npm install

installed modules:
  - mod-a
  - mod-c
  - mod-e

如果您正在发布到npm,则使用正确的标志来安装正确的模块非常重要。如果该模块是npm模块运行所需的,那么请使用“--save”标志将该模块保存为依赖项。如果该模块不需要运行但需要进行测试,则使用“--save-dev”标志。

# For dependent modules
npm install dependent-module --save

# For dev-dependent modules
npm install development-module --save-dev

6
dependencies: 是指您的项目/软件包在生产环境中运行所需要的包。 devDependencies: 是指您的项目/软件包在开发过程中所需的包,但不需要在生产环境中使用(例如:测试包)。 peerDependencies: 是指您的项目/软件包需要与之协同工作或作为基础的包,“主要用于开发插件/组件”,以便让其他人知道您的插件/组件应该与“主”包的哪个版本一起使用(例如:React 16)。

3

在尝试分发npm包时,应避免使用dependencies。相反,您需要考虑将其添加到peerDependencies中。

更新

大多数情况下,依赖项只是描述您生态系统的一堆库。除非您确实在使用特定版本的库,否则应该让用户选择是否安装该库以及选择哪个版本,方法是将其添加到peerDependencies中。


2
请在您的答案中添加一些解释,以便其他人可以从中学习 - 为什么应该确切地避免使用dependencies - Nico Haase
大多数情况下,依赖项只是描述生态系统的一堆库。除非你真的在使用特定版本的库,否则应该让用户选择是否安装该库以及选择哪个版本,方法是将其添加到peerDependencies中。 - Melchia
请通过编辑您的答案添加所有澄清内容。 - Nico Haase
@NicoHaase 如果你有任何问题,请告诉我。 - Melchia

3

依赖项

这些是您的软件包运行所需的软件包,因此在用户运行时会安装它们。

 npm install PACKAGE-NAME

例如,如果您在项目中使用了jQuery,那么如果别人没有安装jQuery,则它将无法工作。为了避免这种情况,可以使用依赖项来保存。

 npm install --save

开发依赖项

这些是在开发过程中使用的依赖项,但在别人使用时不需要,因此当别人运行npm install时,不会安装它们,因为它们不是必需的。例如,如果您使用mocha进行测试,人们不需要mocha来运行,因此npm install不会安装它。要保存为开发依赖项,请使用

npm install PACKAGE --save-dev

同级依赖

如果您想创建和发布自己的库,以便将其用作依赖项,则可以使用这些依赖项。例如,如果您希望您的包被用作另一个项目的依赖项,那么在安装具有您的项目作为依赖项的项目时,也会安装这些同级依赖项。大多数情况下,您不会使用同级依赖项。


1

当使用Webpack来打包前端应用程序时,依赖项和开发依赖项之间的区别并不那么清晰。对于最终的捆绑包来说,无论您将依赖项放在哪里都没有关系(但对其他工具可能很重要)。这就是为什么文档看起来令人困惑的原因。

我在这里找到了解释:在使用Webpack时,“dependencies”和“devDependencies”是否重要?


0

运行需要依赖项,开发只需要 devDependencies


如果一个答案基本上提出了与现有答案相同的解决方案,理论上仍然可以是有价值的贡献,如果它能够更详细地解释,或从不同的角度,或更易于理解... 但是这篇文章并没有做到。请不要期望用户会发现这篇文章有帮助。 - Yunnosch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接