Опция build.minify управляет минификацией итогового
production-бандла в Vite. Минификация уменьшает размер JavaScript-кода,
удаляет лишние пробелы, комментарии, сокращает имена локальных
переменных и делает выходные файлы компактнее.
Настройка располагается внутри секции build:
import { defineConfig } from 'vite'
export default defineConfig({
build: {
minify: 'esbuild'
}
})
Поддерживаются три основных значения:
minify: 'esbuild'
minify: 'terser'
minify: false
Каждый вариант имеет собственные особенности производительности, совместимости и качества сжатия.
minify: 'esbuild'esbuild — минификатор по умолчанию в Vite. Он
обеспечивает очень высокую скорость сборки и хорошее качество
сжатия.
Пример:
import { defineConfig } from 'vite'
export default defineConfig({
build: {
minify: 'esbuild'
}
})
Эквивалентная запись:
build: {
minify: true
}
По умолчанию Vite автоматически использует esbuild.
esbuildГлавное преимущество — производительность.
Даже крупные проекты собираются значительно быстрее по сравнению с
terser.
Особенно заметна разница:
esbuild написан на Go и работает крайне эффективно:
Vite глубоко интегрирован с esbuild:
Это уменьшает количество внешних зависимостей.
esbuild при минификацииВо время production-сборки:
function sum(a, b) {
return a + b
}
console.log(sum(10, 20))
превращается в:
function o(n,r){return n+r}console.log(o(10,20));
Удаляются:
esbuildНесмотря на скорость, esbuild уступает
terser по глубине оптимизации.
Иногда итоговый bundle:
У esbuild нет такого количества параметров минификации,
как у terser.
Например, нельзя гибко настраивать:
esbuildesbuild подходит в большинстве случаев:
Чаще всего именно этот вариант используется в production.
minify: 'terser'terserterser не входит в Vite автоматически. Его необходимо
установить отдельно.
npm install terser -D
После этого можно включить минификацию:
import { defineConfig } from 'vite'
export default defineConfig({
build: {
minify: 'terser'
}
})
terserterser — классический JavaScript-минификатор,
используемый во многих bundler’ах:
Он медленнее esbuild, но обеспечивает более агрессивное
сжатие.
В крупных проектах terser иногда уменьшает размер
итогового файла на несколько процентов сильнее.
Особенно это заметно:
Главное преимущество terser — огромное количество
опций.
Пример:
import { defineConfig } from 'vite'
export default defineConfig({
build: {
minify: 'terser',
terserOptions: {
compress: {
drop_console: true,
drop_debugger: true
},
mangle: true
}
}
})
terserOptionsconsole.logterserOptions: {
compress: {
drop_console: true
}
}
Исходный код:
console.log('debug')
После сборки:
// код удалён
debuggerterserOptions: {
compress: {
drop_debugger: true
}
}
Исходный код:
debugger
После сборки:
// код удалён
Иногда framework или библиотека завязаны на имя функции.
Тогда используется:
terserOptions: {
keep_fnames: true
}
terserOptions: {
keep_classnames: true
}
Полезно:
terserOptions: {
compress: {
passes: 3
}
}
Чем больше passes, тем агрессивнее оптимизация, но тем
медленнее сборка.
terserOptions: {
compress: {
pure_funcs: ['console.log']
}
}
Позволяет удалять вызовы функций, считающихся не влияющими на результат выполнения.
terserterser оправдан:
terserОсновная проблема — скорость.
В крупных проектах разница может быть очень заметной:
esbuild — секундыterser — десятки секундterser значительно тяжелее:
Необходимо вручную устанавливать пакет:
npm install terser -D
minify: falseimport { defineConfig } from 'vite'
export default defineConfig({
build: {
minify: false
}
})
В этом режиме Vite не минимизирует итоговый код.
Исходный код:
function calculatePrice(price, tax) {
return price + tax
}
console.log(calculatePrice(100, 20))
После build:
function calculatePrice(price, tax) {
return price + tax;
}
console.log(calculatePrice(100, 20));
Код остаётся читаемым.
Иногда требуется:
Без минификации:
Иногда библиотеки публикуют:
Пример структуры:
dist/
library.js
library.min.js
Bundle может увеличиться в несколько раз.
Увеличивается:
Большие файлы менее эффективны для distributed delivery.
esbuild, terser и false| Параметр | esbuild | terser | false |
|---|---|---|---|
| Скорость | Очень высокая | Низкая | Максимальная |
| Размер bundle | Хороший | Лучший | Очень большой |
| Настраиваемость | Минимальная | Очень высокая | Нет |
| Потребление RAM | Низкое | Высокое | Низкое |
| Подходит для production | Да | Да | Обычно нет |
| Удаление console.log | Нет | Да | Нет |
| Дополнительная установка | Нет | Да | Нет |
Минификация часто комбинируется с sourcemaps:
export default defineConfig({
build: {
minify: 'esbuild',
sourcemap: true
}
})
Это позволяет:
terser и
sourcemapexport default defineConfig({
build: {
minify: 'terser',
sourcemap: true,
terserOptions: {
compress: {
drop_console: true
}
}
}
})
Типичная production-конфигурация.
build.minify влияет не только на JavaScript, но и на
CSS.
Пример:
.container {
padding: 20px;
margin: 10px;
}
После минификации:
.container{padding:20px;margin:10px}
Минификация тесно связана с tree shaking.
После удаления неиспользуемого кода минификатор дополнительно:
export default defineConfig({
build: {
minify: 'esbuild'
}
})
export default defineConfig({
build: {
minify: 'terser',
terserOptions: {
compress: {
drop_console: true,
drop_debugger: true
}
}
}
})
export default defineConfig({
build: {
minify: false,
sourcemap: true
}
})
terser без установки пакетаОшибка:
terser not found
Решение:
npm install terser -D
console.log через esbuildesbuild в Vite не предоставляет полноценного
аналога:
drop_console: true
Для подобных задач обычно используют terser.
Причина часто связана с:
minify: 'terser'
Особенно в больших проектах.
Минифицированный код без sourcemap сложно анализировать при production-ошибках.
minify: 'esbuild'
Оптимальный баланс:
minify: 'terser'
Позволяет добиться максимального сжатия.
minify: false
Удобно для: