Бэкэнд Интеграция 
Note
Если вы хотите обслуживать HTML, используя традиционную бэкэнд (например, Rails, Laravel), но используйте Vite для обслуживания активов, проверьте существующие интеграции, перечисленные в Awesome Vite .
Если вам нужна пользовательская интеграция, вы можете выполнить шаги в этом руководстве, чтобы настроить ее вручную
В конфигурации Vite настройте вход и включите манифест сборки:
jsimport {defineConfig} from 'vite' // ---резать--- export defaultdefineConfig({server: {cors: { // Происхождение, которое вы будете получать через браузерorigin: 'http://my-backend.example.com', }, },build: { // генерировать .vite/manifest.json в Outdirmanifest: true,rollupOptions: { // перезаписать дефолт .html entryinput: '/path/to/main.js', }, }, })Если вы не отключили многофилль модуля , вам также необходимо импортировать полифилл в своем входе
js// Добавьте начало записи приложения import 'vite/modulepreload-polyfill'Для разработки, введите следующее в HTML -шаблон вашего сервера (замените
http://localhost:5173с локальным URL -Vite, который работает на):html<!-- if development --> <script type="module" src="http://localhost:5173/@vite/client"></script> <script type="module" src="http://localhost:5173/main.js"></script>Чтобы правильно обслуживать активы, у вас есть два варианта:
- Убедитесь, что сервер настроен на запросы прокси -статических активов на сервер VITE
 - Установите 
server.originтак, чтобы сгенерированные URL-адреса актива будут разрешены с использованием URL-адреса сервера по сравнению 
Это необходимо для активов, таких как изображения для правильной загрузки.
Примечание, если вы используете React с
@vitejs/plugin-react, вам также необходимо добавить это перед вышеупомянутыми сценариями, поскольку плагин не может изменить HTML, который вы обслуживаете (заменитеhttp://localhost:5173с локальным URL Vite.html<script type="module"> import RefreshRuntime from 'http://localhost:5173/@react-refresh' RefreshRuntime.injectIntoGlobalHook(window) window.$RefreshReg$ = () => {} window.$RefreshSig$ = () => (type) => type window.__vite_plugin_react_preamble_installed__ = true </script>Для производства: после запуска
vite buildфайл.vite/manifest.jsonбудет сгенерирован вместе с другими файлами активов. Пример манифестного файла выглядит следующим образом:json{ "_shared-B7PI925R.js": { "file": "assets/shared-B7PI925R.js", "name": "shared", "css": ["assets/shared-ChJ_j-JJ.css"] }, "_shared-ChJ_j-JJ.css": { "file": "assets/shared-ChJ_j-JJ.css", "src": "_shared-ChJ_j-JJ.css" }, "baz.js": { "file": "assets/baz-B2H3sXNv.js", "name": "baz", "src": "baz.js", "isDynamicEntry": true }, "views/bar.js": { "file": "assets/bar-gkvgaI9m.js", "name": "bar", "src": "views/bar.js", "isEntry": true, "imports": ["_shared-B7PI925R.js"], "dynamicImports": ["baz.js"] }, "views/foo.js": { "file": "assets/foo-BRBmoGS9.js", "name": "foo", "src": "views/foo.js", "isEntry": true, "imports": ["_shared-B7PI925R.js"], "css": ["assets/foo-5UjPuW-k.css"] } }- Манифест имеет структуру 
Record<name, chunk> - Для въезда или динамических кусков входа ключом является относительный путь SRC от Project Root.
 - Для не входных кусков ключ является базовым именем сгенерированного файла, префиксированного 
_. - Для файла CSS, сгенерированного, когда 
build.cssCodeSplitравенfalse, ключ составляетstyle.css. - Куски будут содержать информацию о его статическом и динамическом импорте (оба являются ключами, которые отображают соответствующий кусок в манифесте), а также соответствующие файлы CSS и активы (если таковые имеются).
 
- Манифест имеет структуру 
 Вы можете использовать этот файл для рендеринга ссылок или директив предварительной нагрузки с хешированными именами файлов.
Вот пример HTML -шаблон, чтобы отобразить правильные ссылки. Синтаксис здесь для только объяснение, замените языком шаблона вашего сервера.
importedChunksФункция предназначена для иллюстрации и не предоставлена Vite.html<!-- if production --> <!-- for cssFile of manifest[name].css --> <link rel="stylesheet" href="/{{ cssFile }}" /> <!-- for chunk of importedChunks(manifest, name) --> <!-- for cssFile of chunk.css --> <link rel="stylesheet" href="/{{ cssFile }}" /> <script type="module" src="/{{ manifest[name].file }}"></script> <!-- for chunk of importedChunks(manifest, name) --> <link rel="modulepreload" href="/{{ chunk.file }}" />В частности, бэкэнд, генерирующая HTML, должна включать следующие теги, учитывая манифест Файл и точка записи:
- Тег 
<link rel="stylesheet">для каждого файла в спискеcssточки входа. - Рекурсивно следить за всеми кусками в списке 
importsи включите<link rel="stylesheet">тег для каждого файла CSS каждого импортируемого куски. - Тег для ключа 
fileотчатка точки входа (<script type="module">для JavaScript, или<link rel="stylesheet">для CSS) - Необязательно, 
<link rel="modulepreload">тег дляfileкаждого импортированного JavaScript кусок, снова рекурсивно после импорта, начиная с чанка точки входа. 
После приведенного выше примера Manifest для точки входа
views/foo.jsСледующие теги должны быть включены в производство:html<link rel="stylesheet" href="assets/foo-5UjPuW-k.css" /> <link rel="stylesheet" href="assets/shared-ChJ_j-JJ.css" /> <script type="module" src="assets/foo-BRBmoGS9.js"></script> <!-- optional --> <link rel="modulepreload" href="assets/shared-B7PI925R.js" />В то время как следующее должно быть включено для точки входа
views/bar.js:html<link rel="stylesheet" href="assets/shared-ChJ_j-JJ.css" /> <script type="module" src="assets/bar-gkvgaI9m.js"></script> <!-- optional --> <link rel="modulepreload" href="assets/shared-B7PI925R.js" />Pseudo implementation of
importedChunksПример псевдо реализации
importedChunksв TypeScript (это будет Нужно быть адаптировано для вашего языка программирования и языка шаблона):tsimport type { Manifest, ManifestChunk } from 'vite' export default function importedChunks( manifest: Manifest, name: string, ): ManifestChunk[] { const seen = new Set<string>() function getImportedChunks(chunk: ManifestChunk): ManifestChunk[] { const chunks: ManifestChunk[] = [] for (const file of chunk.imports ?? []) { const importee = manifest[file] if (seen.has(file)) { continue } seen.add(file) chunks.push(...getImportedChunks(importee)) chunks.push(importee) } return chunks } return getImportedChunks(manifest[name]) }- Тег