This documentation个答案很难回答我的问题.我不明白那些解释.有人能用更简单的话说吗?如果很难 Select 简单的词,可以举一些例子?

EDIT还增加了peerDependencies,这是密切相关的,可能会引起混淆.

推荐答案

重要行为差异总结:

  • dependencies安装在以下两个设备上:

    • npm install来自包含package.json的目录
    • npm install $package在任何其他目录上
  • 依赖性个是:

    • 也安装在npm install包含package.json的目录上,除非通过--production标志(向上投票Gayan Charith's answer).
    • 不安装在任何其他目录的npm install "$package"上,除非您给它--dev选项.
    • 不是通过传递方式安装的.
  • 对等依赖:

    • 3.0之前:如果缺少,则始终安装,如果不同的依赖项将使用多个不兼容版本的依赖项,则会引发错误.
    • expected to start on 3.0(未测试):如果npm install上缺少,请给出警告,您必须手动解决依赖关系.运行时,如果缺少依赖项,就会出现一个错误(@nextgentech中提到),这很好地解释了这一点:https://flaviocopes.com/npm-peer-dependencies/
    • 除非存在无法自动解决的upstream 依赖冲突,否则将自动安装in version 7个对等依赖项
  • 及物性(Ben Hutchison中提到):

    • dependencies是通过传递方式安装的:如果A需要B,B需要C,那么C就会被安装,否则,B不能工作,A也不会.

    • 依赖性不是通过过渡方式安装的.例如,我们不需要测试B来测试A,所以B的测试依赖性可以忽略不计.

此处未讨论的相关选项:

依赖性

dependencies个需要运行,依赖性个只需要开发,例如:单元测试、CoffeeScript到JavaScript的转换、缩小...

如果你要开发一个软件包,你可以下载它(例如通过git clone),转到包含package.json的根目录,然后运行:

npm install

由于您有实际的源代码,很明显您想要开发它,因此默认情况下,dependencies(当然,因为您必须运行才能开发)和devDependency个依赖项也都已安装.

但是,如果您只是一个最终用户,只想安装一个软件包来使用它,那么您可以从任何目录执行以下操作:

npm install "$package"

在这种情况下,您通常不需要开发依赖项,所以您只需要获得使用包所需的:dependencies.

如果您真的想在这种情况下安装开发包,可以将dev配置选项设置为true,可能是从命令行:

npm install "$package" --dev

默认情况下,选项为false,因为这是一种不太常见的情况.

对等依赖

(在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/

然而,插件是通常不需要另一个包的包,在本文中称为host.相反:

  • 插件需要by the host
  • 插件提供了主机希望找到的标准接口
  • 只有主机会被用户直接调用,所以必须有一个单一版本的主机.

例如,如果dependency1dependency2对等体依赖于dependency3,则项目树将如下所示:

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

即使你在package.json文件中从未提及dependency3,也会发生这种情况.

我认为这是Inversion of Control设计模式的一个例子.

对等依赖的一个典型例子是主机Grunt及其插件.

例如,在像https://github.com/gruntjs/grunt-contrib-uglify这样的Grunt插件上,您将看到:

  • gruntpeer-dependency
  • 只有require('grunt')个在tests/以下:程序实际上没有使用它.

然后,当用户使用插件时,他会通过添加grunt.loadNpmTasks('grunt-contrib-uglify')行隐式地从Gruntfile中获取插件,但用户将直接调用grunt.

如果每个插件都需要不同的Grunt版本,那么这就行不通了.

手册

我认为文档很好地回答了这个问题,也许您只是对 node /其他包管理器不够熟悉.我可能只理解它,因为我对Ruby bundler了解一点.

关键是:

这些东西将在从包的根目录执行npm链接或npm安装时安装,并且可以像任何其他npm配置参数一样进行管理.有关此主题的更多信息,请参阅npm配置(7).

然后在npm配置(7)下找到dev:

Default: false
Type: Boolean

Install dev-dependencies along with packages.

Node.js相关问答推荐

容器端口是容器内 node 应用程序的端口吗?

EJS ForEach循环标记

TS 后端开发:prismagenerate找不到已安装的@tsed/prisma包

找不到 vue-template-compiler@2.6.14 的匹配版本 | Shopware 6.5 更新后的 node 问题

如何从mongoose 对象内嵌套的数组中提取数组元素?

nyc 代码覆盖不适用于 NodeJs Express 服务器

无法截取页面截图

运行 cypress 测试时如何指定 .env 文件用于我的开发服务器?

如何防止 Chrome 通过 Selenium 崩溃?

Mongodb 从文档中获取聚合结果中的特定属性

如何让我的 Next.js 应用在运行 ubuntu-latest 的 Azure 应用服务中启动?

fs.writefile 选项参数的可能值,尤其是只读文件的整数

如何将使用 Gulp 的 node 部署到 heroku

在 ExpressJS 中将变量传递给 JavaScript

Node.js 中空函数的简写

Node.js `--nolazy` 标志是什么意思?

Puppeteer 记录在 page.evaluate

Heroku + Node:找不到模块错误

如何在 NodeJS 中拆分和修改字符串?

在 Node.js 中混合使用 JavaScript 和 TypeScript