6. Статические ресурсы
Vite предоставляет мощную систему обработки статических ресурсов с поддержкой специальных URL-суффиксов, которые меняют способ импорта файла.
Обычный импорт ресурсов
Заголовок раздела «Обычный импорт ресурсов»// Импорт изображенийimport logo from './logo.png'// → logo = '/assets/logo-abc123.png' (хэшированный URL)
// В JSX:<img src={logo} alt="Logo" />
// Импорт faviconimport icon from './icon.ico'Суффиксы URL
Заголовок раздела «Суффиксы URL»Vite поддерживает специальные суффиксы, меняющие тип импорта:
?url — Явный URL
Заголовок раздела «?url — Явный URL»import logoUrl from './logo.png?url'// → logoUrl = '/assets/logo-abc123.png'// То же, что и обычный импорт для большинства файлов// Но явно указывает намерение получить URL
// Полезно для SVG и текстовых файловimport iconUrl from './icon.svg?url'?raw — Содержимое файла как строка
Заголовок раздела «?raw — Содержимое файла как строка»import shaderCode from './shader.glsl?raw'// → shaderCode = 'void main() { ... }' (содержимое файла)
import svgContent from './icon.svg?raw'// → '<svg xmlns="...">...</svg>'
// Полезно для:// - GLSL шейдеры// - SVG для прямой вставки// - Текстовые шаблоны?worker — Web Worker
Заголовок раздела «?worker — Web Worker»// Простой Workerimport MyWorker from './heavy-task.worker.ts?worker'const worker = new MyWorker()worker.postMessage({ data: [...] })
// Inline Worker (встроен в бандл, не создаёт отдельный файл)import InlineWorker from './worker.ts?worker&inline'
// SharedWorkerimport SharedWorker from './shared.worker.ts?sharedworker'?init — WebAssembly
Заголовок раздела «?init — WebAssembly»import init from './math.wasm?init'
async function run() { const instance = await init() console.log(instance.exports.add(2, 3)) // 5}Директория public/
Заголовок раздела «Директория public/»Файлы в public/ копируются в корень dist/ без обработки:
public/├── robots.txt → /robots.txt├── favicon.ico → /favicon.ico└── og-image.png → /og-image.png
# Доступны по абсолютному пути:<img src="/og-image.png" />// НЕ импортируй файлы из public/ через import!// Они не хэшируются и не оптимизируютсяInline ресурсы (base64)
Заголовок раздела «Inline ресурсы (base64)»build: { assetsInlineLimit: 4096, // 4KB — файлы меньше этого размера // встраиваются как base64 data URL}
// Маленькие PNG/SVG автоматически конвертируются в:// data:image/png;base64,iVBORw0KGgo...TypeScript типы для ресурсов
Заголовок раздела «TypeScript типы для ресурсов»// src/vite-env.d.ts (автоматически создаётся Vite)/// <reference types="vite/client" />
// Содержит типы для:declare module '*.svg' { const src: string export default src}declare module '*.png' { const src: string; export default src }declare module '*.jpg' { const src: string; export default src }declare module '*.svg?raw' { const content: string; export default content }declare module '*.glsl?raw' { const content: string; export default content }SVG как React компонент
Заголовок раздела «SVG как React компонент»# Установи плагинnpm i -D vite-plugin-svgrimport svgr from 'vite-plugin-svgr'
export default defineConfig({ plugins: [svgr()],})
// Usageimport { ReactComponent as Logo } from './logo.svg'// или с новым синтаксисом:import Logo from './logo.svg?react'
// В JSX:<Logo width={32} height={32} fill="#646cff" />Ниже — интерактивный демонстратор всех вариантов импорта: выбирай суффикс и смотри результат: