#reactjs #webpack #package.json #storybook
#reactjs #webpack #package.json #сборник рассказов
Вопрос:
Я создаю свою собственную библиотеку компонентов React. Используется package.json
react
и react-dom
как одноранговые зависимости, потому что я хочу отправлять код только для компонентов. Затем этот пакет будет использоваться в других проектах на основе React, поэтому я сам предоставлю React в этих проектах.
Я решил добавить StorybookJS в пакет по двум причинам
- Помощь во время разработки для предварительного просмотра моих компонентов
- Создайте статический сайт сборника рассказов, который я буду размещать где-нибудь, демонстрируя компоненты
Структура моего проекта:
package.json
src/
components/ // contains components
storybook/ // <-- not part of the package
index.ts // <-- this is entry point of the package
Однако это создает проблему. Поскольку StorybookJS требует react
и react-dom
для запуска, мне пришлось бы включить их в качестве зависимостей библиотеки.
Я буду использовать webpack
для фактического объединения только кода компонента, чтобы его можно было распространять. Должен ли я просто использовать externals
свойство в конфигурации для исключения react
и react-dom
из пакета? Я думаю, это сработало бы, но тогда package.json
все равно будет отображаться React как его зависимости (чего я не хочу).
Каков правильный подход здесь?
Комментарии:
1. Столкнувшись с тем же — вы когда-нибудь получали ответ?
2. Как вы можете видеть, ответа нет, но я скоро предоставлю его здесь @PatrickDench
Ответ №1:
В итоге я поставил react
«и react-dom
peerDependencies
«, поскольку, на мой взгляд, это правильный подход. Поскольку этот файл пакета принадлежит самой библиотеке (а не сборнику рассказов), в нем должны быть правильно указаны его зависимости.
Чтобы избежать объединения React в мой пакет библиотеки, я поместил его в externals
конфигурацию webpack следующим образом:
externals: {
react: 'react',
'react-dom': 'react-dom',
},
Таким образом, React или ReactDOM не попадают в комплект. Библиотека является библиотекой компонентов React, поэтому ее в любом случае нельзя использовать без React, и вы должны ее предоставить.
Последний шаг, чтобы заставить Storybook работать, я добавил prepare
скрипт, который устанавливает одноранговые зависимости при установке пакета. Таким образом, React и ReactDOM предоставляются для приложения Storybook.
Это сценарий подготовки в моем package.json
:
"scripts": {
"prepare": "install-peers amp;amp; npm run build"
}
Я использовал install-peers
package для установки React и ReactDOM. Для более новой версии NPM-клиента этот пакет вам не понадобится, и при запуске npm install
также должны быть установлены одноранговые зависимости.
Комментарии:
1. Да, это в основном то, что мы в конечном итоге сделали. Мы начали с lerna для установки всех dep. Но с storybook и некоторыми другими dep мы работаем над переходом на npm @ 7. Который открыл целую другую банку червей.