При развертывании Vite-приложения в поддиректории сайта ключевую роль
играет параметр base в конфигурации сборщика. Этот параметр
определяет базовый публичный путь, с которого будут загружаться все
ресурсы приложения: JavaScript-бандлы, стили, изображения и динамические
чанки.
В файле vite.config.js параметр base
задаётся на уровне экспорта конфигурации:
import { defineConfig } from 'vite';
export default defineConfig({
base: '/app/',
});
Значение /app/ означает, что приложение будет развёрнуто
не в корне домена, а по адресу:
https://example.com/app/
Без корректного указания base все ассеты будут ссылаться
на корень домена, что приводит к 404 при загрузке скриптов и стилей в
поддиректории.
base
внутри сборкиВо время сборки Vite подставляет значение base в
следующие элементы:
<script src>)import()publicimport.meta.env.BASE_URLПример:
const url = import.meta.env.BASE_URL + 'images/logo.png';
Если base = '/app/', итоговый URL будет:
/app/images/logo.png
В режиме разработки (vite dev) параметр
base практически не влияет на маршрутизацию сервера
разработки. Dev-сервер всегда обслуживает приложение из корня
(/), чтобы упростить HMR и работу модулей.
Однако в production-сборке (vite build)
base становится критически важным, так как все пути
фиксируются на этапе бандлинга.
Vite поддерживает относительное значение base:
export default defineConfig({
base: './',
});
Такой режим используется, когда приложение должно работать:
file://В этом случае пути к ресурсам становятся относительными:
./assets/index-xxxx.js
Однако относительный base может ломать некоторые
сценарии роутинга и загрузки чанков при сложной структуре
приложения.
При использовании клиентского роутинга (Vue Router, React Router)
необходимо синхронизировать base Vite и базовый путь
роутера.
import { createRouter, createWebHistory } from 'vue-router';
export const router = createRouter({
history: createWebHistory('/app/'),
routes: [],
});
Здесь важно, чтобы путь совпадал с vite.config.js:
base: '/app/'
Несоответствие приводит к:
import { BrowserRouter } from 'react-router-dom';
<BrowserRouter basename="/app/">
<App />
</BrowserRouter>
import.meta.env.BASE_URLVite автоматически прокидывает значение base в
переменную окружения:
console.log(import.meta.env.BASE_URL);
Это позволяет строить корректные пути к ресурсам без хардкода:
function getAsset(path) {
return import.meta.env.BASE_URL + path;
}
Пример использования:
const avatar = getAsset('images/avatar.png');
public и baseФайлы из public копируются в корень сборки без
обработки. Их путь зависит от base.
Структура:
public/
logo.png
Использование:
<img src="/logo.png" />
При base = '/app/' Vite преобразует это в:
/app/logo.png
Ошибка возникает, если путь прописан как абсолютный без учёта base:
<img src="/logo.png" />
в контексте неправильного деплоя может привести к загрузке из корня домена.
Часто значение base зависит от окружения:
export default defineConfig(({ mode }) => {
return {
base: mode === 'production' ? '/app/' : '/',
};
});
Это позволяет:
Для GitHub Pages типичный сценарий:
export default defineConfig({
base: '/repository-name/',
});
Так как GitHub Pages обслуживает проект из поддиректории:
https://username.github.io/repository-name/
Без правильного base приложение будет пытаться загрузить
ресурсы из:
https://username.github.io/assets/...
вместо:
https://username.github.io/repository-name/assets/...
При использовании CDN base может указывать на внешний
домен:
export default defineConfig({
base: 'https://cdn.example.com/app/',
});
В этом случае все ассеты будут загружаться с CDN, включая чанки и статические ресурсы.
Если:
base: '/app/'
но:
createWebHistory('/')
возникает рассинхронизация маршрутов и ассетов.
<img src="/images/logo.png" />
Такие пути игнорируют base при неправильной настройке и
ломаются в поддиректориях.
Неверно:
base: '/app'
Правильно:
base: '/app/'
Отсутствие завершающего слэша может приводить к некорректной генерации относительных URL.
При динамическом импорте:
const module = await import('./module.js');
Vite формирует URL чанка с учётом base. Если base задан
неверно, браузер не сможет загрузить файл чанка, даже если основной
бандл работает корректно.
base на уровне инфраструктуры
деплояimport.meta.env.BASE_URLПосле vite build необходимо анализировать:
index.htmldist/assetsОсобое внимание требуется SPA-приложениям, где неправильный base проявляется только при перезагрузке страницы или прямом заходе по ссылке.