Каков правильный способ добавления зависимости для реакции в вашем пакете .json для реагирующего компонента
Я сделал несколько простых многократно используемых компонентов реакции и хотел знать правильный способ включить зависимость, чтобы реагировать в моем пакете. json для публикации с npm.
В настоящее время я делаю это:
Предполагая, что мой компонент будет использовать самую последнюю версию реакции, и я протестировал ее, и она работает с этой версией. например 0.13.3
"peerDependencies": {
"react": "^0.13.3"
},
Ответы
Ответ 1
Для многоразовых компонентов:
- Положите зависимость
react
как в peerDependencies
, так и в devDependencies
.
- Никогда введите
react
зависимость в dependencies
.
peerDependencies
указывает, какие версии React ваш повторно используемый компонент поддерживает/требует. При использовании npm 2 это также добавляет React в список модулей, которые будут установлены, но это больше не относится к npm 3.
devDependencies
гарантирует, что React будет установлен при запуске npm install
при разработке вашего компонента или при выполнении тестов на Travis или аналогичных.
Ввод react
в dependencies
приведет к установке нескольких версий React, если кто-то использует ваш компонент, но имеет другую версию React в своем собственном package.json
- имея несколько версий React, не только раздувает сборку, но также вызывает ошибки, когда разные версии пытаются взаимодействовать.
Ответ 2
Выбранный ответ определенно является предписанным здесь, однако я начал одобрять использование инверсии управления, а не полагаться на одноранговые зависимости npm для зависимостей между моими библиотеками, и это хорошо мне помогло.
Библиотеки проще, если вы их создаете. Кажется, что проще поддерживать библиотеки, которые экспортируют одну функцию, которая принимает объект со всеми их тяжелыми зависимостями и экспортирует объект, содержащий каждый из ваших типичных экспортных библиотек.
Библиотека 'injected'
Библиотека /index.js
export default ({ React }) => {
const InjectedComponent = props => (
<p style={{color: props.color}}>This component has no React npm dependencies.</p>
)
/** other stuff */
return { InjectedComponent }
}
Потребление приложения
app.js
import React from 'react'
import { render } from 'react-dom
/** Import the default export factory from our library */
import createInjectedComponent from 'injected'
/** Call the factory, passing its dependencies (guaranteed to match what we're bundling) and get back our component */
const { InjectedComponent } = createInjectedComponent({ React })
render(<InjectedComponent color="blue" />, document.getElementById('root'))
Если ваш компонент работает только с определенной версией реакции или какой-либо другой зависимостью, вы можете написать некоторые утверждения вокруг версии для параметра React, который передается. В целом, создание библиотек таким образом должно быть менее подвержено новой сборке выпущенные в любой момент версии React, публикуются и, что еще важнее, гарантируют, что вы не будете заставлять своих пользователей библиотеки связывать несколько версий React и других тяжелых библиотек. Этот шаблон хорошо работает с ссылкой на npm (обычно у меня, как правило, 16+ библиотек, запущенных из npm-ссылки одновременно и с проблемами, когда я не использовал этот шаблон).
В вашем основном приложении я бы рекомендовал всегда разделять реакцию, реагировать на dom и любые взаимодействующие компоненты lib, которые вы используете в комплекте поставщиков (webpack), и пометить его как внешний в своем основном пакете, чтобы вы случайно не объединили две версии.
Ответ 3
У вас может быть react
в peerDependencies
или в dependencies
. Разница заключается в том, что с peerDependencies
, react
устанавливается только один раз для пакета, используя ваш пакет. Если вы поместите его в dependencies
, react
будет установлен дважды, один раз для пакета с вашим пакетом и один раз для вашего пакета.
Реакция сама по себе, по-видимому, благоприятствует peerDependencies
. Вам явно не нужны две отдельные версии react
в вашем пакете Javascript (что происходит по умолчанию, если вы используете dependencies
), но это легко исправить с помощью npm dedupe
.
Таким образом, нет правильного пути для этого, работают как peerDependencies
, так и dependencies
. Использование dependencies
в большей степени соответствует пути node/NPM, но использование peerDependencies
более дружелюбное к пользователям вашего пакета, который не знает о npm dedupe
и почему он нужен.