Vite как сборщик проектов: от базовых настроек до продвинутых конфигураций

Раздел: Инструменты разработки -> Сборщики проектов

Основные возможности Vite и их настройка

Наиболее эффективный способ начать работу с Vite – использование шаблона по умолчанию. Это даёт мгновенный холодный старт и быструю горячую замену модулей (HMR).

npm create vite@latest my-project -- --template react-ts

Vite js (vite javascript инструмент сборки)

Далее переход в директорию проекта и установка зависимостей:

cd my-project && npm install && npm run dev

Dev-сервер запускается на localhost:5173. Любое изменение кода обновляет модули без перезагрузки страницы.

Как настроить Vite для проекта на чистом JavaScript?

Для проектов без фреймворков достаточно создать пустой проект и вручную настроить vite.config.js.

npm create vite@latest vanilla-js -- --template vanilla
cd vanilla-js && npm install

Файл vite.config.js может оставаться пустым, Vite работает из коробки. Для подключения дополнительных транспиляторов (например, Babel) устанавливается плагин.

Частая проблема: отсутствие поддержки TypeScript без шаблона. Решение – добавить @vitejs/plugin-basic-ssl для HTTPS или использовать шаблон с TS.

Как настроить алиасы для упрощения импортов?

В файле vite.config.ts (или .js) добавляется секция resolve.alias.

import { defineConfig } from 'vite';
export default defineConfig({
  resolve: {
    alias: {
      '@': '/src',
      '@components': '/src/components'
    }
  }
});

Теперь вместо import Button from '../../components/Button' пишется import Button from '@components/Button'.

Ошибка: пути в CSS или изображениях не работают с алиасами, если не настроен @import. Для CSS используется префикс ~ или плагин vite-plugin-css-import.

Как добавить поддержку Svelte?

Для Svelte используется официальный плагин @sveltejs/vite-plugin-svelte.

npm create vite@latest svelte-app -- --template svelte-ts
cd svelte-app && npm install

Вручную плагин устанавливается так:

npm i -D @sveltejs/vite-plugin-svelte

и добавляется в конфигурацию:

import { defineConfig } from 'vite';
import { svelte } from '@sveltejs/vite-plugin-svelte';
export default defineConfig({ plugins: [svelte()] });

Проблема: ошибки сборки при использовании TypeScript. Требуется установка svelte-check и настройка tsconfig.json с "types": ["svelte"].

Как настроить proxy для API в режиме разработки?

В vite.config.ts добавляется server.proxy.

export default defineConfig({
  server: {
    proxy: {
      '/api': {
        target: 'http://localhost:3000',
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, '')
      }
    }
  }
});

Теперь запросы к /api/users перенаправляются на http://localhost:3000/users.

Частая ошибка: не указывается changeOrigin: true, что вызывает CORS-ошибки. rewrite может быть избыточным, если API ожидает пути с префиксом.

Как оптимизировать продакшн-сборку?

Vite использует Rollup под капотом. Для разделения кода на чанки настраивается build.rollupOptions.output.manualChunks.

export default defineConfig({
  build: {
    rollupOptions: {
      output: {
        manualChunks: {
          vendor: ['react', 'react-dom'],
          utils: ['lodash-es', 'date-fns']
        }
      }
    }
  }
});

Результат – отдельные файлы vendor.[hash].js и utils.[hash].js.

Проблема: чанки могут стать слишком большими. Рекомендуется использовать динамические импорты и разделение по маршрутам. Также помогает vite-plugin-optimize-persist.

Как использовать Vite в режиме сборки библиотеки?

Для создания npm-пакета в vite.config.ts добавляется build.lib.

import { defineConfig } from 'vite';
export default defineConfig({
  build: {
    lib: {
      entry: 'src/index.ts',
      name: 'MyLib',
      fileName: (format) => `my-lib.${format}.js`
    },
    rollupOptions: {
      external: ['react'],
      output: { globals: { react: 'React' } }
    }
  }
});

Команда vite build создаст файлы в форматах ES и UMD.

Ошибка: типы TypeScript не генерируются автоматически. Требуется плагин vite-plugin-dts.

npm i -D vite-plugin-dts
import dts from 'vite-plugin-dts';
export default defineConfig({ plugins: [dts()] });

Примеры продвинутой настройки Vite

Пример 1: Кастомный плагин для обработки Markdown

Создаётся плагин, преобразующий .md файлы в строку HTML.

Пример
// plugins/markdown.ts
import { Plugin } from 'vite';
import { marked } from 'marked';

export function markdownPlugin(): Plugin {
  return {
    name: 'vite-markdown',
    transform(code, id) {
      if (!id.endsWith('.md')) return null;
      const html = marked(code);
      return { code: `export default ${JSON.stringify(html)};`, map: null };
    }
  };
}

В конфигурации:

Пример
import { defineConfig } from 'vite';
import { markdownPlugin } from './plugins/markdown';
export default defineConfig({ plugins: [markdownPlugin()] });

Содержимое readme.md:

Пример
# Hello
This is **bold** text.

Результат импорта в коде:

import html from './readme.md';
console.log(html);
// "

Hello

\n

This is bold text.

\n"

Пример 2: Настройка HTTPS и пользовательского сертификата

Для локальной разработки можно включить HTTPS с самоподписанным сертификатом.

Пример
import { defineConfig } from 'vite';
import fs from 'fs';
export default defineConfig({
  server: {
    https: {
      key: fs.readFileSync('./certs/key.pem'),
      cert: fs.readFileSync('./certs/cert.pem')
    },
    port: 443
  }
});

Для генерации сертификатов используется mkcert:

Пример
mkcert -install
mkcert localhost 127.0.0.1 ::1
mv localhost+2-key.pem certs/key.pem
mv localhost+2.pem certs/cert.pem

Результат – dev-сервер доступен по https://localhost.

Пример 3: Динамические импорты с комментированием чанков

Vite поддерживает магические комментарии Webpack для именования чанков.

Пример
// src/router.ts
const Home = () => import(/* webpackChunkName: "home" */ './pages/Home');
const About = () => import(/* webpackChunkName: "about" */ './pages/About');

В vite.config.ts достаточно build.rollupOptions:

Пример
export default defineConfig({
  build: {
    rollupOptions: {
      output: {
        chunkFileNames: 'assets/[name]-[hash].js'
      }
    }
  }
});

Результат сборки:

dist/assets/home-abc123.js
ist/assets/about-def456.js

Пример 4: Настройка анализатора размера бандла

Плагин vite-plugin-visualizer генерирует интерактивную карту.

Пример
npm i -D vite-plugin-visualizer
Пример
import { visualizer } from 'vite-plugin-visualizer';
export default defineConfig({
  plugins: [visualizer({ filename: 'stats.html', gzipSize: true })]
});

После vite build появляется файл stats.html. Открытие в браузере показывает treemap всех модулей.

Пример 5: Использование Vite с Express для серверного рендеринга (SSR)

Настройка серверной сборки и клиентской сборки.

Пример
// vite.config.ts
export default defineConfig({
  build: {
    ssr: 'src/entry-server.ts',
    rollupOptions: {
      input: { client: 'index.html', server: 'src/entry-server.ts' }
    }
  }
});

Команды сборки:

Пример

"build": "vite build",
"preview": "node server.js"

Пример сервера server.js (упрощённо):

Пример
import express from 'express';
import { renderToString } from 'react-dom/server';
import App from './dist/entry-server';
const app = express();
app.get('/*', async (req, res) => {
  const html = renderToString(React.createElement(App));
  res.send(`
${html}
`); }); app.listen(3000);

Результат: страница рендерится на сервере, затем гидратируется на клиенте.

Пример 6: Переменные окружения с разными режимами

Файлы .env.development и .env.production.

Пример
# .env.development
VITE_API_URL=http://localhost:4000
Пример
# .env.production
VITE_API_URL=https://api.site.com

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

Пример
fetch(import.meta.env.VITE_API_URL + '/data')

При запуске vite dev используется development, при vite build – production. Можно создать кастомные режимы: .env.staging и запуск vite build --mode staging.

Пример 7: Интеграция с TypeScript через пути (paths)

Настройка tsconfig.json совместно с алиасами Vite:

Пример
{
  "compilerOptions": {
    "paths": {
      "@/*": ["./src/*"]
    }
  }
}

Vite конфигурация:

Пример
export default defineConfig({
  resolve: {
    alias: {
      '@': '/src'
    }
  }
});

После этого импорт import Button from '@/components/Button' работает в TypeScript и в сборке.

Пример 8: Использование Web Workers с Vite

Создание файла worker.ts:

Пример
self.onmessage = (e) => {
  self.postMessage(e.data * 2);
};

В основном коде:

Пример
const worker = new Worker(new URL('./worker.ts', import.meta.url));
worker.onmessage = (e) => console.log(e.data);
worker.postMessage(10);

Vite автоматически выделит worker в отдельный чанк. Результат: в консоль выводится 20.

Vite JavaScript инструмент сборки - comments

En
Vite js (javascript)