Краткий обзор того, что такое peerDependencies, как их использовать и когда.

В этой статье я надеюсь понять, что такое запись peerDependencies в package.json, почему такие зависимости критичны в некоторых случаях и как их использовать в проекты.

Пакет package.json

Проект с файлом с именем package.json в корне каталога проекта считается проектом NPM, что означает, что проект может использовать чужой код / ​​пакеты, опубликованные в репозитории NPM. Package.json - это файл, определяющий некоторые факты о проекте и некоторые настройки того, как проект будет вести себя при взаимодействии / взаимодействии, в дополнение к фактам и поведению файл package.json определяет зависимости и их версии, от которых зависит проект. на.

Файл package.json - это файл, написанный в формате JSON, пример этого файла следующий:

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

В этой статье я сосредоточусь на свойствах dependencies, devDependencies и peerDependencies объекта package.json. Давайте объясним эти три записи, как в официальной документации.

Зависимости - зависимости указываются в простом объекте, который сопоставляет имя пакета с диапазоном версий. Диапазон версий - это строка, которая имеет один или несколько дескрипторов, разделенных пробелами. Зависимости также можно определить по URL-адресу tarball или git.

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

В этом случае лучше всего сопоставить эти дополнительные элементы в объекте devDependencies.

peerDependencies- В некоторых случаях вы хотите выразить совместимость вашего пакета с инструментом или библиотекой хоста, но не обязательно делать require этого хоста. Обычно это называется плагином. Примечательно, что ваш модуль может предоставлять определенный интерфейс, ожидаемый и указанный в документации хоста.

optionalDependencies- Если зависимость может использоваться, но вы хотите, чтобы npm продолжал работать, если ее не удается найти или не удается установить, вы можете поместить ее в объект optionalDependencies.

bundledDependencies- Определяет массив имен пакетов, которые будут объединены при публикации пакета.

Источник

В случаях, когда вам нужно сохранить пакеты npm локально или сделать их доступными через загрузку одного файла, вы можете объединить пакеты в файл tarball, указав имена пакетов в массиве bundledDependencies и выполнив npm pack.

Итак, что такое peerDependency? Это зависимость, которая может потребоваться потребляющему проекту / библиотеке или другим сторонним пакетам / библиотекам, потребляемым проектом, которая зависит от вашего проекта / библиотеки, а также требуется для вашего проекта / библиотеки, которая определяет peerDependency . Если это не имеет смысла, может быть, лучше было бы привести пример, взгляните на изображение ниже.

Предположим, что указанный выше проект представляет собой библиотеку с именем my-demo и представляет собой компонент всплывающей подсказки , my-demo зависит от tippy.js, webpack и @ angular / core, и обратите внимание, что это 3 разных типа зависимостей в package.json, но основное внимание уделяется @ angular / core, поскольку это наши peerDependencies.

Теперь, поскольку my-demo является библиотекой, мы знаем, что какой-то другой проект (назовем его deeApp) будет использовать нашу библиотеку, и этот проект-потребитель является проектом Angular 7.

Теперь, когда мы знаем, что проект-потребитель (deeApp) является проектом Angular и зависит от @ angular / core, и, в частности, от v7, у нас будет конфликт, когда установка my-demo в проект-потребитель (deeApp) при разрешении пакета @ angular / core, почему? поскольку наш потребляющий проект зависит от версии 7 (@ angular / core @ 7.0.0) peerDependency вместо той, которая указана в нашей библиотеке (@ angular / core @ 8.0. 2). Таким образом, NPM проверит, существует ли peerDependency в deeApp, если он не существует, он установит версию пакета, указанную в peerDependency нашей библиотеки в проекте deeApp, а не в my-demo.

Открывать сторонние библиотеки в проекте плагина / библиотеки - плохая идея.

Если NPM обнаруживает, что peerDependencies присутствует в проекте-потребителе (deeApp), вы получите предупреждение о неудовлетворенной зависимости однорангового узла. Теперь вам придется исправить это вручную, или, может быть, есть команда NPM, которая уже исправляет это, о которой я знаю.

Помните, что peerDependency добавляется вручную в файл package.json. Вы можете использовать Semver, чтобы указать версии peerDependenc, которые будут соответствовать вашим потребностям, но отправной точкой будет следовать из того, что уже использует потребляющий проект, поэтому для авторов библиотеки вам нужно будет удовлетворить потребителей вашей библиотеки.

Итак, теперь мы знаем последствия peerDependencies, они смягчают или помогают обойти потенциальные проблемы, связанные с конфликтами версий из пакетов.

Когда мне следует использовать peerDependencies?

  • Когда вы создаете стороннюю библиотеку / плагин
  • Когда потребители вашей библиотеки используют зависимость, ваша библиотека также зависит от .eg (@ angular / core - наша библиотека my-demo зависит от @ angular / core, чтобы есть декораторы вроде @Component).
  • Ваша библиотека / плагин предоставляет интерфейс зависимостей, например, библиотека компонентов Angular использует декораторы @Component, @ Injectable или @Directive, эти функции являются объектами из пакета @ angular / core, поэтому наличие конфликтующих версий в библиотеке и потребляющем проекте библиотеки может вызвать некоторые ошибки времени выполнения из-за, возможно, изменений в API, подпись или реализация функций декоратора, если, например, объект / функция @Component в v8 ожидает обязательный параметр, который не требовался в v7. .

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

Взяв из блога на nodejs.org, проверьте изображение ниже

Полезные ссылки
ST, lexy-lambda, nodejs.org, some source, NPM-Semver

И вы можете восполнить этот пробел, прочитав крутой блог, посвященный всему этому здесь, кстати, спасибо чуваку Мануэлю.

Привет ✌