Vite рассматривает любые статические ресурсы как часть графа модулей. Это означает, что изображения не копируются вручную и не требуют отдельной настройки сборщика — достаточно импортировать файл напрямую в код.
Наиболее распространённый способ работы с изображениями:
import logo from './assets/logo.png';
document.querySelector('#app').innerHTML = `
<img src="${logo}" alt="Logo">
`;
При таком импорте Vite:
Ключевая особенность заключается в том, что импорт изображения — это не загрузка файла в рантайме, а получение ссылки на оптимизированный ресурс после сборки.
В ESM-окружении Vite поддерживает стандартный механизм:
const imgUrl = new URL('./assets/logo.png', import.meta.url).href;
const img = document.createElement('img');
img.src = imgUrl;
document.body.appendChild(img);
Такой подход полезен при динамическом формировании путей или работе без прямого import.
Vite позволяет управлять способом обработки файлов через query-параметры:
Принудительно возвращает URL файла:
import imgUrl from './assets/photo.jpg?url';
Используется, когда важно явно указать, что нужен путь, а не инлайн-контент.
Файл преобразуется в base64 и встраивается прямо в бандл:
import icon from './assets/icon.svg?inline';
Подходит для маленьких изображений, где HTTP-запрос нежелателен.
Импортирует содержимое файла как строку:
import svgText from './assets/icon.svg?raw';
Часто применяется для:
Файлы, размещённые в папке public, не проходят через
систему модулей Vite.
public/
images/
banner.jpg
Доступ к таким ресурсам осуществляется напрямую:
<img src="/images/banner.jpg">
Особенности:
Такой подход применяется для:
Шрифты в Vite обрабатываются через CSS как обычные зависимости.
@font-face {
font-family: "Inter";
src: url("./fonts/Inter-Regular.woff2") format("woff2");
font-weight: 400;
font-style: normal;
}
Vite автоматически:
На уровне сборки одинаково обрабатываются:
Vite применяет стандартные оптимизации:
Vite одинаково работает с изображениями, шрифтами и мультимедиа.
import sound from './media/click.mp3';
const audio = new Audio(sound);
audio.play();
import videoUrl from './media/intro.mp4';
const video = document.createElement('video');
video.src = videoUrl;
video.controls = true;
document.body.appendChild(video);
Все медиафайлы проходят через тот же механизм:
Vite автоматически решает, инлайнить файл или нет, на основе размера.
Настройка:
// vite.config.js
export default {
build: {
assetsInlineLimit: 4096
}
}
Логика:
Это особенно важно для:
SVG в Vite может обрабатываться несколькими способами.
import icon from './icon.svg';
import icon from './icon.svg?raw';
SVG можно вставить напрямую в DOM:
import icon from './icon.svg?raw';
document.body.innerHTML = icon;
При сборке важно учитывать параметр base:
export default {
base: '/app/'
}
Все ассеты (изображения, шрифты, медиа) автоматически получают корректный префикс.
Пример результата:
<img src="/app/assets/logo.8d7f3a.png">
Vite поддерживает динамический импорт изображений через шаблонные пути:
const images = import.meta.glob('./assets/*.png', {
eager: true,
import: 'default'
});
console.log(images);
Это даёт:
Vite классифицирует ресурсы:
Это влияет на:
Каждый ассет получает уникальный хеш:
logo.3f2a1c8d.png
Преимущества:
Помимо JS, ресурсы подключаются напрямую в CSS:
.background {
background-image: url("./images/bg.jpg");
}
Vite автоматически:
В современных UI-подходах (React, Vue, Svelte) ресурсы импортируются прямо в компонентах:
import avatar from './assets/avatar.png';
export default function Profile() {
return `<img src="${avatar}" />`;
}
Такой подход обеспечивает:
Vite рассматривает все статические файлы как модули с единым принципом обработки: