Параметр build.target определяет, в какой стандарт
JavaScript и какие браузеры должен компилироваться итоговый код
приложения. От этого зависит:
По умолчанию Vite ориентируется на современные браузеры с поддержкой ES-модулей. Однако во многих проектах требуется явно задавать целевую среду.
Базовый пример:
// vite.config.js
import { defineConfig } from 'vite'
export default defineConfig({
build: {
target: 'es2015'
}
})
В данном случае итоговый код будет преобразован под стандарт ECMAScript 2015.
targetНаиболее распространённый вариант:
build: {
target: 'es2017'
}
Популярные значения:
| Значение | Описание |
|---|---|
es2015 |
Поддержка старых браузеров |
es2016 |
Включает Array.includes() |
es2017 |
Async/await |
es2018 |
Асинхронные итераторы |
es2019 |
flat(), flatMap() |
es2020 |
Optional chaining, nullish coalescing |
es2021 |
Logical assignment |
es2022 |
Top-level await |
esnext |
Без транспиляции современных возможностей |
esnextРежим esnext отключает большинство преобразований.
build: {
target: 'esnext'
}
Особенности:
Такой режим часто используется:
Vite позволяет задавать список конкретных браузеров.
build: {
target: ['chrome90', 'firefox88']
}
Пример:
build: {
target: [
'chrome87',
'edge88',
'firefox78',
'safari13'
]
}
В этом случае esbuild будет ориентироваться именно на указанные браузеры.
target влияет на
кодИсходный код:
const title = user?.profile?.name ?? 'Guest'
При современном target:
build: {
target: 'es2020'
}
код практически не изменится.
При старом target:
build: {
target: 'es2015'
}
optional chaining и nullish coalescing будут преобразованы в более совместимый код.
Чем современнее target:
Например:
build: {
target: 'esnext'
}
может дать существенно меньший бандл, чем:
build: {
target: 'es2015'
}
поскольку старые конструкции требуют дополнительных преобразований.
targetПараметр target:
Например:
Array.prototype.flatMap
Promise.any
fetch
не будут автоматически полифилиться.
Для поддержки таких возможностей используются:
core-js;@vitejs/plugin-legacy;@vitejs/plugin-legacyДля старых браузеров одного target недостаточно.
Пример:
npm install @vitejs/plugin-legacy
Конфигурация:
import { defineConfig } from 'vite'
import legacy from '@vitejs/plugin-legacy'
export default defineConfig({
plugins: [
legacy({
targets: ['defaults', 'not IE 11']
})
]
})
Плагин:
build.outDiroutDir определяет директорию, в которую будет записана
итоговая сборка.
По умолчанию:
dist
Базовый пример:
build: {
outDir: 'build'
}
После сборки структура будет выглядеть так:
project/
├─ build/
│ ├─ assets/
│ ├─ index.html
│ └─ ...
Можно указывать абсолютный путь:
build: {
outDir: '/var/www/project'
}
Однако чаще используются относительные директории внутри проекта.
Иногда проект генерирует несколько видов сборок.
Пример:
build: {
outDir: 'dist/client'
}
или:
build: {
outDir: 'dist/admin'
}
Это удобно:
Перед созданием новой сборки Vite автоматически очищает
outDir.
Пример:
build: {
outDir: 'dist'
}
Старая директория будет удалена перед записью новых файлов.
emptyOutDirАвтоматическую очистку можно отключить.
build: {
emptyOutDir: false
}
Это бывает полезно:
Если outDir находится вне корня проекта:
build: {
outDir: '../public'
}
Vite покажет предупреждение.
Это защита от случайного удаления файлов при очистке директории.
Очень распространён сценарий, когда сборка сразу складывается в backend-проект.
Пример для PHP:
build: {
outDir: '../public/assets'
}
или:
build: {
outDir: '../www/build'
}
Подобная схема активно используется:
build.assetsDirassetsDir определяет папку внутри outDir,
куда складываются статические ресурсы.
По умолчанию:
assets
Пример:
build: {
assetsDir: 'static'
}
Структура:
dist/
├─ static/
│ ├─ index-abc123.js
│ ├─ style-xyz456.css
│ └─ logo-123.png
└─ index.html
assetsDirОбычно туда помещаются:
Пример:
build: {
outDir: 'public',
assetsDir: 'resources'
}
Результат:
public/
├─ resources/
│ ├─ app.js
│ ├─ app.css
│ └─ ...
└─ index.html
Иногда требуется хранить файлы прямо в корне сборки.
build: {
assetsDir: ''
}
Тогда структура станет такой:
dist/
├─ app.js
├─ app.css
├─ logo.png
└─ index.html
Однако такой подход может привести:
assetsDir часто используется вместе с CDN.
Пример:
build: {
assetsDir: 'cdn'
}
или:
build: {
assetsDir: 'static/assets'
}
Это позволяет организовать структуру файлов под инфраструктуру сервера.
outDir и
assetsDirassetsDir всегда считается относительно
outDir.
Пример:
build: {
outDir: 'build',
assetsDir: 'files'
}
Результат:
build/
├─ files/
│ ├─ app.js
│ └─ style.css
└─ index.html
Типичная production-конфигурация:
import { defineConfig } from 'vite'
export default defineConfig({
build: {
target: 'es2018',
outDir: 'dist',
assetsDir: 'assets'
}
})
import { defineConfig } from 'vite'
export default defineConfig({
build: {
target: 'es2015',
outDir: 'build',
assetsDir: 'static'
}
})
import { defineConfig } from 'vite'
export default defineConfig({
build: {
target: 'esnext',
outDir: 'release',
assetsDir: 'bundle'
}
})
import { defineConfig } from 'vite'
export default defineConfig({
build: {
target: 'es2017',
outDir: '../public/build',
assetsDir: 'assets'
}
})
targettarget: 'es5'
Vite не ориентирован на полноценную поддержку ES5.
Для старых браузеров рекомендуется использовать:
@vitejs/plugin-legacy;Даже при:
target: 'es2015'
некоторые API могут не работать без полифилов.
Ошибочная конфигурация:
build: {
outDir: '/',
}
или:
build: {
outDir: '../'
}
может привести к удалению лишних файлов при очистке директории.
build: {
target: 'es2020'
}
build: {
target: 'es2015'
}
вместе с:
@vitejs/plugin-legacy
build: {
target: 'chrome120'
}
build: {
target: 'esnext'
}
import { defineConfig } from 'vite'
export default defineConfig({
build: {
target: 'es2018',
outDir: 'dist',
assetsDir: 'assets',
emptyOutDir: true
}
})
Такая конфигурация: