Package-lock.json - требует зависимости vs

В package-lock.json в объекте зависимости у меня есть поля requires и dependencies, например

  "requires": {
    "@angular-devkit/core": "0.8.5",
    "rxjs": "6.2.2",
    "tree-kill": "1.2.0",
    "webpack-sources": "1.3.0"
  },
  "dependencies": {
    "rxjs": {
      "version": "6.2.2",
      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz",
      "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==",
      "dev": true,
      "requires": {
        "tslib": "1.9.3"
      }
    }
  }

В чем разница между этими двумя? Почему некоторые зависимости перечислены в requires, другие в dependencies и некоторые из них в обоих этих полях?

Ответ 1

Пусть начнется с начала, с docs.npmjs:

Требуется:

Это сопоставление имени модуля с версией. Это список всего, что требует этот модуль, независимо от того, где он будет установлен. Версия должна соответствовать нормальным правилам соответствия зависимости либо в наших зависимостях, либо на уровне выше нас.

Значение Требуется сопоставление ваших модулей и всего, что требуется конкретному модулю для правильной работы, независимо от того, где вы его установили.

Например, для того, чтобы ваши модули работали, вы должны иметь "@angular-devkit/core": "0.8.5", установленный через npm i.


зависимости:

Зависимости этой зависимости, как и на верхнем уровне.

Просто так звучит.


Разница:

Требуется, заявляет модули, которые необходимы для запуска и работы вашего приложения.

Зависимости. Перечисляет зависимости в приложении так же, как и на верхнем уровне.

Значение зависимостей, чтобы сделать вещи более ясными

Отображение имени пакета для объекта зависимостей.

Ответ 2

Подробное объяснение, основанное на ответе Барра J:

По умолчанию npm устанавливает все пакеты прямо в node_modules.

Однако допустим, что пакет X зависит от пакета Z в версии 1.0, а пакет Y зависит от того же пакета Z, но в версии 2.0. В этом случае мы должны установить две версии этого пакета. Один будет установлен в корневой папке node_modules, а другой будет установлен в папке node_modules зависимого пакета, например

package.json
node_modules
   /X
   /Y
      /[email protected]
   /[email protected]

С этим знанием легко понять:

"require" отражает зависимости из файла package.json, в то время как "dependencies" отражает фактически установленные зависимости в папке node_modules этой зависимости.

Ответ 3

Прочитав ответы выше. Может быть, я могу выразить это более простым способом

requires может быть совместно используемым среди всех других зависимостей верхнего уровня, тогда как dependencies является автономным, принадлежность только модулю требует его

т.е.

"@angular-devkit/core": "0.8.5", "tree-kill": "1.2.0", "webpack-sources": "1.3.0" не принадлежат только модулю, они находятся на том же уровне, что и модуль. Напротив, "rxjs": "6.2.2" существует исключительно потому, что модуль требует его. И это используется только модулем