Skip to content

Здание для производства

Когда пришло время развернуть ваше приложение для производства, просто запустите команду vite build . По умолчанию он использует <root>/index.html в качестве точки ввода сборки и производит пакет приложений, который подходит для обслуживания статического хостинга. Проверьте развертывание статического сайта для руководств по популярным услугам.

Совместимость Браузера

По умолчанию производственный пакет предполагает поддержку современного JavaScript, таких как Native ES -модули , Native ESM Dynamic Import , import.meta , Nullish Coalescing и Bigint . Диапазон поддержки браузера по умолчанию:

  • Chrome> = 87
  • Firefox> = 78
  • Сафари> = 14
  • Край> = 88

Вы можете указать пользовательские цели с помощью опции build.target конфигурации , где самая низкая цель составляет es2015 . Если установлена более низкая цель, VITE по -прежнему потребует этих минимальных диапазонов поддержки браузеров, поскольку он полагается на естественный динамический импорт ESM , и import.meta :

  • Chrome> = 64
  • Firefox> = 67
  • Сафари> = 11,1
  • Край> = 79

Обратите внимание, что по умолчанию Vite обрабатывает только синтаксические преобразования и не покрывает многофиллы . Вы можете проверить https://cdnjs.cloudflare.com/polyfill/ , которые автоматически генерируют полифильные пакеты на основе строки пользователя пользователя.

Наследие браузеры могут быть поддержаны через @vitejs/плагин-leagcy , который автоматически генерирует устаревшие куски и соответствующие полифиллы ES языка. Наследие кусочки условно загружаются только в браузерах, которые не имеют собственной поддержки ESM.

Общественный Базовый Путь

Если вы развертываете свой проект по вложенному общественному пути, просто укажите опцию base конфигурации , и все пути активов будут соответственно переписаны. Эта опция также может быть указана как флаг командной строки, например, vite build --base=/my/public/path/ .

У URL-адреса активов JS-импорта, ссылки на CSS url() и ссылки на активы в ваших .html файлах автоматически регулируются для уважения этой опции во время сборки.

Исключение - когда вам нужно динамически объединять URL -адреса на лету. В этом случае вы можете использовать переменную, введенную в глобально введении import.meta.env.BASE_URL , которая станет общедоступным базовым путем. Примечание. Эта переменная статически заменяется во время сборки, поэтому она должна появляться точно так же, как (т.е. import.meta.env['BASE_URL'] не будет работать).

Для управления расширенным базовым путем ознакомьтесь с расширенными базовыми параметрами .

Относительная база

Если вы не знаете базовый путь заранее, вы можете установить относительный базовый путь с "base": "./" или "base": "" . Это сделает все сгенерированные URL -адреса относительно каждого файла.

Support for older browsers when using relative bases

import.meta Поддержка требуется для относительных баз. Если вам нужно поддерживать браузеры, которые не поддерживают import.meta , вы можете использовать legacy плагина .

Настройка сборки

Сборка может быть настроена с помощью различных параметров конфигурации сборки . В частности, вы можете напрямую отрегулировать базовые параметры обмолота через build.rollupOptions :

vite.config.js
js
export default defineConfig({
  build: {
    rollupOptions: {
      // https://rollupjs.org/configuration-options/
    },
  },
})

Например, вы можете указать несколько выходов на зачтении с плагинами, которые применяются только во время сборки.

Стратегия Поднятия

Вы можете настроить, как разбиты куски с помощью build.rollupOptions.output.manualChunks (см. Dollup Docs ). Если вы используете структуру, обратитесь к их документации для настройки того, как разделены куски.

Обработка Ошибок Загрузки

VITE издает vite:preloadError события, когда он не загружает динамический импорт. event.payload содержит исходную ошибку импорта. Если вы позвоните event.preventDefault() , ошибка не будет выброшена.

js
window
.
addEventListener
('vite:preloadError', (
event
) => {
window
.
location
.
reload
() // Например, обновить страницу
})

Когда происходит новое развертывание, служба хостинга может удалить активы из предыдущих развертываний. В результате пользователь, который посетил ваш сайт до того, как новое развертывание может столкнуться с ошибкой импорта. Эта ошибка происходит потому, что активы, работающие на устройстве этого пользователя, устарели, и она пытается импортировать соответствующий старый кусок, который удаляется. Это событие полезно для решения этой ситуации.

Восстановление Изменений В Файлах

Вы можете включить Watcher Watcher с vite build --watch . Или вы можете напрямую отрегулировать базовый WatcherOptions через build.watch :

vite.config.js
js
export default defineConfig({
  build: {
    watch: {
      // https://rollupjs.org/configuration-options/#watch
    },
  },
})

С включенным флагом --watch , изменения в vite.config.js , а также любые файлы, которые должны быть связаны, запускают восстановление.

Многостраничное Приложение

Предположим, у вас есть следующая структура исходного кода:

├── package.json
├── vite.config.js
├── index.html
├── main.js
└── nested
    ├── index.html
    └── nested.js

Во время DEV просто перейдите или ссылку на /nested/ - он работает как ожидалось, как и для обычного статического файлового сервера.

Во время сборки все, что вам нужно сделать, это указать несколько файлов .html в качестве точек входа:

vite.config.js
js
import { 
dirname
,
resolve
} from 'node:path'
import {
fileURLToPath
} from 'node:url'
import {
defineConfig
} from 'vite'
const
__dirname
=
dirname
(
fileURLToPath
(import.meta.
url
))
export default
defineConfig
({
build
: {
rollupOptions
: {
input
: {
main
:
resolve
(
__dirname
, 'index.html'),
nested
:
resolve
(
__dirname
, 'nested/index.html'),
}, }, }, })

Если вы указали другой корень, помните, что __dirname все равно будет папкой вашего файла Vite.config.js при разрешении входных путей. Поэтому вам нужно будет добавить свою root запись в аргументы за resolve .

Обратите внимание, что для файлов HTML VITE игнорирует имя, приведенное в запись в объекте rollupOptions.input и вместо этого уважает разрешенный идентификатор файла при генерации актива HTML в папке Dist. Это обеспечивает постоянную структуру с тем, как работает Dev Server.

Библиотечный Режим

Когда вы разрабатываете библиотеку, ориентированную на браузер, вы, вероятно, тратите большую часть времени на странице тестирования/демонстрации, которая импортирует вашу реальную библиотеку. С помощью Vite вы можете использовать свой index.html для этой цели, чтобы получить плавную разработку.

Когда пришло время объединить библиотеку для распространения, используйте параметр build.lib конфигурации . Убедитесь, что также выводите все зависимости, которые вы не хотите вмешиваться в свою библиотеку, например, vue или react :

js
import { 
dirname
,
resolve
} from 'node:path'
import {
fileURLToPath
} from 'node:url'
import {
defineConfig
} from 'vite'
const
__dirname
=
dirname
(
fileURLToPath
(import.meta.
url
))
export default
defineConfig
({
build
: {
lib
: {
entry
:
resolve
(
__dirname
, 'lib/main.js'),
name
: 'MyLib',
// Правильные расширения будут добавлены
fileName
: 'my-lib',
},
rollupOptions
: {
// Обязательно вытекайте DEPS, которые не должны быть связаны // в вашу библиотеку
external
: ['vue'],
output
: {
// Предоставьте глобальные переменные для использования в сборке UMD // Для внешних деп
globals
: {
vue
: 'Vue',
}, }, }, }, })
js
import { 
dirname
,
resolve
} from 'node:path'
import {
fileURLToPath
} from 'node:url'
import {
defineConfig
} from 'vite'
const
__dirname
=
dirname
(
fileURLToPath
(import.meta.
url
))
export default
defineConfig
({
build
: {
lib
: {
entry
: {
'my-lib':
resolve
(
__dirname
, 'lib/main.js'),
secondary
:
resolve
(
__dirname
, 'lib/secondary.js'),
},
name
: 'MyLib',
},
rollupOptions
: {
// Обязательно вытекайте DEPS, которые не должны быть связаны // в вашу библиотеку
external
: ['vue'],
output
: {
// Предоставьте глобальные переменные для использования в сборке UMD // Для внешних деп
globals
: {
vue
: 'Vue',
}, }, }, }, })

Файл входа будет содержать экспорт, который может быть импортирован пользователями вашего пакета:

lib/main.js
js
import Foo from './Foo.vue'
import Bar from './Bar.vue'
export { Foo, Bar }

Запуск vite build с помощью этой конфигурации использует предварительную установку в ролике, которая ориентирована на доставку библиотек и создает два формата пакета:

  • es и umd (для одиночной записи)
  • es и cjs (для нескольких записей)

Форматы могут быть настроены с опцией build.lib.formats .

$ vite build
building for production...
dist/my-lib.js      0.08 kB / gzip: 0.07 kB
dist/my-lib.umd.cjs 0.30 kB / gzip: 0.16 kB

Рекомендуется package.json для вашей LIB:

json
{
  "name": "my-lib",
  "type": "module",
  "files": ["dist"],
  "main": "./dist/my-lib.umd.cjs",
  "module": "./dist/my-lib.js",
  "exports": {
    ".": {
      "import": "./dist/my-lib.js",
      "require": "./dist/my-lib.umd.cjs"
    }
  }
}
json
{
  "name": "my-lib",
  "type": "module",
  "files": ["dist"],
  "main": "./dist/my-lib.cjs",
  "module": "./dist/my-lib.js",
  "exports": {
    ".": {
      "import": "./dist/my-lib.js",
      "require": "./dist/my-lib.cjs"
    },
    "./secondary": {
      "import": "./dist/secondary.js",
      "require": "./dist/secondary.cjs"
    }
  }
}

Поддержка CSS

Если ваша библиотека импортирует какие -либо CSS, она будет в комплекте как один файл CSS, помимо встроенных файлов JS, например, dist/my-lib.css . Название по умолчанию на build.lib.fileName , но также может быть изменено с build.lib.cssFileName .

Вы можете экспортировать файл CSS в вашем package.json , который будет импортирован пользователями:

json
{
  "name": "my-lib",
  "type": "module",
  "files": ["dist"],
  "main": "./dist/my-lib.umd.cjs",
  "module": "./dist/my-lib.js",
  "exports": {
    ".": {
      "import": "./dist/my-lib.js",
      "require": "./dist/my-lib.umd.cjs"
    },
    "./style.css": "./dist/my-lib.css"
  }
}

File Extensions

Если package.json не содержит "type": "module" , VITE будет генерировать различные расширения файлов для совместимости Node.js. .js станет .mjs , а .cjs станут .js .

Environment Variables

В библиотечном режиме все import.meta.env.* использования статически заменены при создании для производства. Тем не менее, process.env.* использование не является, так что потребители вашей библиотеки могут динамически изменить его. Если это нежелательно, вы можете использовать define: { 'process.env.NODE_ENV': '"production"' } например, для статической замены их или использовать esm-env для лучшей совместимости с бундлерами и время забега.

Advanced Usage

Библиотечный режим включает в себя простую и самоуверенную конфигурацию для библиотек, ориентированных на браузер и JS Framework. Если вы создаете библиотеки без браузера или требуют расширенных потоков сборки, вы можете напрямую использовать Rollup или Esbuild .

Расширенные Базовые Варианты

WARNING

Эта функция экспериментальная. Дайте обратную связь .

Для расширенных вариантов использования развернутые активы и публичные файлы могут находиться в разных путях, например, для использования различных стратегий кэша. Пользователь может выбрать развертывание в трех разных путях:

  • Сгенерированные файлы HTML ввода (которые могут быть обработаны во время SSR)
  • Сгенерированные хэшируемые активы (JS, CSS и другие типы файлов, такие как изображения)
  • Скопированные публичные файлы

Единственной статической базы недостаточно в этих сценариях. VITE обеспечивает экспериментальную поддержку для расширенных базовых опций во время сборки, используя experimental.renderBuiltUrl .

ts
import type { UserConfig } from 'vite'
// Краттей-юнор
const 
config
: UserConfig = {
// --- Раньше ---
experimental
: {
renderBuiltUrl
(
filename
, {
hostType
}) {
if (
hostType
=== 'js') {
return {
runtime
: `window.__toCdnUrl(${
JSON
.
stringify
(
filename
)})` }
} else { return {
relative
: true }
} }, }, // --- Резать после --- }

Если хешированные активы и общедоступные файлы не развернуты вместе, параметры для каждой группы могут быть определены независимо, используя активы type включенный во второй context параметров, данного функции.

ts
import type { UserConfig } from 'vite'
import 
path
from 'node:path'
// Краттей-юнор const
config
: UserConfig = {
// --- Раньше ---
experimental
: {
renderBuiltUrl
(
filename
, {
hostId
,
hostType
,
type
}) {
if (
type
=== 'public') {
return 'https://www.domain.com/' +
filename
} else if (
path
.
extname
(
hostId
) === '.js') {
return {
runtime
: `window.__assetsPath(${
JSON
.
stringify
(
filename
)})`,
} } else { return 'https://cdn.domain.com/assets/' +
filename
} }, }, // --- Резать после --- }

Обратите внимание, что пройденное filename представляет собой декодированный URL, и если функция возвращает строку URL, она также должна быть декодирована. VITE будет автоматически обрабатывать кодирование при рендеринге URL -адреса. Если объект с runtime возвращается, кодирование следует обрабатывать самостоятельно, где это необходимо, поскольку код времени выполнения будет отображаться как есть.

Released under the MIT License. (dev)