Допустим, у меня есть библиотека компонентов с кнопками, полями ввода и более сложными компонентами, которые я хочу распространять через npm, чтобы я мог использовать ее во множестве различных «родительских проектов», чтобы получить одинаковый внешний вид во всех моих различных приложениях.
Допустим, библиотека компонентов и все «родительские проекты» построены на React. С таким же успехом они могут быть построены в Vue или Angular или что-то еще, но давайте go с реакцией
Давайте также скажем, что я большой поклонник внешнего вида в материальном дизайне, поэтому в моя библиотека компонентов Я хочу использовать material-ui в некоторых из моих компонентов, но не во всех. Я все еще хочу обернуть компоненты material-ui, чтобы убедиться, что все мои родительские проекты используют их одинаково, и они могут быть настроены и т. Д.
Допустим также, что я хочу, чтобы пользователь мог изменить тему в некоторых родительских проектах на темный режим или, может быть, что-то, что влияет на типографику или что-то еще. Таким образом, компоненты зависят от выбранной темы для их стиля, как и родительские проекты.
Давайте также скажем, что, поскольку мне так нравится материальный дизайн, я мог бы использовать его непосредственно в родительских проектах. . Но только в некоторых проектах.
Теперь у меня вопрос, как технически организовать различные проекты.
- Можно ли полностью избавиться от зависимости material-ui в родительские проекты. То есть не требовать от родительских проектов предоставить версию и не поставлять ее с пакетом npm?
- Если это невозможно. Какие плюсы и минусы у требования peerDependency от родителя по сравнению с предоставлением одного из компонентной библиотеки?
- Как я могу обрабатывать тему и при этом хорошо инкапсулировать компоненты? Кто отвечает за настройку темы? Когда в родительском проекте будет задана стилизация темы? Следует ли отправлять выбранную тему в компонент? Должен ли я копировать стиль темы, чтобы компоненты были инкапсулированы?
TLDR; Мне нужна библиотека компонентов, которая зависит от другой библиотеки третьей части, и я хочу, чтобы мои компоненты были максимально инкапсулированы. Что может быть для этого хорошей структурой?