这个文档很难回答我的问题。我不明白这些解释。有人能用更简单的话说吗?如果很难选择简单的单词,可以举个例子吗?

EDIT还添加了peerDependencies,它密切相关,可能会引起混淆。


当前回答

当使用Webpack捆绑前端应用程序时,依赖项和devDependencies之间的区别不是很清楚。对于最终的捆绑包,将依赖项放置在何处并不重要(但对于其他工具来说可能很重要)。这就是为什么文档看起来很混乱。

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

其他回答

依赖项:项目/包需要在生产环境中工作的包。

devDependencies:您的项目/包在开发时需要工作但在生产中不需要的包(例如:测试包)

peerDependencies:您的项目/包需要与之协同工作(与它们“协同工作”)或作为基础的包,主要用于开发插件/组件以了解您的插件/组件应该与哪个版本的“主”包协同工作(例如:React 16)

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

使现代化

大多数时候,依赖关系只是描述您的生态系统的一堆库。除非你真的在使用某个库的特定版本,否则你应该让用户通过将其添加到peerDependencies中来选择是否安装该库以及选择哪个版本。

依赖关系与开发依赖关系

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

例如,反应,反应域

开发依赖模块不需要安装在生产服务器上,因为您不需要在该机器上进行开发。将代码转换为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

从属关系项目需要运行的依赖项,如提供从代码调用的函数的库。它们是以过渡方式安装的(如果A依赖于B依赖于C,则在A上安装npm将安装B和C)。示例:lodash:您的项目调用一些lodash函数。

devDependencies您只需要在开发或发布过程中使用的依赖项,例如将代码编译为javascript、测试框架或文档生成器的编译器。它们不是以过渡方式安装的(如果A依赖于B,则dev依赖于C,npm安装在A上将只安装B)。示例:grut:您的项目使用grut来构建自己。

对等依赖关系项目在父项目中挂钩或修改的依赖项,通常是其他库或工具的插件。这只是一个检查,确保父项目(将依赖于您的项目的项目)依赖于您所连接的项目。因此,如果你制作了一个插件C,将功能添加到库B中,那么制作项目a的人需要依赖于B,如果他们依赖于C。未安装它们(除非npm<3),只检查它们。示例:grut:您的项目为grut添加了功能,并且只能用于使用grut的项目。

本文档很好地解释了对等依赖关系:https://nodejs.org/en/blog/npm/peer-dependencies/

此外,随着时间的推移,npm文档得到了改进,现在对不同类型的依赖关系有了更好的解释:https://github.com/npm/cli/blob/latest/docs/content/configuring-npm/package-json.md#devdependencies

例如,mocha通常是一个devDependency,因为在生产中不需要测试,而express则是一个依赖项。