В процессе сборки Vite обрабатывает любые импортируемые статические
файлы — изображения, шрифты, иконки, аудио и другие бинарные ресурсы — и
принимает решение о том, нужно ли их встроить прямо в JavaScript/CSS или
вынести в отдельные файлы. Ключевую роль в этом решении играет параметр
assetsInlineLimit.
assetsInlineLimit определяет максимальный размер файла
(в байтах), при котором ресурс преобразуется в Data URL и встраивается
прямо в итоговый бандл.
Логика обработки выглядит следующим образом:
dist/assets)По умолчанию значение равно:
assetsInlineLimit: 4096
то есть 4 KB.
При импорте файла внутри Jav * aScript:
import logo from './logo.png'
Vite выполняет трансформацию в зависимости от размера файла.
Если файл маленький:
const logo = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUg..."
В результате:
Если файл превышает лимит:
const logo = "/assets/logo.8d3a9f2c.png"
В результате:
dist/assetsМеханизм применяется ко всем типам ассетов, которые обрабатываются Vite как статические:
png, jpg, webp,
gif, svg)woff, woff2, ttf,
otf)mp4, mp3, wav)Важно понимать, что обработка зависит не только от расширения, но и от внутренних правил Rollup/Vite.
Инлайнинг даёт выгоды в определённых сценариях:
Особенно эффективно для:
Инлайнинг имеет обратную сторону:
При большом количестве base64-строк браузеру приходится дополнительно декодировать данные.
Параметр задаётся в конфигурации Vite:
// vite.config.js
export default {
build: {
assetsInlineLimit: 4096
}
}
Можно полностью отключить инлайнинг:
export default {
build: {
assetsInlineLimit: 0
}
}
или, наоборот, увеличить порог:
export default {
build: {
assetsInlineLimit: 8192
}
}
Выбор значения зависит от характера проекта.
Используется когда:
Подходит для:
Используется по умолчанию и является компромиссом:
Используется в случаях:
При использовании ресурсов внутри CSS:
.background {
background-image: url('./icon.svg');
}
Vite применяет ту же логику:
data:image/svg+xml,...Это особенно важно для SVG, так как они часто бывают очень маленькими и хорошо подходят для инлайна.
Если ресурс не инлайнится, он попадает в систему ассетов Vite:
Пример итогового пути:
/assets/logo.3f8a91c2.png
Инлайновые ресурсы не участвуют в хешировании, поскольку не существуют как отдельные файлы.
В режиме разработки:
Поведение максимально приближено к production-сборке, но без генерации артефактов.
Позволяет дополнительно указать типы файлов, которые должны
обрабатываться как ассеты. Влияет на то, какие файлы вообще попадают под
логику assetsInlineLimit.
Определяет, куда будут складываться НЕинлайненные ресурсы:
assetFileNames: 'assets/[name].[hash][extname]'
assetsInlineLimit решает, попадёт ли файл в эту систему
вообще.
Приводит к:
Приводит к:
Не все ресурсы одинаково полезны для инлайна:
Vite поддерживает модификаторы импорта:
import url from './image.png?url'
import raw from './file.txt?raw'
import base64 from './image.png?base64'
Однако assetsInlineLimit влияет только на стандартный
режим импорта без явного указания стратегии. При ?url
ресурс всегда становится файлом, независимо от лимита.
Использование assetsInlineLimit напрямую влияет на:
В приложениях с высокой чувствительностью к времени загрузки обычно применяется гибридный подход:
Часто используют повышенный лимит для уменьшения количества запросов:
Часто снижают лимит:
Используется стандартный лимит:
Механизм можно свести к простой модели:
если size ≤ assetsInlineLimit → data URL
если size > assetsInlineLimit → отдельный файл
Но практическая настройка всегда зависит от профиля нагрузки приложения, структуры ассетов и требований к кешированию.