React开发依赖 vs 生产依赖
React开发依赖 vs 生产依赖
这份文档 非常不好回答我的问题。我不理解那些解释。有人能用更简单的话来解释吗?如果用简单语言很难理解,或许可以提供一些例子?
编辑:也添加了peerDependencies
,这与之密切相关,可能会引起混淆。
重要行为差异的摘要:
-
dependencies
在以下两种情况下都会被安装:npm install
在包含package.json
的目录中运行npm install $package
在任何其他目录中运行
-
- 在包含
package.json
的目录中使用npm install
命令时也会被安装,除非你传递了--production
标志(点赞Gayan Charith的回答),或设置了NODE_ENV=production
环境变量 - 在
npm install "$package"
命令中不会默认被安装,除非你给它传递了--dev
选项 - 不会被直接安装
- 在包含
-
- 在版本3.0之前:如果缺失,则总是被安装,并在不同依赖项需要使用多个不兼容版本的依赖项时引发错误。
- 预计在3.0上启动(未经测试):如果
npm install
缺失,则会发出警告,你必须手动解决依赖项。如果依赖项缺失,则会出现错误(由@ nextgentech提到)。该网站很好地解释了这个问题:https://flaviocopes.com/npm-peer-dependencies/ - 在7版本中,除非存在无法自动解决的上游依赖项冲突,否则将自动安装peerDependencies
-
传递性(由Ben Hutchison提到):
-
dependencies
具有传递性:如果A需要B,B需要C,则会安装C,否则,B可能无法运行,A也将无法运行。 -
devDependencies
没有传递性。例如,我们不需要测试B来测试A,因此可以忽略B的测试依赖项。
-
此处未讨论的相关选项:
bundledDependencies
讨论如下问题:npm中bundledDependencies与普通依赖关系的优点optionalDependencies
(由Aidan Feldman提到)
devDependencies
dependencies
是必须要运行的,devDependencies
只用于开发,例如:单元测试,CoffeeScript到JavaScript的转换,代码压缩等等。
如果你要开发一个包,那么你要先下载它(例如通过git clone
),进入包所在的根目录,其中包含package.json
文件,并运行以下命令:
npm install
由于你要开发源代码,因此默认情况下会同时安装dependencies
(因为你肯定需要运行才能开发)和devDependencies
依赖。
然而,如果你只是普通用户想安装一个包来使用它,那么你可以在任何目录下执行:
npm install "$package"
这种情况下,通常不需要安装开发依赖项,因此只会安装使用该包所需的dependencies
。
如果你确实想在这种情况下安装开发依赖项,你可以将dev
配置选项设置为true
,可能是通过以下命令行:
npm install "$package" --dev
默认情况下选项为false
,因为这是一个较少见的情况。
peerDependencies
(在3.0之前测试过)
来源:https://nodejs.org/en/blog/npm/peer-dependencies/
对于常规依赖项,你可以拥有多个版本的依赖项:这只是安装在依赖项的node_modules
内部。
例如,如果dependency1
和dependency2
都依赖于dependency3
的不同版本,那么项目目录树将如下所示:
root/node_modules/ | +- dependency1/node_modules/ | | | +- dependency3 v1.0/ | | +- dependency2/node_modules/ | +- dependency3 v2.0/
然而,插件是通常不需要另一个包,这个包在这种情况下被称为宿主。相反:
- 插件由宿主需要
- 插件提供宿主期望找到的标准接口
- 只有宿主会直接被用户调用,因此必须存在一个版本。
例如,如果dependency1
和dependency2
都是dependency3
的同伴依赖关系,那么项目目录树将如下所示:
root/node_modules/ | +- dependency1/ | +- dependency2/ | +- dependency3 v1.0/
即使在您的`package.json`文件中从未提及`dependency3`,此问题仍会发生。我认为这是反转控制设计模式的一个实例。
同级依赖的一个典型例子是Grunt,宿主和其插件。
例如,在像
`grunt`是同级依赖项
唯一的`require('grunt')`在`tests /`下:实际上它没有被程序使用。
然后,当用户使用插件时,他会通过添加`grunt.loadNpmTasks('grunt-contrib-uglify')`行从`Gruntfile`中隐式地要求插件,但实际上用户将直接调用`grunt`。
如果每个插件都需要不同的Grunt版本,则将无法工作。
手册
我认为文档回答了问题,也许您对节点/其他包管理器不够熟悉。我可能只是因为我对Ruby绑定程序有一点了解,所以才能理解它。
关键行是:
"这些东西将在从软件包的根目录执行npm链接或npm安装时安装,并且可以像任何其他npm配置参数一样进行管理。有关此主题的更多信息,请参见npm-config(7)。"
然后在npm-config(7)下查找`dev`:
Default: false Type: Boolean Install dev-dependencies along with packages.