React开发依赖 vs 生产依赖

30 浏览
0 Comments

React开发依赖 vs 生产依赖

这份文档 非常不好回答我的问题。我不理解那些解释。有人能用更简单的话来解释吗?如果用简单语言很难理解,或许可以提供一些例子?

编辑:也添加了peerDependencies,这与之密切相关,可能会引起混淆。

admin 更改状态以发布 2023年5月20日
0
0 Comments

如果您不想安装devDependencies,可以使用npm install --production

0
0 Comments

重要行为差异的摘要:

  • dependencies 在以下两种情况下都会被安装:

    • npm install 在包含package.json的目录中运行
    • npm install $package 在任何其他目录中运行
  • devDependencies

    • 在包含package.json的目录中使用npm install命令时也会被安装,除非你传递了--production标志(点赞Gayan Charith的回答),或设置了NODE_ENV=production环境变量
    • npm install "$package"命令中不会默认被安装,除非你给它传递了--dev选项
    • 不会被直接安装
  • peerDependencies:

    • 在版本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的测试依赖项。

此处未讨论的相关选项:

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内部。

例如,如果dependency1dependency2都依赖于dependency3的不同版本,那么项目目录树将如下所示:

root/node_modules/
                 |
                 +- dependency1/node_modules/
                 |                          |
                 |                          +- dependency3 v1.0/
                 |
                 |
                 +- dependency2/node_modules/
                                            |
                                            +- dependency3 v2.0/

然而,插件是通常不需要另一个包,这个包在这种情况下被称为宿主。相反:

  • 插件由宿主需要
  • 插件提供宿主期望找到的标准接口
  • 只有宿主会直接被用户调用,因此必须存在一个版本。

例如,如果dependency1dependency2都是dependency3的同伴依赖关系,那么项目目录树将如下所示:

root/node_modules/
                 |
                 +- dependency1/
                 |
                 +- dependency2/
                 |
                 +- dependency3 v1.0/

即使在您的`package.json`文件中从未提及`dependency3`,此问题仍会发生。我认为这是反转控制设计模式的一个实例。

同级依赖的一个典型例子是Grunt,宿主和其插件。

例如,在像这样的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.

0