Классы Tailwind из моей библиотеки на NPM не принимаются

Я создал простую библиотеку компонентов для React и Tailwind, которую публикую в NPM.

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

Когда я импортирую компонент, он правильно отображается на странице, но классы не подхватываются компилятором Tailwind, поэтому компонент не имеет стиля.

Я могу заставить его работать, добавив путь к библиотеке в моей конфигурации попутного ветра:

  content: [
    "./src/pages/**/*.{js,ts,jsx,tsx,mdx}",
    "./src/components/**/*.{js,ts,jsx,tsx,mdx}",
    "./src/app/**/*.{js,ts,jsx,tsx,mdx}",
    "node_modules/my-library/*.{js,ts,jsx,tsx,mdx}", // Added this
  ],

Однако мне не нравится, что разработчикам приходится это делать. Есть ли лучшее решение?

Настройка шаблона Metronic с помощью Webpack и Gulp
Настройка шаблона Metronic с помощью Webpack и Gulp
Я пишу эту статью, чтобы поделиться тем, как настроить макет Metronic с помощью Sass, поскольку Metronic предоставляет так много документации, и они...
1
0
125
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Лучшее решение — использовать директиву @apply в стилях вашего компонента для применения классов Tailwind из вашего проекта.

Если в вашем проекте есть пользовательская цветовая схема, определенная в вашей конфигурации Tailwind, вы можете использовать директиву @apply, чтобы применить эти цвета к стилям вашего компонента, например:

.btn {
  @apply bg-purple-500 text-white;
}

Это гарантирует, что компонент будет использовать пользовательские цвета из вашего проекта вместо цветов Tailwind по умолчанию.

другой вариант — использовать директиву Tailwind @layer в CSS-файле вашего компонента. Это позволит вам переопределить любые классы Tailwind, импортированные из библиотеки, используя пользовательские цвета вашего проекта или другие настройки.

Если в вашей библиотеке есть компонент под названием «MyButton», который использует класс Tailwind bg-blue-500, вы можете переопределить его в CSS-файле вашего проекта следующим образом:

@layer components {
  .bg-blue-500 {
    background-color: red; // Use your project's custom color instead of Tailwind's default blue.
  }
}

этот компонент будет использовать собственные цвета вашего проекта вместо цветов Tailwind по умолчанию. но это будет работать только с классами, импортированными из библиотеки. Если вы используете в своих компонентах собственные классы или встроенные стили, директива @layer не повлияет на них.

Использование @apply, похоже, не имеет никакой разницы по сравнению с обычным использованием имен классов.

Evanss 09.10.2023 16:49
Ответ принят как подходящий

Новый ответ

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

Если существует несколько таких модулей, из которых вы хотите извлечь стили, вы можете написать функцию, которая добавляет путь за вас. Это в некоторой степени улучшит DX.

function getPathToModule(moduleName) {
    return `node_modules/${moduleName}/*.{js,ts,jsx,tsx,mdx}`
}

Старый ответ

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

// App.tsx
...
import 'my-library/styles.css'
...

Если вы хотите, чтобы стили библиотеки были изолированы от стилей по умолчанию, простым решением было бы изменить все классы в библиотеке с помощью некоторого префикса. Tailwind предоставляет эту конфигурацию префикса , которую вы можете использовать для этой цели. Эта конфигурация префикса будет в конфигурации вашей библиотеки, а не в фактической конфигурации приложения. Это просто изменит классы вашей внутренней библиотеки, а классы в вашем приложении не будут затронуты. Никакой сложной конфигурации для переопределения классов здесь не требуется, поскольку имена классов разные (с префиксом). Поэтому конфликтов не будет.

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

Evanss 09.10.2023 16:42

Ага, понятно. Позвольте мне повторить, чтобы убедиться, что я правильно понял вопрос. Вы используете классы попутного ветра в своей библиотеке, и если они переопределены в проекте. Например, если стиль p-6 изменен на что-то другое, то следует использовать этот новый стиль. Это правильно?

Arpan Saha 10.10.2023 17:14

Да, это правильно.

Evanss 10.10.2023 18:13

Создает ли ваш сборщик библиотеки связанный CSS?

Arpan Saha 12.10.2023 08:28

Сейчас нет.

Evanss 12.10.2023 12:05

При импорте библиотеки вам также необходимо импортировать файл CSS, который создается Tailwindcss при сборке проекта, и который вы можете увидеть в папке build или dist.

import { MyLibrary } from 'my-library

import 'my-library/dist/style.css'

Чтобы сделать файл CSS импортируемым, в package.json добавьте экспорт файла CSS.

"exports": {    
  ".": {
    "import": "./dist/my-library.es.js"
   },
  "./dist/style.css": {   <--- add this
    "import": "./dist/style.css"
   }
},

Вы можете увидеть пример из этой библиотеки npm репозиторий github

Основная проблема в том, почему нам нужно импортировать файл style.css из нашего пакета. почему без style.css попутный ветер не работает

Kannu Mandora 09.10.2023 12:43

Вы уверены, что это правильный подход? Как я сказал в своем исходном вопросе, если проект, который импортирует библиотеку, переопределяет значение цвета, тогда мне нужно, чтобы библиотека использовала переопределенное значение цвета. Разве импорт файла CSS таким способом не приведет к этому?

Evanss 09.10.2023 16:38

@KannuMandora Я столкнулся с той же проблемой в своей библиотеке, только нашел это решение работающим.

Usama 10.10.2023 15:42

Другие вопросы по теме