Утечка стиля из компонента Svelte

Вопрос:

Я хотел бы использовать плагин (daisyUI) для TailwindCSS в одном из моих компонентов Svelte. Похоже, что информация о стилях просачивается из этого компонента и влияет на весь сайт. Как я могу этого избежать?

Я не думаю, что это связано конкретно с daisyUI. Ниже я описываю минимальный воспроизводимый пример на основе sveltekit. Но проблема не связана со свелтекитом. Я сталкиваюсь с этим при разработке веб-расширения, которое не использует sveltekit. Настройка sveltekit предназначена только для минимально возможной демонстрации этого вопроса.

Чтобы проиллюстрировать проблему, я создал скелетный проект sveltekit, а затем добавил один дополнительный компонент svelte, использующий Tailwind. Когда я добавляю плагин, цвет фона моей страницы меняется с белого на серый. Я не понимаю, как это может произойти, насколько я вижу, я использую Tailwind только внутри этого компонента. Но стиль, кажется, протекает.

Минимальный пример на github:

Самый быстрый способ размножения:

git clone [email protected]:lhk/minimum_example.git
cd minimum_example
npm install
npm run dev -- -- open

Теперь вы можете редактировать tailwind.config.cjs и добавлять/удалять плагин:

plugins: [
  //require("daisyui")
],

Пошаговое объяснение

Я хотел бы использовать Svelte вместе с Tailwind и DaisyUI.

Вот минимальная настройка проекта

# choose the skeleton project, typescript syntax and no to everything else
npm create svelte@latest minimum_example

cd minimum_example
npm install
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init tailwind.config.cjs -p
npm i --save-dev daisyui

Теперь отредактируйте tailwind.config.cjs:

/** @type {import('tailwindcss').Config} */
module.exports = {
  content: ['./src/**/*.{html,js,svelte,ts}'], theme: {
    extend: {},
  },
  plugins: [
    //require("daisyui")
  ],
}

Добавьте новый компонент Svelte под src/components/Problem.svelte:

<p class = "bg-blue-700">Using Tailwind class</p>

<style lang = "postcss">
    @tailwind base;
    @tailwind components;
    @tailwind utilities;
</style>

И включите его в src/routes/+page.svelte:

<script lang = "ts">
    import Problem from "./../components/Problem.svelte";
</script>

<h1>Welcome to SvelteKit</h1>
<p>Visit <a href = "https://kit.svelte.dev">kit.svelte.dev</a> to read the documentation</p>

<Problem></Problem>

Вы можете запустить проект с помощью

npm run dev -- -- open

Если вы откроете веб-сайт, вы увидите приложение-скелет sveltekit, а также один абзац с синим фоном (это мой тест, что Tailwind работает). Теперь вы можете раскомментировать плагин в tailwind.config.cjs. Фон страницы станет серым. Я думаю, что это тема, которая каким-то образом просачивается из плагина Tailwind на весь сайт.

🤔 А знаете ли вы, что...
С Svelte легко интегрировать с серверными API и базами данных.


1
101
1

Ответ:

Решено

То, как вы используете попутный ветер со svelte, совершенно неправильно. Ответ tldr — удалить директивы @tailwind и использовать вместо них @apply.

<p class = "my-element">Using Tailwind class</p>

<style lang = "postcss">
    .my-element {
      @apply bg-blue-700;
    }
</style>

Способ, которым стили svelte scopes, заключается в использовании уникального имени класса вместе с вашим настраиваемым селектором, например. .my-element становится .my-element.svelte-x57u2q. Это также означает, что вы должны использовать селектор, чтобы этот механизм области действия мог сработать.

Но с ванильным попутным ветром эти встроенные имена классов должны быть глобальными, чтобы быть полезными, другими словами, «просочившимися». Это дизайн, а не ошибка.

Поэтому, если вы хотите использовать попутный ветер, но также использовать стиль svelte с прицелом, @apply — единственное решение.

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