Vite и React

06 ноября 2026
Автор

Олег Марков

Введение

Vite стал стандартом де-факто для создания и разработки современных React-приложений. В отличие от устаревшего Create React App на базе Webpack, Vite обеспечивает мгновенный старт dev-сервера и молниеносную горячую перезагрузку (HMR) даже в крупных проектах.

Но стандартный шаблон npm create vite@latest — это только отправная точка. В реальных проектах вам потребуется настроить алиасы путей, переменные окружения, code splitting, оптимизацию изображений, прокси для API и множество других параметров.

В этой статье вы узнаете:

  • как устроена конфигурация Vite (vite.config.ts) и какие параметры можно настраивать;
  • как настроить TypeScript, пути-алиасы и плагины;
  • как работать с переменными окружения в Vite-проектах;
  • как оптимизировать production-сборку с code splitting;
  • как настроить прокси для dev-сервера;
  • лучшие практики организации Vite-проекта.

Если вы хотите не только разобраться с Vite, но и в целом освоить профессиональную разработку на React, приходите на наш большой курс Основы React, React Router и Redux Toolkit. На курсе 177 уроков и 17 упражнений, AI-тренажеры для безлимитной практики с кодом и задачами 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.

Курс по теме

Курс React и Redux Toolkit с нуля

40 000+ студентов · рейтинг 4.8 · гарантия возврата 30 дней

Создание проекта с Vite

Инициализация нового проекта

Для создания нового React-проекта с Vite используйте официальный шаблон:

npm create vite@latest my-react-app -- --template react-ts
cd my-react-app
npm install
npm run dev

Флаг --template react-ts создаёт проект с TypeScript. Если TypeScript не нужен, используйте --template react.

Доступные шаблоны для React:

  • react — React + JavaScript
  • react-ts — React + TypeScript
  • react-swc — React + JavaScript + SWC (более быстрый компилятор)
  • react-swc-ts — React + TypeScript + SWC

Структура проекта после инициализации

my-react-app/
├── public/                 # Статические файлы (копируются "как есть")
│   └── vite.svg
├── src/
│   ├── assets/             # Ресурсы, обрабатываемые Vite
│   │   └── react.svg
│   ├── App.css
│   ├── App.tsx
│   ├── index.css
│   ├── main.tsx            # Точка входа приложения
│   └── vite-env.d.ts       # Типы Vite для TypeScript
├── index.html              # Корневой HTML-файл (точка входа Vite)
├── package.json
├── tsconfig.json
├── tsconfig.node.json
└── vite.config.ts          # Конфигурация Vite

Важное отличие от других сборщиков — index.html находится в корне проекта, а не внутри public/. Это сделано намеренно: Vite использует index.html как точку входа и может обрабатывать <script type="module"> прямо в нём.

Базовые команды

npm run dev        # Запуск dev-сервера (обычно http://localhost:5173)
npm run build      # Production-сборка (результат в ./dist)
npm run preview    # Предпросмотр production-сборки локально

Конфигурационный файл vite.config.ts

Вся настройка Vite происходит через файл vite.config.ts (или vite.config.js). Это TypeScript-файл с функцией defineConfig.

Базовая структура конфига

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

export default defineConfig({
  plugins: [react()],
})

Функция defineConfig — это просто type-хелпер для автодополнения в IDE, она не изменяет конфигурацию. Её использование необязательно, но рекомендуется.

Опции конфигурации

Рассмотрим ключевые опции конфига и что они делают:

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import path from 'path'

export default defineConfig({
  // Плагины
  plugins: [react()],

  // Настройки dev-сервера
  server: {
    port: 3000,           // Порт (по умолчанию 5173)
    host: true,           // Слушать на 0.0.0.0 (доступно в сети)
    open: true,           // Открыть браузер при запуске
    https: false,         // HTTPS для dev-сервера
  },

  // Настройки сборки
  build: {
    outDir: 'dist',           // Директория вывода (по умолчанию 'dist')
    sourcemap: true,          // Генерировать source maps
    minify: 'esbuild',        // Минификатор: 'esbuild' | 'terser' | false
    target: 'es2015',         // Целевые браузеры/версии ES
    chunkSizeWarningLimit: 500, // Предупреждение о размере чанка (КБ)
  },

  // Разрешение модулей
  resolve: {
    alias: {
      '@': path.resolve(__dirname, './src'),
    },
  },

  // Переменные CSS
  css: {
    preprocessorOptions: {
      scss: {
        additionalData: `@import "@/styles/variables.scss";`,
      },
    },
  },
})

Настройка алиасов путей

Алиасы — это удобные сокращения для длинных путей импорта. Вместо '../../components/Button' вы пишете '@/components/Button'.

Настройка алиасов в vite.config.ts

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import path from 'path'

export default defineConfig({
  plugins: [react()],
  resolve: {
    alias: {
      '@': path.resolve(__dirname, './src'),
      '@components': path.resolve(__dirname, './src/components'),
      '@hooks': path.resolve(__dirname, './src/hooks'),
      '@utils': path.resolve(__dirname, './src/utils'),
      '@assets': path.resolve(__dirname, './src/assets'),
      '@pages': path.resolve(__dirname, './src/pages'),
      '@store': path.resolve(__dirname, './src/store'),
      '@types': path.resolve(__dirname, './src/types'),
    },
  },
})

Настройка TypeScript для понимания алиасов

Чтобы TypeScript понимал алиасы и не подчёркивал импорты красным, нужно настроить tsconfig.json:

{
  "compilerOptions": {
    "target": "ES2020",
    "useDefineForClassFields": true,
    "lib": ["ES2020", "DOM", "DOM.Iterable"],
    "module": "ESNext",
    "skipLibCheck": true,
    "moduleResolution": "bundler",
    "allowImportingTsExtensions": true,
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "jsx": "react-jsx",
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noFallthroughCasesInSwitch": true,
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"],
      "@components/*": ["./src/components/*"],
      "@hooks/*": ["./src/hooks/*"],
      "@utils/*": ["./src/utils/*"],
      "@assets/*": ["./src/assets/*"],
      "@pages/*": ["./src/pages/*"],
      "@store/*": ["./src/store/*"],
      "@types/*": ["./src/types/*"]
    }
  },
  "include": ["src"],
  "references": [{ "path": "./tsconfig.node.json" }]
}

Теперь импорты с алиасами работают в коде:

// Без алиаса (неудобно)
import { Button } from '../../../components/Button'

// С алиасом (удобно)
import { Button } from '@/components/Button'
import { useAuth } from '@hooks/useAuth'

Переменные окружения

Vite имеет встроенную поддержку переменных окружения через файлы .env.

Файлы .env

Vite автоматически подгружает переменные из следующих файлов:

.env                    # Всегда загружается
.env.local              # Всегда загружается, игнорируется git
.env.development        # Загружается только при npm run dev
.env.development.local  # Загружается только при dev, игнорируется git
.env.production         # Загружается только при npm run build
.env.production.local   # Загружается только при build, игнорируется git

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

Важно: Vite открывает браузеру только переменные с префиксом VITE_. Переменные без этого префикса доступны только в Node.js (в vite.config.ts).

# .env
VITE_API_URL=https://api.example.com      # Доступна в браузере
VITE_APP_TITLE=My React App               # Доступна в браузере
SECRET_KEY=super-secret                   # НЕ доступна в браузере (без VITE_)

Использование в коде

// Доступ к переменным в React-компонентах
const apiUrl = import.meta.env.VITE_API_URL
const appTitle = import.meta.env.VITE_APP_TITLE

// Встроенные переменные Vite
const isDev = import.meta.env.DEV         // true в development
const isProd = import.meta.env.PROD       // true в production
const mode = import.meta.env.MODE        // 'development' или 'production'
const baseUrl = import.meta.env.BASE_URL // значение опции base из конфига

console.log('API URL:', apiUrl)
console.log('Mode:', import.meta.env.MODE)

Типизация переменных окружения

Для TypeScript добавьте типы в файл src/vite-env.d.ts:

/// <reference types="vite/client" />

interface ImportMetaEnv {
  readonly VITE_API_URL: string
  readonly VITE_APP_TITLE: string
  readonly VITE_FEATURE_FLAG: string
  // добавьте остальные переменные...
}

interface ImportMeta {
  readonly env: ImportMetaEnv
}

Теперь import.meta.env будет полностью типизирован с автодополнением.

Настройка плагинов

Экосистема плагинов Vite огромна. Рассмотрим наиболее полезные для React-проектов.

@vitejs/plugin-react vs @vitejs/plugin-react-swc

По умолчанию используется @vitejs/plugin-react на базе Babel. Для более быстрой компиляции можно переключиться на SWC:

npm install -D @vitejs/plugin-react-swc
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react-swc'

export default defineConfig({
  plugins: [react()],
})

SWC (Speedy Web Compiler) написан на Rust и компилирует TypeScript/JSX значительно быстрее Babel. Разница особенно заметна в крупных проектах.

Настройка @vitejs/plugin-react

Плагин React поддерживает ряд опций:

import react from '@vitejs/plugin-react'

export default defineConfig({
  plugins: [
    react({
      // Включить Fast Refresh для компонентов
      // (включён по умолчанию в dev-режиме)
      fastRefresh: true,

      // Дополнительные Babel-плагины
      babel: {
        plugins: [
          // Например, для emotion CSS-in-JS
          ['@emotion/babel-plugin'],
        ],
      },

      // Включить JSX runtime (по умолчанию true)
      jsxRuntime: 'automatic',
    }),
  ],
})

vite-plugin-svgr — SVG как компоненты React

Позволяет импортировать SVG-файлы как React-компоненты:

npm install -D vite-plugin-svgr
import svgr from 'vite-plugin-svgr'

export default defineConfig({
  plugins: [
    react(),
    svgr(),
  ],
})

Использование:

// Импорт SVG как React-компонента
import { ReactComponent as Logo } from './logo.svg'
// или с именованным импортом (новый синтаксис)
import Logo from './logo.svg?react'

function Header() {
  return <Logo width={100} height={50} />
}

vite-plugin-checker — проверка типов во время разработки

По умолчанию Vite не выполняет проверку типов TypeScript (только транспиляцию через esbuild). Для проверки типов в реальном времени:

npm install -D vite-plugin-checker
import checker from 'vite-plugin-checker'

export default defineConfig({
  plugins: [
    react(),
    checker({
      typescript: true,     // Проверять TypeScript
      eslint: {
        lintCommand: 'eslint "./src/**/*.{ts,tsx}"',
      },
    }),
  ],
})

rollup-plugin-visualizer — анализ размера бандла

Незаменимый плагин для оптимизации: показывает, какие модули занимают больше всего места:

npm install -D rollup-plugin-visualizer
import { visualizer } from 'rollup-plugin-visualizer'

export default defineConfig({
  plugins: [
    react(),
    visualizer({
      open: true,         // Открыть отчёт после сборки
      gzipSize: true,     // Показывать gzip-размер
      brotliSize: true,   // Показывать brotli-размер
      filename: 'dist/stats.html',
    }),
  ],
})

Настройка dev-сервера и прокси

Базовые настройки server

export default defineConfig({
  server: {
    port: 3000,       // Порт dev-сервера
    host: '0.0.0.0',  // Доступ из локальной сети
    open: '/login',   // Открыть конкретный URL при запуске
    strictPort: true, // Ошибка вместо смены порта, если порт занят
    https: {          // HTTPS (нужны сертификаты)
      key: './certs/key.pem',
      cert: './certs/cert.pem',
    },
  },
})

Настройка прокси для API

Прокси позволяет решить проблему CORS при разработке — запросы к /api будут перенаправляться на бэкенд-сервер:

export default defineConfig({
  server: {
    proxy: {
      // Простой прокси
      '/api': 'http://localhost:8080',

      // Прокси с дополнительными опциями
      '/api/v2': {
        target: 'http://localhost:8080',
        changeOrigin: true,  // Изменить заголовок Host
        rewrite: (path) => path.replace(/^\/api\/v2/, '/api'),
      },

      // Прокси для WebSocket
      '/socket.io': {
        target: 'ws://localhost:8080',
        ws: true,
      },

      // Несколько путей на разные сервисы
      '/auth': {
        target: 'http://localhost:3001',
        changeOrigin: true,
      },
    },
  },
})

Теперь в коде React можно делать запросы без указания полного URL:

// Запрос уйдёт через прокси на http://localhost:8080/api/users
const response = await fetch('/api/users')

HMR настройки

export default defineConfig({
  server: {
    hmr: {
      port: 5174,           // Отдельный порт для WebSocket HMR
      overlay: true,        // Показывать ошибки поверх приложения
    },
  },
})

Оптимизация production-сборки

Настройки build

export default defineConfig({
  build: {
    outDir: 'dist',                  // Директория вывода
    assetsDir: 'assets',             // Поддиректория для ресурсов
    sourcemap: false,                // Отключить source maps в prod
    minify: 'esbuild',               // Минификатор (быстрее terser)
    target: 'es2015',                // Поддержка браузеров
    cssCodeSplit: true,              // Разделять CSS по чанкам
    chunkSizeWarningLimit: 1000,     // Предупреждение (КБ)
    emptyOutDir: true,               // Очищать dist перед сборкой
    reportCompressedSize: false,     // Не считать размер сжатых файлов (ускоряет сборку)
  },
})

Code Splitting — разделение кода

Code splitting позволяет разбить приложение на части (чанки), которые загружаются по мере необходимости, уменьшая начальный размер бандла.

Динамический импорт в React

Самый простой способ code splitting — React.lazy() с Suspense:

import React, { Suspense, lazy } from 'react'
import { Routes, Route } from 'react-router-dom'

// Эти компоненты будут в отдельных чанках
const Dashboard = lazy(() => import('./pages/Dashboard'))
const Settings = lazy(() => import('./pages/Settings'))
const Profile = lazy(() => import('./pages/Profile'))

function App() {
  return (
    <Suspense fallback={<div>Загрузка...</div>}>
      <Routes>
        <Route path="/" element={<Dashboard />} />
        <Route path="/settings" element={<Settings />} />
        <Route path="/profile" element={<Profile />} />
      </Routes>
    </Suspense>
  )
}

При этом Vite автоматически создаст отдельный .js-файл для каждой страницы.

Ручная настройка чанков через rollupOptions

Для контроля над разделением бандла используйте rollupOptions:

export default defineConfig({
  build: {
    rollupOptions: {
      output: {
        // Разделить vendor-библиотеки в отдельные чанки
        manualChunks: {
          'react-vendor': ['react', 'react-dom'],
          'router': ['react-router-dom'],
          'redux': ['@reduxjs/toolkit', 'react-redux'],
          'ui': ['@radix-ui/react-dialog', '@radix-ui/react-dropdown-menu'],
        },

        // Или через функцию для динамического определения чанков
        // manualChunks(id) {
        //   if (id.includes('node_modules')) {
        //     return 'vendor'
        //   }
        // },

        // Настройка имён файлов
        chunkFileNames: 'assets/js/[name]-[hash].js',
        entryFileNames: 'assets/js/[name]-[hash].js',
        assetFileNames: 'assets/[ext]/[name]-[hash].[ext]',
      },
    },
  },
})

Оптимизация зависимостей

Vite использует esbuild для предварительной оптимизации зависимостей (dep optimization). Это ускоряет загрузку страниц в режиме разработки.

export default defineConfig({
  optimizeDeps: {
    // Явно включить пакеты для предоптимизации
    include: [
      'lodash-es',
      '@mui/material',
      'react-virtualized',
    ],
    // Исключить пакеты из предоптимизации
    exclude: ['some-local-package'],
    // Дополнительные esbuild-опции для оптимизации
    esbuildOptions: {
      target: 'es2020',
    },
  },
})

Работа с ресурсами (assets)

Импорт изображений

// Импорт изображения — Vite вернёт URL
import logoUrl from './logo.png'

function App() {
  return <img src={logoUrl} alt="Logo" />
}

// Явное получение URL через ?url
import imageUrl from './hero.jpg?url'

// Импорт как строка base64 (для маленьких изображений)
import iconBase64 from './icon.png?inline'

// Получение сырых байт
import rawData from './data.bin?raw'

Настройка лимита для inline-ресурсов

По умолчанию Vite инлайнит ресурсы меньше 4KB как base64. Можно изменить:

export default defineConfig({
  build: {
    assetsInlineLimit: 8192, // 8KB (в байтах)
  },
})

Публичные ресурсы

Файлы в папке public/ копируются в корень dist/ без обработки. Они доступны по абсолютному пути:

// public/robots.txt → dist/robots.txt
// public/images/logo.png → dist/images/logo.png

// В коде обращайтесь по абсолютному пути
<img src="/images/logo.png" alt="Logo" />

TypeScript в Vite-проектах

tsconfig.node.json для конфига Vite

Файл tsconfig.node.json нужен для того, чтобы TypeScript правильно проверял vite.config.ts — этот файл выполняется в Node.js, а не в браузере:

{
  "compilerOptions": {
    "composite": true,
    "skipLibCheck": true,
    "module": "ESNext",
    "moduleResolution": "bundler",
    "allowSyntheticDefaultImports": true
  },
  "include": ["vite.config.ts"]
}

Использование importMeta в TypeScript

Если используете import.meta.env или другие Vite-специфичные фичи, добавьте ссылку на типы Vite:

// src/vite-env.d.ts (создаётся автоматически при инициализации)
/// <reference types="vite/client" />

Это добавляет типы для import.meta.env, import.meta.hot и т.д.

Режимы и конфигурация под разные окружения

Несколько конфигов через режимы

Vite поддерживает режимы (mode). По умолчанию:

  • npm run dev → режим development
  • npm run build → режим production

Можно задавать свои режимы:

vite build --mode staging
vite build --mode preview

В зависимости от режима загружаются разные .env-файлы:

.env.staging        # загружается при --mode staging
.env.preview        # загружается при --mode preview

Условная конфигурация в vite.config.ts

import { defineConfig, loadEnv } from 'vite'
import react from '@vitejs/plugin-react'

export default defineConfig(({ command, mode }) => {
  // Загружаем переменные окружения вручную
  const env = loadEnv(mode, process.cwd(), '')

  const isDev = command === 'serve'
  const isProd = command === 'build'

  return {
    plugins: [react()],

    define: {
      // Делаем переменные доступными глобально в коде
      __APP_VERSION__: JSON.stringify(env.npm_package_version),
      __API_URL__: JSON.stringify(env.VITE_API_URL),
    },

    server: isDev ? {
      port: 3000,
      proxy: {
        '/api': env.VITE_API_URL,
      },
    } : undefined,

    build: isProd ? {
      sourcemap: false,
      minify: 'esbuild',
    } : undefined,
  }
})

Настройка CSS и препроцессоров

CSS Modules

Vite поддерживает CSS Modules из коробки — просто назовите файл .module.css:

/* Button.module.css */
.button {
  padding: 8px 16px;
  background-color: #007bff;
  color: white;
  border-radius: 4px;
}

.buttonPrimary {
  background-color: #0056b3;
}
import styles from './Button.module.css'

function Button({ primary }: { primary?: boolean }) {
  return (
    <button
      className={`${styles.button} ${primary ? styles.buttonPrimary : ''}`}
    >
      Click me
    </button>
  )
}

SCSS/Sass

Просто установите sass — никаких плагинов не нужно:

npm install -D sass
// Теперь можно импортировать .scss/.sass файлы
import './styles/main.scss'

Для глобальных переменных SCSS во всех файлах:

export default defineConfig({
  css: {
    preprocessorOptions: {
      scss: {
        // Автоматически добавлять импорт переменных во все SCSS файлы
        additionalData: `@use "@/styles/variables" as *;`,
      },
    },
  },
})

Tailwind CSS

npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
// tailwind.config.js
export default {
  content: [
    "./index.html",
    "./src/**/*.{js,ts,jsx,tsx}",
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}
/* src/index.css */
@tailwind base;
@tailwind components;
@tailwind utilities;

Vite обрабатывает PostCSS автоматически при наличии postcss.config.js в корне.

Практический пример: полный vite.config.ts для production

Вот реалистичный конфиг для реального React-проекта с TypeScript, Tailwind CSS, алиасами и оптимизацией:

import { defineConfig, loadEnv } from 'vite'
import react from '@vitejs/plugin-react'
import path from 'path'
import { visualizer } from 'rollup-plugin-visualizer'
import svgr from 'vite-plugin-svgr'
import checker from 'vite-plugin-checker'

export default defineConfig(({ mode }) => {
  const env = loadEnv(mode, process.cwd(), '')
  const isProduction = mode === 'production'
  const isAnalyze = process.env.ANALYZE === 'true'

  return {
    plugins: [
      react(),
      svgr(),
      checker({
        typescript: true,
      }),
      isAnalyze && visualizer({
        open: true,
        gzipSize: true,
        filename: 'dist/stats.html',
      }),
    ].filter(Boolean),

    resolve: {
      alias: {
        '@': path.resolve(__dirname, './src'),
        '@components': path.resolve(__dirname, './src/components'),
        '@hooks': path.resolve(__dirname, './src/hooks'),
        '@pages': path.resolve(__dirname, './src/pages'),
        '@store': path.resolve(__dirname, './src/store'),
        '@utils': path.resolve(__dirname, './src/utils'),
        '@types': path.resolve(__dirname, './src/types'),
        '@assets': path.resolve(__dirname, './src/assets'),
      },
    },

    server: {
      port: 3000,
      proxy: {
        '/api': {
          target: env.VITE_API_URL || 'http://localhost:8080',
          changeOrigin: true,
        },
      },
    },

    build: {
      outDir: 'dist',
      sourcemap: !isProduction,
      minify: isProduction ? 'esbuild' : false,
      target: 'es2015',
      rollupOptions: {
        output: {
          manualChunks: {
            'react-vendor': ['react', 'react-dom'],
            'router': ['react-router-dom'],
          },
          chunkFileNames: 'assets/js/[name]-[hash].js',
          entryFileNames: 'assets/js/[name]-[hash].js',
          assetFileNames: ({ name }) => {
            if (/\.(png|jpe?g|gif|svg|webp|ico)$/.test(name ?? '')) {
              return 'assets/images/[name]-[hash][extname]'
            }
            if (/\.css$/.test(name ?? '')) {
              return 'assets/css/[name]-[hash][extname]'
            }
            return 'assets/[name]-[hash][extname]'
          },
        },
      },
    },

    optimizeDeps: {
      include: ['react', 'react-dom'],
    },

    css: {
      devSourcemap: true,
    },
  }
})

Сравнение Vite и Create React App

Понимание разницы поможет вам объяснить выбор инструмента коллегам или на собеседовании:

КритерийViteCreate React App
Время холодного старта< 1 секунды10-30 секунд
HMR (горячая перезагрузка)Мгновенная2-10 секунд
Базовый сборщикRollup (prod), ESM (dev)Webpack
НастраиваемостьОчень гибкийОграниченная (eject)
TypeScriptВстроенная поддержкаВстроенная поддержка
ПоддержкаАктивнаяУстаревший (не рекомендуется)
Конфиг файлvite.config.tsСкрытый (нужен eject)
ПлагиныОгромная экосистемаОграниченная
Размер node_modulesМеньшеБольше

CRA (Create React App) официально считается устаревшим и больше не рекомендуется командой React. Vite — рекомендуемый выбор для новых проектов.

Типичные проблемы и их решение

Проблема: CommonJS-модули не работают с ESM

Некоторые старые npm-пакеты используют CommonJS, что может вызывать проблемы:

// Решение: добавить в optimizeDeps.include
export default defineConfig({
  optimizeDeps: {
    include: ['some-commonjs-package'],
  },
})

Проблема: import.meta.env не работает

// Неправильно — не делайте деструктуризацию
const { VITE_API_URL } = import.meta.env  // может не работать

// Правильно — обращайтесь напрямую
const apiUrl = import.meta.env.VITE_API_URL

Проблема: Vite не видит изменения в node_modules

# Очистите кэш Vite и перезапустите
npx vite --force
# или
rm -rf node_modules/.vite

Проблема: process.env не определён

В отличие от CRA, Vite не предоставляет process.env. Используйте import.meta.env:

// Неправильно (CRA стиль)
const apiUrl = process.env.REACT_APP_API_URL

// Правильно (Vite стиль)
const apiUrl = import.meta.env.VITE_API_URL

Если нужна совместимость со старым кодом, добавьте в конфиг:

export default defineConfig({
  define: {
    'process.env': {}
  },
})

Заключение

Vite — мощный и гибкий инструмент, который значительно ускоряет разработку React-приложений. В этой статье вы изучили:

  • Структуру и базовую конфигурацию через vite.config.ts
  • Алиасы путей для удобных импортов и их настройку в TypeScript
  • Переменные окружения через .env файлы и import.meta.env
  • Популярные плагины для SVG, проверки типов и анализа бандла
  • Прокси для решения CORS-проблем при разработке
  • Оптимизацию сборки с code splitting, manualChunks и минификацией
  • Работу с CSS — CSS Modules, SCSS и Tailwind CSS
  • Типичные проблемы и способы их решения

Понимание конфигурации Vite — обязательный навык для современного React-разработчика. С хорошо настроенным Vite ваши проекты будут быстро собираться, удобно разрабатываться и оптимально работать в production.

Если вы хотите глубже погрузиться в React и научиться создавать профессиональные приложения, приходите на наш курс Основы React, React Router и Redux Toolkit. На курсе 177 уроков и 17 упражнений, AI-тренажеры для безлимитной практики с кодом и задачами 24/7.

Стрелочка влевоWebpack и ReactЗачем нужны React Scripts и как использоватьСтрелочка вправо

Постройте личный план изучения React до уровня Middle — бесплатно!

React — часть карты развития Frontend

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по React

React тестирование с Vitest
Zustand: продвинутые паттерны, persist middleware и slicesUncontrolled Components: когда DOM управляет даннымиБезопасность в React: защита от XSS, CSRF и утечек данныхRender Props: гибкое управление рендерингом в ReactРефакторинг React-кода: техники и лучшие практикиReact с WebSocket — реалтайм в компонентахReact Native New Architecture: Fabric и JSIReact Native приложение с нуля до публикации в сторахПрофилирование React: как найти и устранить узкие местаЧастичное применение: как создавать компоненты без лишнего кодаИменование компонентов в React: соглашения и лучшие практикиЛенивая загрузка: как ускорить React-приложение в разыОшибки гидратации в React и способы их устраненияHOC в React: мастерство композиции компонентовАрхитектура больших React приложений: Feature-Sliced DesignuseMemo: как спасти производительность от тяжелых вычисленийError Boundaries: создаем надежные React-приложенияКонтролируемые компоненты в React: полный контроль над формамиCompound Components в React: создаем гибкие компоненты с мощным APIДокументирование компонентов в React: Storybook, JSDoc и READMEКомпозиция компонентов в React: строим гибкие интерфейсыCode Splitting в React: как уменьшить бандл и ускорить загрузку приложенияАсинхронные компоненты в React: новый стандарт работы с даннымиДоступность (a11y) в React: ARIA, семантика и клавиатурная навигацияКомментирование кода в React: когда и как писать комментарии
Zustand — управление состоянием в ReactXState - конечные автоматыYup - валидация схемZod - валидация с TypeScriptТемизация в ReactТестирование хуковTailwind CSS с ReactSWR - библиотека для запросовStyled Components — стилизация через JSStorybook - документация компонентовSnapshots тестированиеRTK Query - работа с APIRedux Toolkit - современный ReduxRecoil — библиотека управления состоянием от FacebookВиртуализация списков с react-window: как отображать тысячи элементов без лаговReact Toastify - уведомления в ReactReact Testing LibraryСоздание таблиц в React гайд по react-tableReact Spring - анимацииРабота с формами и селектами в ReactReact Query (TanStack Query) - работа с серверомПлагины в React что это и как их использоватьReact PDF - работа с PDF файламиОбзор популярных библиотек для ReactReact Icons - библиотека иконок для ReactReact Hook Form — валидация форм в ReactReact Dropzone — загрузка файловПодключение Bootstrap к React-приложениюReact Beautiful DnD - перетаскивание элементовАнимация при монтировании компонентов в ReactМокирование APIMobX — реактивное управление состоянием в ReactМикрофронтенды с React (micro-frontends)Загрузка и индикаторыАнимация списков в ReactJotai - атомарное состояниеБесконечная прокруткаFramer Motion - библиотека анимацийEmotion — библиотека CSS-in-JSДинамические стили в ReactE2E тестирование с CypressCSSTransition - переходыCSS-in-JS — плюсы и минусыКонтекст vs Redux — когда что использоватьИспользование Chart.js в ReactAxios с ReactТестирование асинхронных компонентовОбработка ошибок API
Valtio: атомарный state management в ReactuseState в React что это и как использоватьuseTransition - плавные переходы между состояниямиuseSyncExternalStore — работа с внешними сторамиuseRef в React — создание ссылок на DOM и значенияuseOptimistic — оптимистичные обновления UIuseLayoutEffect в React — эффект до отрисовкиuseInsertionEffect — внедрение стилей до мутаций DOMuseImperativeHandle в React — настройка ref дочернего компонентаuseId — генерация уникальных идентификаторовuseFormStatus - отслеживание статуса отправки формыuseDeferredValue — отложенное обновление состоянияuseDebugValue — отладка кастомных хуковuseCallback в React — мемоизация функцийuseReducer — альтернатива useState для сложной логикиuseMemo в React: как и когда оптимизировать тяжелые вычисленияХук use() в React 19useEffect в React что это и как использоватьuseContext — работа с контекстом в ReactuseCallback в React — мемоизация функций и оптимизация ре-рендеровuseActionState в React 19React Stale Closures — устаревшие замыкания в хукахОптимизация рендеринга в React: от теории к глубокой практикеЧто такое useRef и как его применять в ReactКак и зачем использовать React HooksУправление состоянием в React через ContextНовые возможности React 19Как предотвратить лишние ре-рендеры в React: полное руководствоuseMemo vs useCallback: подробное руководство по мемоизации в ReactПравила хуков — правила использованияflushSync — синхронные обновления состояния в ReactuseEffect vs useLayoutEffect: в чём разница и какой хук выбрать?Кастомные хуки в React — создание собственных хуковuseState продвинутое использование в React
Transition API — плавные обновления интерфейса в ReactReact Suspense — приостановка рендераStrictMode в React — как находить ошибки на этапе разработкиСерверные компоненты React (RSC) — подробный разбор и практикаКак работает рендеринг в ReactЧто такое props в React и как их правильно использоватьКак работает JSX связка React и HTMLЧто такое React.js и как его использоватьКак использовать элементы в ReactЧто такое компоненты в React и как их применятьРабота с children в ReactКак использовать React DOM в проектеПорталы в React: рендер компонентов вне иерархии DOMFragment в React: группировка элементов без лишних узлов DOMCSS Modules в ReactConcurrent Mode — конкурентный режим в React
Открыть базу знаний

Лучшие курсы по теме

изображение курса

React и Redux Toolkit

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий