JavaScript

Использование tailwindcss c Vue.js

Spread the love

TailwindCSS (официальный сайт) — это настраиваемый низкоуровневый CSS-фреймворк, который предоставляет все строительные блоки, необходимые для создания верстки без использование каких-либо дополнительных стилей.

Спонсор постаБесплатный архиватор WindowsRAR
Разработка российской компании iTVA WindowsRAR (Бесплатный архиватор WindowsRAR) удобная программа для работы с архивами.
WindowsRAR представляет собой многофункциональный архиватор поддерживающий все популярные форматы архивации — RAR 7z, ZIP, gz и др., с помощью которого вы сможете создавать и разархивировать архивы, а так же проверять файлы на наличие вирусов. Посредством программы можно установливать пароль. Разработчики оснастили пятнадцать стилей оформления интерфейса

В чем идея TailwindCSS? Большинство CSS-фреймворков предоставляют слишком много функционала верхнего уровня и слишком мало функционала нижнего уровня. Они поставляются со всевозможными предварительно разработанными компонентами, такими как кнопки, карточки и оповещения, которые очень сильно помогают вначале развивать проект и быстро двигаться вперед, но вызывают большие проблемы, когда приходит время кастомизировать проект в соответствие с индивидуальным дизайном.

Вместо продуманных заранее разработанных компонентов, TailwindCSS предоставляет низкоуровневые служебные классы, которые позволяют вам создавать полностью индивидуальные проекты. Под низкоуровневыми служебными классами подразумеваются такие классы как для примера, классы определения цвета фона .bg-blue, отступов .m-10, .mx-10, .my-10 или отображения блока .block .inline-block и т.д. Такие низкоуровневые классы объединенные функционалом в терминологии Tailwind называются утилитами.

Идеология Tailwindутилиты прежде всего. Создание сложных компонентов делается из ограниченного набора примитивных утилит. Традиционно, когда вам нужно что-то стилизовать в сети, вы пишете что-то типа такого.

Пример взят из официальной документации Tailwind

<div class="chat-notification">
  <div class="chat-notification-logo-wrapper">
    <img class="chat-notification-logo" src="/img/logo.svg" alt="ChitChat Logo">
  </div>
  <div class="chat-notification-content">
    <h4 class="chat-notification-title">ChitChat</h4>
    <p class="chat-notification-message">You have a new message!</p>
  </div>
</div>

<style>
  .chat-notification {
    display: flex;
    max-width: 24rem;
    margin: 0 auto;
    padding: 1.5rem;
    border-radius: 0.5rem;
    background-color: #fff;
    box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
  }
  .chat-notification-logo-wrapper {
    flex-shrink: 0;
  }
  .chat-notification-logo {
    height: 3rem;
    width: 3rem;
  }
  .chat-notification-content {
    margin-left: 1.5rem;
    padding-top: 0.25rem;
  }
  .chat-notification-title {
    color: #1a202c;
    font-size: 1.25rem;
    line-height: 1.25;
  }
  .chat-notification-message {
    color: #718096;
    font-size: 1rem;
    line-height: 1.5;
  }
</style>

Обратите внимание что HTML страница создается через определенные CSS классы, которые далее визуализируют верстку.

С Tailwind вы сразу стилизуете элементы, применяя уже существующие классы прямо в вашем HTML.

<div class="max-w-sm mx-auto flex p-6 bg-white rounded-lg shadow-xl">
  <div class="flex-shrink-0">
    <img class="h-12 w-12" src="/img/logo.svg" alt="ChitChat Logo">
  </div>
  <div class="ml-6 pt-1">
    <h4 class="text-xl text-gray-900 leading-tight">ChitChat</h4>
    <p class="text-base text-gray-600 leading-normal">You have a new message!</p>
  </div>
</div>

В приведенном выше примере мы использовали ((https://tailwindcss.com/docs/):

  • Утилиты flexbox и padding) (.flex, .flex-shrink-0 и .p-6) для контроля общего макета карты (card)
  • Утилиты max-width и margin (.max-w-sm и .mx-auto) для ограничения ширины карты и ее центрирования по горизонтали
  • Утилиты background-color, border-radius и box-shadow (.bg-white, .roundnded-lg и .shadow-xl) для стилизации внешнего вида карты
  • Утилиты width и height (.w-12 и .h-12) для размера изображения логотипа
  • Утилиты margin и padding (.ml-6 и .pt-1) для размещения текста карты
  • Утилиты font-size, text-color и line-height (.text-xl, .text-grey-900, .leading-tight и т. д.) для стилизации текста карты

Таким образом мы реализовали полностью индивидуальный дизайн компонентов, без написания строк дополнительного пользовательского CSS.

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

Как только вы действительно что-то создадите таким образом, вы быстро заметите некоторые важные преимущества такого подхода:

  • Вы не тратите энергию и время, изобретая имена классов. Больше не нужно добавлять глупые имена классов, такие как sidebar-inner-wrapper, просто чтобы что-то стилизовать, и больше не нужно мучиться с выдумыванием идеальных абстрактных именем для чего-то, что на самом деле просто гибкий контейнер. Это так же способствует унификации при переходе от одного проекта к другому.
  • Ваш CSS файл перестает неограниченно расти. Используя традиционный подход, ваши CSS-файлы увеличиваются при каждом добавлении новой функции. С утилитами все можно использовать повторно, поэтому вам редко нужно писать новый CSS.
  • Вносить изменения становиться более безопаснее. CSS является глобальным, и вы никогда не знаете, что вы нарушаете, когда вносите изменения в существующие глобальные классы. В вашем HTML всегда можно использовать только локальные классы, поэтому их можно изменять, не беспокоясь о том, что что-то еще сломается.

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

Почему бы просто не использовать встроенные стили?

Распространенной реакцией на такой подход является вопрос: «Разве это не тоже самое как использовать встроенные стили через атрибут style?» и в некотором смысле это так — вы применяете стили непосредственно к элементам вместо того, чтобы назначать им имя класса, а затем стилизовать этот класс.

Но использование служебных классов имеет несколько важных преимуществ перед встроенными стилями:

  • Проектирование с ограничениями. Используя встроенные стили style, возможно использовать неограниченное количество значений CSS (что реально создает хаус). С помощью утилит вы выбираете стили из предопределенной системы проектирования, что значительно упрощает создание визуально согласованных интерфейсов. Так же становиться возможным глобальное переопределение значение.
  • Адаптивный дизайн. Вы не можете использовать медиа-запросы (@media) во встроенных стилях, но вы можете использовать адаптивные утилиты Tailwind для простого создания полностью адаптивных интерфейсов.
  • Псевдо-классы. Встроенные стили не могут нацеливаться на состояния, такие как наведение (:hover) или фокусировка (:focus), но варианты псевдоклассов Tailwind упрощают стилизацию этих состояний с помощью служебных классов.

Проблемы с поддержкой

Наибольшая проблема с удобством обслуживания при использовании подхода «сначала утилита» — это управление часто повторяющимися комбинациями утилит. Например при стилизации кнопки. Это легко решается путем извлечения компонентов, либо как частичные шаблоны/компоненты JavaScript, либо с помощью функции @apply Tailwind для создания абстракций вокруг общих шаблонов утилит.

<!-- Стандартное использование утилит при стилизации кнопки -->
<button class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
  Button
</button>

<!-- Использование Tailwind @apply -->
<button class="btn btn-blue">
  Button
</button>

<style>
  .btn {
    @apply font-bold py-2 px-4 rounded;
  }
  .btn-blue {
    @apply bg-blue-500 text-white;
  }
  .btn-blue:hover {
    @apply bg-blue-700;
  }
</style>

Кроме того, поддержка CSS-проекта, ориентированного на утилиту, оказывается намного проще, чем поддержка большой кодовой базы CSS, просто потому, что HTML намного проще поддерживать, чем CSS. Крупные компании, такие как GitHub, Heroku, Kickstarter, Twitch, Segment и другие, используют этот подход с большим успехом.

Далее я расскажу как внедрить tailwind в проект на Vue.js

Установка tailwind

vue create testapp

Выберем все опции по умолчанию. Далее установим в проект tailwindcss командой

npm install tailwindcss --save

Создадим новую директорию css в src/assets/ и в ней создадим новый файл tailwind.css со следующим содержанием:

@tailwind base;

@tailwind components;

@tailwind utilities;

Далее добавим этот файл в src/main.js

import Vue from 'vue'
import App from './App.vue'
import './assets/css/tailwind.css'

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')

Далее нужно создать Tailwind конфиг файл. Он нужен для настройки Tailwind, и его можно сгенерировать, используя утилиту Tailwind CLI, устанавливаемую при установке пакета tailwind через npm. Для этого в терминале нужно набрать команду:

npx tailwind init

После этого в корне проекта должен создаться файл tailwind.config.js со следующим содержимым:

module.exports = {
  theme: {
    extend: {}
  },
  variants: {},
  plugins: []
}

В этом файле можно настроить элементы используемой темы, переменные и плагины. Подробнее о использование этого файла можно почитать в официальной документации (https://tailwindcss.com/docs/configuration).

На github есть очень большой список плагинов и других полезных ресурсов для Tailwind https://github.com/aniftyco/awesome-tailwindcss

Далее добавим Tailwind в качестве плагина PostCSS в цепочку сборки. Для этого в корне проекта создадим новый файл src/postcss.config.js

module.exports = {
  plugins: [
    require('tailwindcss'),
    require('autoprefixer'),
  ]
}

Еще один очень важный момент на который нужно обратить внимание. На официальном сайте Tailwind есть сводная таблица размером различных css фреймворков (https://tailwindcss.com/docs/controlling-file-size).

FrameworkOriginal SizeMinifiedGzipBrotli
Tailwind783.5kb603.3kb78.0kb22.6kb
Bootstrap187.8kb152.1kb22.7kb16.7kb
Bulma224.2kb189.9kb24.9kb19.1kb
Foundation154.1kb119.2kb15.9kb12.9kb
Tachyons111.7kb71.8kb13.4kb7.5kb
Semantic UI809.4kb613.8kb100.6kb77.8kb
Materialize175.0kb138.5kb21.1kb17.1kb

Из нее видно, что Tailwind определенно выглядит тяжелым (хотя, если вы используете Brotli вместо gzip, это все еще очень разумно). Это обусловлено тем что по умолчанию в него входят очень большое количество классов (цветов, размеров, отступов для каждого размера и т.п.). Все это изобилие классов вряд ли будут используются в вашем текущем проекте. Поэтому есть ряд стратегий, которые вы можете использовать, чтобы значительно уменьшить размер файла Tailwind по умолчанию. Один из самый простых способов которые предлагает официальная документация это использовать Purgecss (https://www.purgecss.com/) (инструмент для удаления неиспользуемого CSS). Purgecss можно подключить как плагин PostCSS во время сборки. Для этого вначале установим Purgecss командой:

npm install @fullhuman/postcss-purgecss --save-dev

И далее внесем следующие изменения в postcss.config.js:

// postcss.config.js
const purgecss = require('@fullhuman/postcss-purgecss')({

  // Specify the paths to all of the template files in your project 
  content: [
    './src/**/*.html',
    './src/**/*.vue',
  ],

  // Include any special characters you're using in this regular expression
  defaultExtractor: content => content.match(/[\w-/:]+(?<!:)/g) || []
})

module.exports = {
  plugins: [
    require('tailwindcss'),
    require('autoprefixer'),
    ...process.env.NODE_ENV === 'production'
      ? [purgecss]
      : []
  ]
}

Обратите внимание, что в этом примере мы включаем только Purgecss в продакшине. Официальная документация рекомендуем настраивать Purgecss таким образом, чтобы во время разработки иметь каждый класс доступным, что бы вам не нужно было бы ждать перестройки каждый раз, когда вы меняете какой-то HTML.

Хочу дать еще один совет. Если вы используется в свой работе VSCode то для Tailwind, есть очень полезный плагин https://github.com/bradlc/vscode-tailwindcss Который позволяет получать подсказки по всем классам во время работы:

Так же позволяет видеть CSS свойства при наведении на имена классов:

На этом все. Настройка закончена, можно приступать к созданию проекта с Tailwind 🙂

Заключение

Существует огромное количество различных фреймворков CSS, популярных и не очень. Но нет и не может существовать универсального CSS фреймворка которых можно использовать под любую задачу. Tailwind реально может быть очень полезен как для быстрой разработки прототипа любого проекта так и в повседневной работе js программиста. Надеюсь своей статью заинтересовать вас этим фреймворком и у вас найдется немного времени обратить на него внимание.

Была ли вам полезна эта статья?
[16 / 4.8]

Spread the love
OlegA

View Comments

Recent Posts

Vue 3.4 Новая механика v-model компонента

Краткий перевод: https://vuejs.org/guide/components/v-model.html Основное использование​ v-model используется для реализации двусторонней привязки в компоненте. Начиная с Vue…

11 месяцев ago

Анонс Vue 3.4

Сегодня мы рады объявить о выпуске Vue 3.4 «🏀 Slam Dunk»! Этот выпуск включает в…

11 месяцев ago

Как принудительно пере-отобразить (re-render) компонент Vue

Vue.js — это универсальный и адаптируемый фреймворк. Благодаря своей отличительной архитектуре и системе реактивности Vue…

2 года ago

Проблемы с установкой сертификата на nginix

Недавно, у меня истек сертификат и пришлось заказывать новый и затем устанавливать на хостинг с…

2 года ago

Введение в JavaScript Temporal API

Каким бы ни было ваше мнение о JavaScript, но всем известно, что работа с датами…

2 года ago

Когда и как выбирать между медиа запросами и контейнерными запросами

Все, кто следит за последними событиями в мире адаптивного дизайна, согласятся, что введение контейнерных запросов…

2 года ago