В экосистеме Vite директория public представляет собой
механизм работы со статическими файлами, которые должны быть доступны
приложению без обработки сборщиком. Эти файлы не проходят трансформацию,
не участвуют в графе модулей и копируются в итоговую сборку в неизменном
виде.
Главная особенность заключается в том, что содержимое
public обслуживается напрямую сервером разработки и
переносится в корень билд-вывода без модификаций.
При запуске проекта через Vite:
public доступны по абсолютному путиФактически Vite рассматривает public как статический
корень, аналогичный директории static в других
инструментах.
Пример структуры:
project/
public/
favicon.ico
robots.txt
images/
logo.png
src/
main.js
Файл public/favicon.ico будет доступен по адресу:
/favicon.ico
Ключевое различие между public и ресурсами внутри
src заключается в способе обработки.
Пример:
import logo from './assets/logo.png'
Пример использования:
<img src="/images/logo.png" />
Директория public предназначена для файлов, которые
должны сохранять исходное состояние и быть доступны напрямую.
Типичные сценарии:
Если путь к ресурсу должен оставаться неизменным независимо от
сборки, используется public.
Пример:
/config/runtime.json
Этот файл можно запрашивать напрямую:
fetch('/config/runtime.json')
Иногда требуется разместить:
Vite dev server обслуживает public как статический
каталог на корне сервера.
Особенности:
/publicПример:
public/data/sample.json
Доступ:
http://localhost:5173/data/sample.json
При выполнении сборки (vite build) содержимое
public:
dist)Пример результата:
dist/
index.html
assets/
images/
logo.png
robots.txt
Файл public/robots.txt станет
dist/robots.txt.
Использование public накладывает ряд ограничений,
связанных с отсутствием обработки.
Файлы:
Нельзя использовать:
import data from '/data.json'
Такой подход не работает через систему модулей Vite.
Vite не отслеживает:
Все файлы из public доступны только через абсолютный
путь от корня сайта.
Пример:
public/images/icon.png
Доступ:
/images/icon.png
Использование относительных путей:
<img src="images/icon.png" />
может привести к ошибкам при вложенной маршрутизации.
При настройке base в vite.config.js
поведение public корректируется.
Пример:
export default {
base: '/app/'
}
В этом случае:
public/logo.png
будет доступен как:
/app/logo.png
Все ресурсы автоматически учитывают базовый путь приложения.
Файлы из public часто используются напрямую в
index.html.
Пример:
<link rel="icon" href="/favicon.ico" />
или
<script src="/config/runtime.js"></script>
Важно учитывать, что такие пути должны быть абсолютными.
Директория public может содержать JSON или
конфигурационные файлы, которые загружаются во время выполнения
приложения.
Пример:
async function loadConfig() {
const res = await fetch('/config/app.json')
return await res.json()
}
Это позволяет отделять конфигурацию от кода сборки.
Так как файлы в public не получают хеши, контроль
кеширования осуществляется через серверные заголовки.
Типичные подходы:
Пример:
logo.v2.png
Все файлы в public становятся публично доступными через
HTTP.
Следствия:
import data from '/data.json'
Ошибка, так как public не является модульной
системой.
<img src="images/logo.png" />
Проблема возникает при переходах между роутами.
Иногда файл одновременно размещают в src/assets и
public, что приводит к:
В приложениях с клиентским роутингом важно учитывать, что
public всегда резолвится от корня.
Пример проблемы:
/user/profile
Если используется:
<img src="avatar.png" />
браузер попытается загрузить:
/user/avatar.png
Правильный вариант:
<img src="/avatar.png" />
Рациональное использование public предполагает
разделение ответственности:
src/assets — управляемые ресурсы, проходящие через
сборкуpublic — статические файлы без обработкиТакой подход снижает риски неконтролируемого роста статических ресурсов и упрощает предсказуемость сборки