Введение
Сколько времени вы готовы потратить на настройку инструментов, прежде чем написать первую строку кода? Час? День? Если надоело ждать и настраивать Webpack — этот гайд для вас. Мы разберём Vite, который позволит забыть о танцах с бубном и сразу приступить к разработке на React.
Знакомьтесь, Vite — инструмент, который переворачивает этот процесс с ног на голову. Разработанный Эваном Ю (автором Vue.js), он не собирает ваш проект целиком перед запуском, а использует нативные ES-модули браузера. Результат: сервер разработки стартует за миллисекунды, а изменения в коде отображаются мгновенно.
React отлично вписывается в эту философию. Его компонентный подход и Vite с его скоростью — идеальная пара для создания современных одностраничных приложений (SPA).
В этом гайде вы не просто установите Vite. Вы на практике разберётесь с его структурой, научитесь подключать ресурсы без головной боли и поймёте, как работает та самая "горячая" перезагрузка (HMR), которая ускоряет разработку в разы.
Что такое Vite
Vite (французское слово "быстрый") — это инструмент для сборки фронтенд-проектов, который за последние пару лет буквально ворвался в мир JavaScript. Его создал Эван Ю, тот самый разработчик, который подарил нам Vue.js. Но Vite — не просто "ещё один сборщик". Это принципиально иной подход к разработке, который исправляет главную боль традиционных инструментов: скорость.
Вместо того чтобы каждый раз пересобирать весь проект при изменении файла (как делает Webpack), Vite использует нативные ES-модули браузера. Сервер запускается мгновенно, потому что ему нечего собирать. Браузер сам запрашивает те файлы, которые нужны прямо сейчас.
Чем Vite отличается от Webpack
Давайте посмотрим на разницу в подходе на простом примере:
| Webpack (традиционный подход) | Vite (современный подход) |
|---|---|
| Перед запуском собирает весь проект в один бандл. Чем больше проект, тем дольше старт. | Вообще ничего не собирает. Просто запускает сервер и отдаёт файлы по запросу браузера. |
| При изменении кода пересобирает кусок бандла. На больших проектах это занимает секунды. | При изменении кода отправляет браузеру только этот конкретный файл. Обновление мгновенное. |
| Требует сложной настройки лоадеров для JSX, TypeScript, CSS. | Понимает JSX, TypeScript и современный CSS "из коробки". Нужно меньше конфигов. |
Три причины попробовать Vite в React-проекте
- Мгновенный старт. Вы вводите
npm run dev, и сервер поднимается быстрее, чем вы успеваете моргнуть. Не нужно ждать 10–20 секунд, пока Webpack соберёт проект. - Молниеносный HMR. Hot Module Replacement (горячая замена модулей) работает настолько быстро, что изменения в коде отражаются в браузере практически мгновенно. Состояние компонента сохраняется — не нужно после каждого клика по кнопке заново проходить весь пользовательский путь.
- Продакшен-сборка без сюрпризов. Под капотом Vite использует Rollup — проверенный инструмент для сборки. Вы получаете оптимизированный бандл с автоматическим разделением кода, но с гораздо более простой настройкой, чем в Webpack.
Настройка среды
Прежде чем мы начнём колдовать, убедимся, что у вас есть всё необходимое. Если вы уже работали с любым современным JavaScript-проектом, скорее всего, всё уже готово. Но давайте проверим.
Установка Node.js и npm
Vite — это инструмент, который работает поверх Node.js. Поэтому первым делом ставим его.
- Зайдите на официальный сайт Node.js.
- Скачайте версию LTS (Long Term Support) — она самая стабильная.
- Установите, как обычную программу, нажимая «Далее».
После установки откройте терминал (или командную строку) и выполните две команды-проверки:
node -v
npm -vЕсли вы видите версии (например, v24.13.1 и 11.8.0) — всё в порядке, едем дальше.
Создание нового проекта
Теперь самое интересное. Vite умеет создавать заготовку проекта одной командой. Она называется create vite.
В терминале выполните:
npm create vite@latest my-react-app --template reactРазберём, что здесь происходит:
npm create— это специальная команда, которая запускает установщики пакетов. Vite предоставляет такой установщик.vite@latest— мы явно говорим: возьми самую свежую версию Vite.my-react-app— имя вашего проекта. Можете заменить на любое другое.--template react— это флаг, который говорит Vite: «Сделай заготовку именно для React, с правильными настройками и зависимостями».
После выполнения команды вы увидите папку my-react-app. Зайдите в неё и установите зависимости:
cd my-react-app
npm installnpm install читает файл package.json и скачивает все библиотеки, необходимые для работы React и Vite (они попадут в папку node_modules).
Запуск сервера разработки
Всё готово. Осталось только увидеть результат. В папке проекта выполните:
npm run devВы увидите что-то вроде:
VITE v7.3.1 ready in 200 ms
➜ Local: http://localhost:5173/
➜ Network: use --host to expose
➜ press h + enter to show helpОткройте браузер и перейдите по адресу http://localhost:5173/. Поздравляю, ваше первое приложение на Vite + React запущено!
Понимание структуры проекта
После установки откройте папку my-react-app в любом редакторе кода (я рекомендую VS Code). Вы увидите примерно такой набор файлов:
my-react-app/
├── node_modules/ # Все установленные библиотеки (трогать не нужно)
├── public/ # Статические файлы (картинки, favicon)
├── src/ # Исходный код вашего приложения
├── .gitignore
├── eslint.config.js # Правила проверки кода
├── index.html # Главный HTML-файл (точка входа)
├── package-lock.json
├── package.json # Список зависимостей и скриптов
├── README.md
├── vite.config.js # Настройки Vite (если понадобятся)Вам не нужно запоминать всё. Достаточно понять три ключевых файла, с которыми вы будете работать постоянно.
Три файла, которые делают всю работу
Давайте проследим путь от браузера до вашего кода. Это поможет понять, как вообще React-приложение "включается".
1. index.html — точка входа
Откройте файл index.html в корне проекта. Внутри вы найдёте обычную HTML-разметку с одним важным элементом:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>my-react-app</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>Это единственная HTML-страница вашего приложения (поэтому такие приложения и называют одностраничными — Single Page Application). В ней есть пустой контейнер <div id="root"> и тег <script>, который подключает наш JavaScript-код.
2. src/main.jsx — точка входа в JavaScript
Этот файл — связующее звено между HTML и React. Посмотрите на него:
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import './index.css'
import App from './App.jsx'
createRoot(document.getElementById('root')).render(
<StrictMode>
<App />
</StrictMode>,
)Что здесь происходит:
- Мы импортируем React и ReactDOM.
- Находим в HTML тот самый
<div id="root">. - Говорим React: «Возьми компонент
Appи отрисуй его внутри этогоdiv'а».
3. src/App.jsx — сердце вашего приложения
Это корневой компонент. Именно здесь начинается ваш код. Откройте его:
import { useState } from 'react'
import reactLogo from './assets/react.svg'
import viteLogo from '/vite.svg'
import './App.css'
function App() {
const [count, setCount] = useState(0)
return (
<>
<div>
<a href="https://vite.dev" target="_blank">
<img src={viteLogo} className="logo" alt="Vite logo" />
</a>
<a href="https://react.dev" target="_blank">
<img src={reactLogo} className="logo react" alt="React logo" />
</a>
</div>
<h1>Vite + React</h1>
<div className="card">
<button onClick={() => setCount((count) => count + 1)}>
count is {count}
</button>
<p>
Edit <code>src/App.jsx</code> and save to test HMR
</p>
</div>
<p className="read-the-docs">
Click on the Vite and React logos to learn more
</p>
</>
)
}
export default AppВсё, что вы вернёте из этой функции, появится на экране. Это и есть сердце вашего React-приложения на Vite. Все изменения, которые вносятся сюда, благодаря HMR мгновенно отображаются в браузере. Так работает магия Vite в React.
Простая аналогия
Представьте, что вы строите дом:
index.html— это земельный участок с чёткими границами.<div id="root">— это фундамент, на котором будет стоять дом.main.jsx— это строительная бригада, которая берет готовые модули и ставит их на фундамент.App.jsx— это сам дом, который вы будете достраивать и перестраивать.
Модификация App.jsx: создаём первый компонент
Теперь, когда мы знаем, что отвечает за что, давайте оживим страницу. Замените содержимое App.jsx на:
import React from 'react'
function App() {
const items = ['React', 'Vite', 'HMR']
return (
<div>
<h1>Мой первый список на Vite + React</h1>
<ul>
{items.map((item, index) => (
<li key={index}>{item}</li>
))}
</ul>
</div>
)
}
export default AppСохраните файл. Откройте браузер. Если сервер разработки все ещё запущен (а он должен быть запущен), вы увидите, как страница мгновенно обновилась. Это и есть та самая магия HMR, о которой мы говорили.
Работа с ресурсами и HMR в React-проекте
Теперь, когда мы разобрались со структурой, давайте поговорим о том, ради чего все это затевалось — о скорости и удобстве разработки. В Vite есть две "суперсилы", которые вы будете использовать каждый день: умная работа с ресурсами и молниеносное обновление кода (HMR).
Импорт ресурсов: картинки, стили и всё остальное
В Vite вы можете импортировать изображения, шрифты, JSON-файлы и CSS прямо в JavaScript/JSX. Это не магия, а продуманный механизм.
**Как это работает: ** Представьте, что у вас есть папка src/assets с логотипом. Чтобы использовать его в компоненте, сделайте так:
import React from 'react'
import logo from './assets/logo.png' // импортируем изображение
function App() {
return (
<div>
<img src={logo} alt="Логотип проекта" />
<h1>Привет, Vite!</h1>
</div>
)
}
export default AppЧто происходит под капотом:
Vite видит импорт картинки и автоматически обрабатывает её как ресурс.
В процессе разработки logo превращается в строку с правильным путём к файлу (например, /src/assets/logo.png).
При сборке для продакшена Vite может оптимизировать картинку: если она меньше 4 КБ, он встроит её в код в формате base64 (это уменьшает количество HTTP-запросов).
То же самое работает для CSS:
import React from 'react'
import './App.css' // просто импортируем стили
function App() {
return <div className="app-container">...</div>
}Стили применяются глобально, но если вы хотите изолировать их для конкретного компонента — можно использовать CSS-модули (но это уже тема отдельного разговора).
Как Vite обеспечивает мгновенное обновление (HMR)
А теперь самое интересное. HMR (Hot Module Replacement) — это технология, которая позволяет обновлять код в браузере без перезагрузки страницы. Vite делает это не просто быстро, а мгновенно.
В чем отличие от обычной перезагрузки:
| Без HMR | С HMR в Vite |
|---|---|
| Вы меняете цвет кнопки в CSS. | Вы меняете цвет кнопки в CSS. |
| Браузер перезагружает всю страницу. | Браузер получает только новый CSS-файл и применяет его. |
| Состояние приложения сбрасывается: нужно заново логиниться, открывать модалки, заполнять формы. | Состояние приложения сохраняется. Вы продолжаете работать с того же места. |
Проверьте сами:
- Запустите приложение (
npm run dev). - Откройте консоль разработчика в браузере (F12) и перейдите на вкладку Network (Сеть).
- В компоненте
App.jsxизмените текст заголовка и сохраните файл.
Вы увидите, что в консоли Network появился один-единственный запрос — за вашим обновлённым App.jsx. Никаких лишних загрузок, никакой потери состояния. Браузер получил только то, что реально изменилось.
Почему это так быстро?
Vite не пересобирает весь проект при каждом изменении. Он отслеживает, какой файл вы изменили, и отправляет браузеру сообщение по WebSocket: "Эй, модуль App.jsx обновился, перезапроси его". Браузер запрашивает только этот файл и заменяет его в памяти.
Работа с переменными окружения (.env)
В любом серьёзном проекте рано или поздно появляются данные, которые нельзя хранить в коде: ключи API, URL бэкенда, настройки среды. Для этого в Vite есть встроенная поддержка переменных окружения — работает просто и удобно.
Создание .env файлов
В корне проекта (рядом с index.html и package.json) создайте файл .env:
my-react-app/
├── .env # Общие переменные (подтягиваются везде)
├── .env.development # Только для режима разработки (npm run dev)
├── .env.production # Только для продакшен-сборки (npm run build)
└── ... остальные папкиКак это работает:
.env— базовые переменные, которые попадают во все окружения..env.development— переопределяют значения для режима разработки..env.production— для финальной сборки.
Какие переменные можно (и нельзя) использовать
Vite работает не так, как Create React App или Webpack. Здесь есть важное правило:
Все переменные, которые вы хотите использовать в клиентском коде, должны начинаться с VITE_.
Пример содержимого .env:
# .env
VITE_API_URL=https://api.example.com
VITE_APP_TITLE="Моё приложение на Vite"
# Эту переменную НЕЛЬЗЯ использовать в браузере
DB_PASSWORD=supersecretПеременные без префикса VITE_ доступны только в конфигурационных файлах (vite.config.js) и на сервере — в браузер они не попадают. Это сделано для безопасности, чтобы случайно не раскрыть секреты в клиентском коде.
Использование в коде
Доступ к переменным осуществляется через объект import.meta.env:
// src/App.jsx
import React from 'react'
function App() {
return (
<div>
<h1>{import.meta.env.VITE_APP_TITLE}</h1>
<p>API endpoint: {import.meta.env.VITE_API_URL}</p>
{/* Если сейчас режим разработки — покажем подсказку */}
{import.meta.env.DEV && (
<small>⚡ Режим разработки активен</small>
)}
</div>
)
}
export default AppКакие встроенные переменные есть всегда:
| Переменная | Значение |
|---|---|
import.meta.env.MODE | Режим работы: development или production |
import.meta.env.DEV | true в режиме разработки, иначе false |
import.meta.env.PROD | true в продакшене, иначе false |
import.meta.env.BASE_URL | Базовый URL из конфига (по умолчанию /) |
Типизация для TypeScript
Если вы используете TypeScript (шаблон react-ts), добавьте подсказки типов для ваших переменных. Создайте файл src/vite-env.d.ts (или дополните существующий):
/// <reference types="vite/client" />
interface ImportMetaEnv {
readonly VITE_API_URL: string
readonly VITE_APP_TITLE: string
// добавьте другие переменные
}
interface ImportMeta {
readonly env: ImportMetaEnv
}Теперь редактор будет подсказывать названия переменных и их типы.
Пример: переключение между бэкендами
Частая задача: в разработке стучаться на локальный бэкенд, а в продакшене — рабочий. Делается элементарно:
.env.development
VITE_API_URL=http://localhost:3000/api.env.production
VITE_API_URL=https://api.myapp.comВ коде:
fetch(`${import.meta.env.VITE_API_URL}/users`)
.then(res => res.json())
.then(data => console.log(data))При сборке Vite подставит нужный URL автоматически.
Безопасность: что важно знать
- Ничего не спрятать. Все переменные с префиксом
VITE_попадают в финальный бандл. Их сможет увидеть любой, кто откроет консоль разработчика в браузере. Никогда не храните так реальные секреты (пароли, токены). - Для настоящих секретов используйте переменные на стороне бэкенда или проксируйте запросы через свой сервер.
- Файлы
.envне коммитятся. Сразу добавьте.envв.gitignore, чтобы случайно не залить ключи в репозиторий. Вместо этого создайте.env.exampleс примерами переменных для других разработчиков.
# .gitignore
.env
.env.*.localРешение распространённых проблем
Даже с таким быстрым инструментом, как Vite, иногда случаются осечки. Хорошая новость: большинство проблем решаются за пару минут, если знать, куда смотреть. Вот три самые частые ситуации и способы их исправить.
Ошибка: "Failed to resolve module"
Как выглядит: Вы запускаете проект, а в терминале или браузере видите что-то вроде:
Failed to resolve import "./components/Button" from "src/App.jsx". Does the file exist?Почему возникает: Vite не может найти файл, который вы пытаетесь импортировать. Причина почти всегда в одном из трёх:
- Опечатка в имени файла (регистр букв важен!).
- Неправильный путь (например, вы импортируете из
./components, а папка называетсяcomponent). - Библиотека не установлена (забыли
npm install).
Что делать:
Проверьте путь. В примере выше ошибка говорит:
src/App.jsxпытается импортировать./components/Button. Откройте папкуsrc— есть ли там папкаcomponents? А в ней файлButton.jsx?Переустановите зависимости. Если вы только что склонировали проект или переносили его на другой компьютер, зависимости могли не установиться:
rm -rf node_modules package-lock.json
npm installОчистите кэш Vite. Иногда Vite кэширует зависимости, чтобы ускорить разработку. Если кэш "сломался", удалите его:
rm -rf node_modules/.vite
npm run dev
Ошибка: "React Refresh failed"
Как выглядит: Вы меняете код, браузер перезагружается, но в консоли появляется красная ошибка про React Refresh. Или изменения вообще не применяются.
Почему возникает: Vite использует специальный плагин для "горячей" замены React-компонентов. Если плагин настроен неправильно или версии несовместимы, HMR ломается.
Что делать:
Проверьте версию React. Fast Refresh (так это называется в React) работает только с React 17 и выше. Проверьте
package.json:"react": "^18.2.0",
"react-dom": "^18.2.0"Убедитесь, что плагин установлен. Откройте
vite.config.js. Там должно быть так:import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
// https://vite.dev/config/
export default defineConfig({
plugins: [react()],
})Если плагина нет — установите:
npm install @vitejs/plugin-react --save-devПерезапустите сервер. После любых изменений в конфиге или зависимостях всегда перезапускайте сервер разработки (Ctrl+C и снова
npm run dev).
После сборки не загружаются ресурсы
Как выглядит: Вы запускаете npm run build, потом открываете собранный сайт (или заливаете на хостинг), а картинки и стили не грузятся. В консоли — ошибки 404.
Почему возникает: В режиме разработки Vite обслуживает файлы из корня проекта. А в собранном проекте все лежит в папке dist. Пути ломаются, если они прописаны жёстко.
Что делать:
Используйте относительные пути. Плохо:
<img src="/assets/logo.png" /> // браузер ищет в корне сайтаХорошо:
import logo from './assets/logo.png'
<img src={logo} /> // Vite сам подставит правильный путьНастройте базовый путь. Если ваше приложение лежит не в корне домена, а в подпапке (например,
mysite.com/app/), скажите об этом Vite вvite.config.js:export default {
base: '/app/', // все пути будут начинаться с /app/
}Проверьте публичные файлы. Если вы кладёте файлы в папку
public, обращайтесь к ним из кода безpublicв пути:// public/favicon.ico
<link rel="icon" href="/favicon.ico" />
Часто задаваемые вопросы
Что лучше выбрать для проекта — Vite или Webpack?
Это как сравнивать электрический самокат и внедорожник. Для ежедневных поездок по городу (читай: для разработки) самокат быстрее, маневреннее и не требует парковки. Vite — это самокат: он идеально подходит для разработки, потому что сервер стартует мгновенно, а изменения в коде видны сразу.
Webpack — это внедорожник. Он мощный, умеет всё на свете, но готовить его к поездке нужно долго. Если у вас действительно сложный проект с кучей нестандартных требований — Webpack справится. Но для 90% современных React-приложений Vite более чем достаточно, а удовольствия от разработки он даёт гораздо больше.
Короткий ответ: Если вы начинаете новый проект и у вас нет специфических требований к сборке — берите Vite. Если мигрируете старый проект на Webpack — оставьте как есть, если только не готовы потратить время на перенастройку.
Подходит ли Vite для больших проектов?
Да, и это не просто слова. Например, сам Vue.js (огромный open-source проект) собирается именно Vite. Команда Vite специально проектировала инструмент так, чтобы он масштабировался.
Под капотом для продакшен-сборки Vite использует Rollup — проверенный бандлер, который умеет эффективно разделять код (code splitting) и оптимизировать загрузку. А в разработке скорость не падает с ростом проекта, потому что Vite не пересобирает всё каждый раз, а отдаёт только те файлы, которые реально нужны.
Можно ли использовать Vite с TypeScript?
Да, и это настраивается в два клика. Буквально. Когда создаёте проект:
npm create vite@latest my-app --template react-tsФлаг react-ts разворачивает проект с готовой конфигурацией TypeScript. Вы получаете:
- Поддержку
.tsи.tsxфайлов. - Настроенный
tsconfig.json. - Проверку типов (правда, только в редакторе; для проверки перед сборкой нужно добавить отдельную команду).
Нужно ли устанавливать Babel с Vite?
Нет, если вы не делаете ничего сверхъестественного. Vite использует esbuild — компилятор, написанный на Go, который работает в 10–100 раз быстрее Babel. Он умеет превращать JSX в обычный JavaScript, обрабатывать TypeScript и современные фичи ECMAScript.
Но если вам нужны специфические Babel-плагины (например, для поддержки экспериментальных декораторов), вы всегда можете их добавить — Vite это позволяет.
Какой сервер запускает Vite во время разработки?
Vite запускает собственный сервер разработки, написанный на Node.js. Он не имеет ничего общего с серверами приложений (как Express или Nginx) — это чисто инструмент для разработчика.
Важные детали:
- По умолчанию сервер работает на порту
5173. - Если порт занят, Vite автоматически предложит следующий свободный (5174, 5175 и т.д.).
- Сервер поддерживает HTTP/2 и WebSocket (через WebSocket он отправляет браузеру сигналы об обновлении HMR).
Вы можете поменять порт в vite.config.js:
export default {
server: {
port: 3000
}
}Заключение
Мы проделали большой путь. Начинали с вопроса "а нужен ли мне ещё один сборщик?", а теперь вы умеете:
- Создавать React-проект на Vite одной командой.
- Понимать, как устроен проект и за что отвечает каждый файл.
- Импортировать картинки и стили так, как это делают в современных приложениях.
- Пользоваться магией HMR и не терять состояние компонентов при разработке.
- Находить и исправлять самые частые ошибки.
Vite — это не просто "очередной инструмент". Это сдвиг парадигмы в том, как мы подходим к разработке. Отказ от лишних сборок, мгновенная обратная связь, простота настройки — все это позволяет сосредоточиться на том, что действительно важно: на создании классного пользовательского интерфейса.
Что дальше
Если вы хотите копнуть глубже, вот три направления, с которых можно начать:
- Плагины. Vite умеет подключать плагины так же, как Webpack. Например,
vite-plugin-svgrпозволит импортировать SVG как React-компоненты, а vite-plugin-pwa добавит поддержку прогрессивных веб-приложений. - Конфигурация для продакшена. В
vite.config.jsможно настроить разделение кода, отключить генерацию sourcemap для защиты кода или добавить подмену переменных окружения. - Интеграция с бэкендом. Если вы пишете не SPA, а сайт на Django, Laravel или Rails, Vite можно настроить как сборщик для фронтенда, интегрированный в ваш бэкенд-проект.
Главное — не останавливайтесь. Попробуйте перенести на Vite свой следующий пет-проект. Или даже существующий — в сообществе есть множество гайдов по миграции с Webpack.
А если в процессе наткнётесь на сложности — возвращайтесь к разделу «Решение проблем». Там собраны ответы на самые частые вопросы.