Vite поддерживает импорт CSS-файлов непосредственно из JavaScript и
TypeScript-модулей. Такой подход является стандартным механизмом работы
со стилями в современной frontend-разработке. Вместо подключения
<link> в HTML стили импортируются в точке входа
приложения или внутри отдельных компонентов.
Простейший пример:
import './style.css'
После запуска dev-сервера Vite автоматически:
Типичная структура:
project/
├── index.html
├── src/
│ ├── main.js
│ ├── style.css
│ └── components/
└── vite.config.js
Файл main.js:
import './style.css'
console.log('Vite app')
Файл style.css:
body {
margin: 0;
font-family: Arial, sans-serif;
}
При импорте CSS Vite рассматривает файл как модуль зависимостей.
Процесс выглядит следующим образом:
<style>.Во время разработки стили подключаются динамически, а в production-сборке Vite формирует оптимизированные CSS-бандлы.
Можно импортировать любое количество файлов:
import './reset.css'
import './variables.css'
import './layout.css'
import './theme.css'
Порядок импортов имеет значение.
Если два файла содержат одинаковые правила:
.button {
color: red;
}
и
.button {
color: blue;
}
то применится стиль из файла, импортированного позже.
Один из основных подходов — импортировать стили рядом с компонентом.
Структура:
src/
├── components/
│ ├── Button.js
│ └── Button.css
Button.js:
import './Button.css'
export function Button() {
const button = document.createElement('button')
button.className = 'button'
button.textContent = 'Click'
return button
}
Button.css:
.button {
padding: 12px 18px;
border-radius: 8px;
background: royalblue;
color: white;
}
Такой подход:
Vite одинаково работает с JavaScript и TypeScript.
Пример:
import './style.css'
const app: HTMLElement | null = document.querySelector('#app')
if (app) {
app.innerHTML = '<h1>Hello Vite</h1>'
}
Дополнительная настройка для обычного CSS не требуется.
Одно из ключевых преимуществ Vite — мгновенное обновление стилей.
При изменении CSS:
Например:
.card {
background: white;
}
После изменения:
.card {
background: black;
}
обновление происходит практически мгновенно.
Часто создаётся единый глобальный файл:
src/styles/global.css
Подключение:
import './styles/global.css'
Обычно туда помещают:
Пример:
:root {
--color-primary: #2563eb;
--container-width: 1200px;
}
body {
margin: 0;
background: #f5f5f5;
}
Vite умеет импортировать стили из node_modules.
Пример:
import 'swiper/css'
или:
import 'bootstrap/dist/css/bootstrap.min.css'
Vite автоматически найдёт пакет и подключит стили.
Некоторые библиотеки требуют обязательного подключения CSS.
Пример со Swiper:
import Swiper from 'swiper'
import 'swiper/css'
Без CSS библиотека может работать некорректно:
Обычный CSS, импортированный в JavaScript, остаётся глобальным.
Пример:
h1 {
color: red;
}
Такой стиль повлияет на все <h1> в приложении.
Это важно учитывать при построении архитектуры проекта.
При большом количестве импортов возможны конфликты:
.container {
width: 100%;
}
и:
.container {
max-width: 1200px;
}
Для уменьшения конфликтов применяют:
Vite поддерживает CSS Modules из коробки.
Файл:
Button.module.css
Импорт:
import styles from './Button.module.css'
Использование:
button.className = styles.button
CSS:
.button {
background: crimson;
}
Vite генерирует уникальные имена классов:
.button_a1b2c3
Это предотвращает пересечения стилей.
import './style.css'
import styles from './style.module.css'
При динамическом импорте JavaScript Vite автоматически подгружает связанные CSS-файлы.
Пример:
const module = await import('./dashboard.js')
Если dashboard.js содержит:
import './dashboard.css'
то Vite загрузит CSS только при необходимости.
Это особенно полезно для:
Во время production-сборки Vite умеет разбивать CSS на чанки.
Например:
Home.js
Dashboard.js
Profile.js
Каждый модуль может иметь собственный CSS.
Vite создаст:
home.css
dashboard.css
profile.css
Это уменьшает объём первоначальной загрузки.
Во время vite build:
npm run build
Vite:
Результат:
dist/assets/index-xxxxx.css
Vite автоматически поддерживает PostCSS.
Можно установить плагины:
npm install postcss autoprefixer -D
Файл postcss.config.js:
export default {
plugins: {
autoprefixer: {}
}
}
После этого любой импортируемый CSS будет проходить через PostCSS.
Vite поддерживает Sass.
Установка:
npm install sass -D
Импорт:
import './style.scss'
Файл:
$primary: royalblue;
body {
background: $primary;
}
Поддержка Less:
npm install less -D
Импорт:
import './theme.less'
Поддержка Stylus:
npm install stylus -D
Импорт:
import './style.styl'
Vite автоматически обрабатывает ресурсы внутри CSS.
Пример:
.logo {
background-image: url('./images/logo.png');
}
Vite:
Если настроен alias:
resolve: {
alias: {
'@': '/src'
}
}
можно писать:
import '@/styles/global.css'
Это особенно удобно в крупных проектах.
В Vue-компонентах Vite автоматически поддерживает стили:
<script setup>
import './button.css'
</script>
или:
<style>
.button {
color: red;
}
</style>
React-проекты на Vite используют тот же механизм.
import './App.css'
export default function App() {
return <h1>Hello</h1>
}
CSS не tree-shake’ится так же эффективно, как JavaScript.
Если импортирован файл:
import './huge-library.css'
то весь CSS обычно попадёт в сборку.
Для уменьшения размера применяются:
CSS считается side effect.
Импорт:
import './style.css'
не экспортирует значения, а изменяет состояние страницы.
Поэтому bundler не удаляет такие импорты как неиспользуемые.
Порядок импортов влияет на итоговый результат.
Пример:
import './base.css'
import './theme.css'
import './overrides.css'
Последний импорт имеет наибольший приоритет при одинаковой специфичности.
Нежелательно создавать циклические зависимости:
A.js -> styleA.css
B.js -> styleB.css
A.js -> B.js
В сложных проектах это может вызывать:
Статический импорт:
import './theme-dark.css'
выполняется всегда.
Для условной загрузки используется динамический импорт:
if (darkMode) {
await import('./theme-dark.css')
}
Это позволяет загружать темы по требованию.
Часто CSS импортируется ради централизованных переменных.
:root {
--color-primary: #2563eb;
}
После импорта:
import './variables.css'
переменные становятся доступны глобально.
Tailwind обычно подключается через CSS-файл:
@tailwind base;
@tailwind components;
@tailwind utilities;
Импорт:
import './style.css'
Vite обрабатывает Tailwind через PostCSS pipeline.
import './styles.css'
Ошибка:
Failed to resolve import
Причины:
import './style.scss'
Ошибка:
Preprocessor dependency "sass" not found
Не установлен пакет sass.
Неверно:
import './Button.module.css'
Правильно:
import styles from './Button.module.css'
Популярная структура:
src/
├── styles/
│ ├── base/
│ ├── components/
│ ├── layouts/
│ ├── themes/
│ ├── utilities/
│ └── global.css
Часто применяется такой порядок:
import './reset.css'
import './variables.css'
import './base.css'
import './utilities.css'
import './components.css'
Это делает каскад более предсказуемым.
Vite ускоряет работу со стилями благодаря:
Особенно заметна разница в крупных проектах с большим количеством компонентов и CSS-файлов.