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

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


当前回答

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

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

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

其他回答

有些模块和软件包仅用于开发,而在生产中不需要。就像文档中所说的:

如果有人计划在他们的程序中下载并使用您的模块,那么他们可能不想或不需要下载并构建您使用的外部测试或文档框架。在这种情况下,最好在devDependencies散列中列出这些附加项。

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

要将包作为开发依赖项保存到package.json,请执行以下操作:

npm install "$package" --save-dev

运行npm install时,它将同时安装devDependencies和dependencies。要避免安装devDependencies,请运行:

npm install --production

直到我读了一篇关于Ciro的博客文章中的这段话,我才明白peerDependencies对我的意义:

[插件]需要的是一种表达插件及其宿主包之间的“依赖关系”的方式。用某种方式来说,“我只在插入到我的主机包的1.2.x版本时工作,所以如果您安装我,请确保它与兼容主机一起使用。”我们称这种关系为对等依赖关系。

插件确实需要主机的特定版本。。。

peerDependencies适用于插件,即需要“主机”库来执行其功能的库,但可能是在主机的最新版本发布之前编写的。

也就是说,如果我为HostLibraryX v3编写PluginX v1并走开,那么无法保证在发布HostLibraryXv4(甚至HostLibraryX-v3.0.1)时PluginX v1会工作。

…但插件不依赖于主机。。。

从插件的角度来看,它只向宿主库添加函数。我并不真的“需要”主机为插件添加依赖项,而且插件通常并不真正依赖于主机。如果你没有主机,插件就不会做任何有害的事情。

这意味着依赖并不是插件的正确概念。

更糟糕的是,如果我的主机被视为一个依赖,我们最终会遇到同一篇博客文章提到的情况(编辑了一点以使用这个答案的虚构主机和插件):

但是现在,[如果我们将当前版本的HostLibraryX视为PluginX的依赖项,]运行npm安装会导致意外的依赖关系图├── HostLibraryX@4.0.0└─┬ PluginX@1.0.0└── HostLibraryX@3.0.0我将把插件使用不同于主应用程序的[HostLibraryX]API而产生的细微故障留给你想象。

…而且主机显然不依赖于插件。。。

…这就是插件的全部意义。现在,如果主机足够好,能够包含所有插件的依赖信息,这将解决问题,但这也会引入一个巨大的新文化问题:插件管理!

插件的关键在于它们可以匿名配对。在一个完美的世界里,让主人管理它们会很整洁,但我们不会要求图书馆放猫。

如果我们不是等级依赖,也许我们是相互依赖的同龄人。。。

相反,我们有成为同龄人的概念。主机和插件都不在对方的依赖桶中。两者都位于依赖关系图的同一级别。


…但这不是一种自动的关系。<<<钱球!!!

如果我是PluginX v1,并且期望有HostLibraryX v3的对等(即,具有对等依赖关系),我会这么说。如果你已经自动升级到最新的HostLibraryX v4(请注意,这是版本4),并且安装了Plugin v1,你需要知道,对吗?

npm无法为我管理这种情况--

“嘿,我看到你在使用PluginX v1!我正在自动将HostLibraryX从v4降级到v3,kk?”

“嘿,我看到你在使用PluginX v1。这需要HostLibraryX v3,在上一次更新时,它已被遗忘。为了安全起见,我正在自动卸载插件v1!!1.

不怎么样,npm?!

所以npm没有。它会提醒您这种情况,并让您了解HostLibraryX v4是否适合插件v1。


Coda

插件中良好的peerDependency管理将使这一概念在实践中更加直观。从博客文章,再一次。。。

有一条建议:与常规依赖不同,对等依赖的要求应该宽松。您不应将对等依赖项锁定到特定的修补程序版本。如果一个Chai插件同行依赖Chai 1.4.1,而另一个依赖Chai 1.5.0,这真的很烦人,因为作者很懒,没有花时间找出他们所兼容的Chai的实际最低版本。

依赖关系与开发依赖关系

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

例如,反应,反应域

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