Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+661новая вакансия за сутки·58 731вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 712
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 393 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python11 079
  • Облачные технологии8 824
  • QA вакансии2 977
  • Android1 395
  • Инженер данных1 032
  • Продакт-менеджер351

Разработка

  • Backend вакансии1 342
  • iOS1 307
  • AI вакансии660
  • Fullstack вакансии524
  • Frontend вакансии465
  • Mobile вакансии28

По стеку

  • Go6 622
  • Java3 670
  • Kotlin1 199
  • Node.js1 190
  • Rust1 181
  • .NET780
  • PHP329
  • C++301
  • C#211

DevOps и инфраструктура

  • Kubernetes5 251
  • Linux-инфраструктура4 138
  • DevOps вакансии3 024
  • Terraform / IaC2 834
  • Мониторинг и Observability1 406
  • CI/CD917
  • SRE389
  • Кибербезопасность40

Аналитика и данные

  • Аналитик данных586
  • Бизнес-аналитик487
  • Data Scientist458
  • Системный аналитик75

Другие направления

  • Проджект-менеджер114
  • UI/UX дизайн74
  • Ручное тестирование14

По регионам

  • Вакансии в США31 201
  • Вакансии в Европе11 507
  • Работа в России3 630
  • Вакансии в Канаде2 546

По формату

  • Удалённые вакансии47 761
  • Релокация в США31 201
  • Гибридная работа7 699
  • Офисная работа6 071

По уровню

  • Senior вакансии27 027
  • Middle вакансии12 284
  • Junior вакансии4 495

Сейчас нанимают

Все компании
  • Wise196 вакансий
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify38 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме Tailwind CSSВсе вопросы
Tailwind CSSMiddleКодинг

Как использовать Tailwind CSS с компонентным фреймворком, например React или Vue?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Tailwind отлично работает с React/Vue: классы добавляются через className/class атрибуты. Для переиспользования стилей используйте компоненты фреймворка, @apply в CSS, или утилиту clsx/cva для условных классов.

Установка в Vite-проект (React)

// 1. Установка (через контейнер или проектный пакетный менеджер)
// npm install -D tailwindcss @tailwindcss/vite

// vite.config.ts
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import tailwindcss from '@tailwindcss/vite'; // v4

export default defineConfig({
  plugins: [react(), tailwindcss()],
});
/* src/index.css */
@import "tailwindcss";

Tailwind CSS с React и Vue

Tailwind идеально сочетается с компонентными фреймворками: стили инкапсулируются в компонентах вместо CSS-файлов, а JIT-режим отслеживает классы в JSX/Vue-шаблонах.

Базовое использование в React

// Button.tsx
interface ButtonProps {
  variant?: 'primary' | 'secondary';
  children: React.ReactNode;
  onClick?: () => void;
  disabled?: boolean;
}

export function Button({ variant = 'primary', children, onClick, disabled }: ButtonProps) {
  return (
    <button
      onClick={onClick}
      disabled={disabled}
      className={`
        px-4 py-2 rounded-lg font-semibold transition-colors
        focus:outline-none focus:ring-2 focus:ring-offset-2
        disabled:opacity-50 disabled:cursor-not-allowed
        ${variant === 'primary'
          ? 'bg-blue-600 hover:bg-blue-700 text-white focus:ring-blue-500'
          : 'bg-gray-100 hover:bg-gray-200 text-gray-900 focus:ring-gray-400'
        }
      `}
    >
      {children}
    </button>
  );
}

clsx + tailwind-merge для условных классов

// npm install clsx tailwind-merge
import { clsx } from 'clsx';
import { twMerge } from 'tailwind-merge';

// Вспомогательная функция (cn)
function cn(...inputs: (string | undefined | null | false)[]) {
  return twMerge(clsx(inputs));
}

// Использование
function Card({ className, highlighted }: { className?: string; highlighted?: boolean }) {
  return (
    <div
      className={cn(
        'rounded-xl border bg-white p-6 shadow-sm',
        highlighted && 'border-blue-500 shadow-blue-100',
        className // позволяет переопределить снаружи
      )}
    />
  );
}

cva (Class Variance Authority) для вариантов компонентов

// npm install class-variance-authority
import { cva, type VariantProps } from 'class-variance-authority';

const button = cva(
  // Базовые классы
  'inline-flex items-center justify-center rounded-lg font-semibold transition-colors focus:outline-none',
  {
    variants: {
      variant: {
        primary: 'bg-blue-600 text-white hover:bg-blue-700',
        secondary: 'bg-gray-100 text-gray-900 hover:bg-gray-200',
        danger: 'bg-red-600 text-white hover:bg-red-700',
      },
      size: {
        sm: 'h-8 px-3 text-sm',
        md: 'h-10 px-4',
        lg: 'h-12 px-6 text-lg',
      },
    },
    defaultVariants: {
      variant: 'primary',
      size: 'md',
    },
  }
);

type ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement>
  & VariantProps<typeof button>;

export function Button({ variant, size, className, ...props }: ButtonProps) {
  return <button className={button({ variant, size, className })} {...props} />;
}

// Использование
<Button variant="danger" size="lg">Удалить</Button>

Vue 3 SFC

// Card.vue
<template>
  <div
    :class="[
      'rounded-xl border p-6 transition-shadow',
      highlighted ? 'border-blue-500 shadow-lg' : 'border-gray-200 shadow-sm'
    ]"
  >
    <slot />
  </div>
</template>

<script setup lang="ts">
defineProps<{ highlighted?: boolean }>();
</script>

@apply для переиспользуемых паттернов

/* styles/components.css */
@layer components {
  .btn-primary {
    @apply px-4 py-2 bg-blue-600 text-white rounded-lg
           hover:bg-blue-700 transition-colors
           focus:outline-none focus:ring-2 focus:ring-blue-500;
  }
}

Подводные камни

  • Динамически составленные имена классов через интерполяцию строк (`bg-${color}-500`) не попадают в JIT-сборку — всегда используйте полные имена классов.
  • Без tailwind-merge переопределение классов работает непредсказуемо: p-4 p-2 — выиграет тот, кто стоит позже в CSS, а не в строке className.
  • Vue: динамические классы через :class работают, но Tailwind IntelliSense не подсвечивает их — убедитесь, что полные имена присутствуют в коде.
  • Длинные строки className в JSX ухудшают читаемость — используйте prettier-plugin-tailwindcss для автоматической сортировки классов.
  • При использовании CSS Modules вместе с Tailwind возникает конфликт скоупов — решайте через явный импорт в @layer.
  • Server Components в Next.js не поддерживают контекст и хуки — не передавайте className через контекст для серверных компонентов.
  • Избыток @apply воспроизводит проблемы обычного CSS (специфичность, порядок) — применяйте только для действительно часто используемых паттернов.

Частые вопросы на собеседовании

  • Что такое Tailwind CSS и что означает подход «utility-first»?
  • Каковы лучшие практики организации Tailwind-классов в больших кодовых базах?
  • Как работает адаптивный дизайн в Tailwind? Объясните префиксы breakpoints (sm, md, lg, xl, 2xl).
  • Что такое массив content в конфигурации Tailwind и почему он важен?

Типичные ошибки

  • Смешивать «Tailwind с React или Vue» с похожим механизмом без критерия выбора.
  • Игнорировать риск: неверно оценить границы применения темы «Tailwind с React или Vue» и получить хрупкое решение.
  • Показывать только синтаксис и не объяснять поведение в runtime или сборке.

Что проверяет интервьюер

  • Объясняет композиция utilities с компонентами и пропсами без динамических class fragments.
  • Показывает на примере, как работает: в компонентных фреймворках нужно маппить props на полные строки классов, чтобы Tailwind смог обнаружить все варианты на build time.
  • Называет production-нюанс и граничный случай для темы «Tailwind с React или Vue».

Как вы знаете этот вопрос?

Проверить себя по теме Tailwind CSS →

Источники

  • https://tailwindcss.com/docs/detecting-classes-in-source-files
  • https://tailwindcss.com/docs/styling-with-utility-classes
←Предыдущий вопросЧто такое плагин `@tailwindcss/typography` и когда его следует использовать?Следующий вопрос→Что такое директива `@layer` в Tailwind (base, components, utilities)?

Связанные темы

Tailwind CSScomponent-designfrontend-engineering