Bun включает быстрый минификатор JavaScript и TypeScript который может уменьшить размеры бандлов на 80% или более (в зависимости от кодовой базы) и ускорить выполнение выходного кода. Минификатор выполняет десятки оптимизаций включая свертку констант устранение мертвого кода и преобразования синтаксиса. В отличие от других минификаторов минификатор Bun ускоряет работу bun build поскольку кода для печати меньше.
Использование CLI
Включить всю минификацию
Используйте флаг --minify для включения всех режимов минификации:
bun build ./index.ts --minify --outfile=out.jsФлаг --minify автоматически включает:
- Минификацию пробелов
- Минификацию синтаксиса
- Минификацию идентификаторов
Режим продакшена
Флаг --production автоматически включает минификацию:
bun build ./index.ts --production --outfile=out.jsФлаг --production также:
- Устанавливает
process.env.NODE_ENVвproduction - Включает JSX импорт и преобразование в режиме продакшена
Детальный контроль
Вы можете включить определенные режимы минификации по отдельности:
# Только удалить пробелы
bun build ./index.ts --minify-whitespace --outfile=out.js
# Только минифицировать синтаксис
bun build ./index.ts --minify-syntax --outfile=out.js
# Только минифицировать идентификаторы
bun build ./index.ts --minify-identifiers --outfile=out.js
# Комбинировать определенные режимы
bun build ./index.ts --minify-whitespace --minify-syntax --outfile=out.jsJavaScript API
При программном использовании бандлера Bun настройте минификацию через опцию minify:
await Bun.build({
entrypoints: ["./index.ts"],
outdir: "./out",
minify: true, // Включить все режимы минификации
});Для детального контроля передайте объект:
await Bun.build({
entrypoints: ["./index.ts"],
outdir: "./out",
minify: {
whitespace: true,
syntax: true,
identifiers: true,
},
});Режимы минификации
Минификатор Bun имеет три независимых режима которые могут быть включены по отдельности или комбинированы.
Минификация пробелов (--minify-whitespace)
Удаляет все ненужные пробелы новые строки и форматирование из вывода.
Минификация синтаксиса (--minify-syntax)
Переписывает синтаксис JavaScript в более короткие эквивалентные формы и выполняет свертку констант устранение мертвого кода и другие оптимизации.
Минификация идентификаторов (--minify-identifiers)
Переименовывает локальные переменные и имена функций в более короткие идентификаторы используя оптимизацию на основе частоты.
Все преобразования
Сокращение булевых литералов
Режим: --minify-syntax
Преобразует булевы литералы в более короткие выражения.
true
false!0
!1Оптимизации булевой алгебры
Режим: --minify-syntax
Упрощает булевы выражения используя логические правила.
!!x
x === true
x && true
x || false
!true
!falsex
x
x
x
!1
!0Сокращение undefined
Режим: --minify-syntax
Заменяет undefined на более короткий эквивалент.
undefined
let x = undefined;void 0
let x=void 0;Оптимизация сравнения undefined
Режим: --minify-syntax
Оптимизирует проверки нестрогого равенства с undefined.
x == undefined
x != undefinedx == null
x != nullСокращение Infinity
Режим: --minify-syntax
Преобразует Infinity в математические выражения.
Infinity
-Infinity1/0
-1/0Оптимизации typeof
Режим: --minify-syntax
Оптимизирует сравнения typeof и вычисляет константные выражения typeof.
typeof x === 'undefined'
typeof x !== 'undefined'
typeof require
typeof null
typeof true
typeof 123
typeof "str"
typeof 123ntypeof x>'u'
typeof x<'u'
"function"
"object"
"boolean"
"number"
"string"
"bigint"Форматирование чисел
Режим: --minify-syntax
Форматирует числа в наиболее компактном представлении.
10000
100000
1000000
1.0
-42.01e4
1e5
1e6
1
-42Свертка арифметических констант
Режим: --minify-syntax
Вычисляет арифметические операции во время компиляции.
1 + 2
10 - 5
3 * 4
10 / 2
10 % 3
2 ** 33
5
12
5
1
8Свертка битовых констант
Режим: --minify-syntax
Вычисляет битовые операции во время компиляции.
5 & 3
5 | 3
5 ^ 3
8 << 2
32 >> 2
~51
7
6
32
8
-6Конкатенация строк
Режим: --minify-syntax
Объединяет строковые литералы во время компиляции.
"a" + "b"
"x" + 123
"foo" + "bar" + "baz""ab"
"x123"
"foobarbaz"Индексация строк
Режим: --minify-syntax
Вычисляет доступ к символу строки во время компиляции.
"foo"[2]
"hello"[0]"o"
"h"Свертка шаблонных литералов
Режим: --minify-syntax
Вычисляет шаблонные литералы с константными выражениями.
`a${123}b`
`result: ${5 + 10}`"a123b"
"result: 15"Преобразование шаблонных литералов в строки
Режим: --minify-syntax
Преобразует простые шаблонные литералы в обычные строки.
`Hello World`
`Line 1
Line 2`"Hello World"
"Line 1\nLine 2"Оптимизация кавычек в строках
Режим: --minify-syntax
Выбирает оптимальный символ кавычки для минимизации экранирований.
"It's a string"
'He said "hello"'
`Simple string`"It's a string"
'He said "hello"'
"Simple string"Встраивание spread-операций массива
Режим: --minify-syntax
Встраивает spread-операции массива с константными массивами.
[1, ...[2, 3], 4]
[...[a, b]][1,2,3,4]
[a,b]Индексация массива
Режим: --minify-syntax
Вычисляет константный доступ к массиву во время компиляции.
[x][0]
['a', 'b', 'c'][1]
['a', , 'c'][1]x
'b'
void 0Оптимизация доступа к свойствам
Режим: --minify-syntax
Преобразует нотацию с квадратными скобками в точечную нотацию когда это возможно.
obj["property"]
obj["validName"]
obj["123"]
obj["invalid-name"]obj.property
obj.validName
obj["123"]
obj["invalid-name"]Свертка сравнений
Режим: --minify-syntax
Вычисляет константные сравнения во время компиляции.
3 < 5
5 > 3
3 <= 3
5 >= 6
"a" < "b"!0
!0
!0
!1
!0Упрощение логических операций
Режим: --minify-syntax
Упрощает логические операции с константными значениями.
true && x
false && x
true || x
false || xx
!1
!0
xСворачивание nullish coalescing
Режим: --minify-syntax
Вычисляет nullish coalescing с известными значениями.
null ?? x
undefined ?? x
42 ?? xx
x
42Упрощение запятых выражений
Режим: --minify-syntax
Удаляет выражения без побочных эффектов из последовательностей запятых.
(0, x)
(123, "str", x)x
xСвертка тернарного условия
Режим: --minify-syntax
Вычисляет условные выражения с константными условиями.
true ? a : b
false ? a : b
x ? true : false
x ? false : truea
b
x ? !0 : !1
x ? !1 : !0Свертка унарных выражений
Режим: --minify-syntax
Упрощает унарные операции.
+123
+"123"
-(-x)
~~x
!!x123
123
123
123
x
~~x
!!x
xУдаление двойного отрицания
Режим: --minify-syntax
Удаляет ненужные двойные отрицания.
!!x
!!!xx
!xОптимизация if-операторов
Режим: --minify-syntax
Оптимизирует if-операторы с константными условиями.
if (true) x;
if (false) x;
if (x) { a; }
if (x) { } else y;x;
// удалено
if(x)a;
if(!x)y;Устранение мертвого кода
Режим: --minify-syntax
Удаляет недостижимый код и код без побочных эффектов.
if (false) {
unreachable();
}
function foo() {
return x;
deadCode();
}function foo(){return x}Удаление недостижимых ветвей
Режим: --minify-syntax
Удаляет ветви которые никогда не выполняются.
while (false) {
neverRuns();
}// удалено полностьюУдаление пустых блоков
Режим: --minify-syntax
Удаляет пустые блоки и ненужные фигурные скобки.
{ }
if (x) { };
// удаленоРазворачивание блоков с одним оператором
Режим: --minify-syntax
Удаляет ненужные фигурные скобки вокруг одиночных операторов.
if (condition) {
doSomething();
}if(condition)doSomething();Встраивание TypeScript enum
Режим: --minify-syntax
Встраивает значения TypeScript enum во время компиляции.
enum Color { Red, Green, Blue }
const x = Color.Red;const x=0;Поддержка аннотаций @PURE
Режим: Всегда активно
Уважает аннотации /*@__PURE__*/ для встряхивания дерева.
const x = /*@__PURE__*/ expensive();
// Если x не используется...// удалено полностьюПереименование идентификаторов
Режим: --minify-identifiers
Переименовывает локальные переменные в более короткие имена на основе частоты использования.
function calculateSum(firstNumber, secondNumber) {
const result = firstNumber + secondNumber;
return result;
}function a(b,c){const d=b+c;return d}Стратегия именования:
- Наиболее часто используемые идентификаторы получают самые короткие имена (a, b, c...)
- Одиночные буквы: a-z (26 имен)
- Двойные буквы: aa-zz (676 имен)
- Тройные буквы и далее по мере необходимости
Сохраняемые идентификаторы:
- Ключевые слова JavaScript и зарезервированные слова
- Глобальные идентификаторы
- Именованные экспорты (для поддержания API)
- Имена CommonJS:
exports,module
Удаление пробелов
Режим: --minify-whitespace
Удаляет все ненужные пробелы.
function add(a, b) {
return a + b;
}
let x = 10;function add(a,b){return a+b;}let x=10;Оптимизация точек с запятой
Режим: --minify-whitespace
Вставляет точки с запятой только когда необходимо.
let a = 1;
let b = 2;
return a + b;let a=1;let b=2;return a+bУдаление пробелов вокруг операторов
Режим: --minify-whitespace
Удаляет пробелы вокруг операторов.
a + b
x = y * z
foo && bar || baza+b
x=y*z
foo&&bar||bazУдаление комментариев
Режим: --minify-whitespace
Удаляет комментарии за исключением важных лицензионных комментариев.
// Этот комментарий удаляется
/* Как и этот */
/*! Но этот лицензионный комментарий сохраняется */
function test() { /* встроенный комментарий */ }/*! Но этот лицензионный комментарий сохраняется */
function test(){}Форматирование объектов и массивов
Режим: --minify-whitespace
Удаляет пробелы в литералах объектов и массивов.
const obj = {
name: "John",
age: 30
};
const arr = [1, 2, 3];const obj={name:"John",age:30};const arr=[1,2,3];Форматирование управляющих структур
Режим: --minify-whitespace
Удаляет пробелы в управляющих структурах.
if (condition) {
doSomething();
}
for (let i = 0; i < 10; i++) {
console.log(i);
}if(condition)doSomething();for(let i=0;i<10;i++)console.log(i);Форматирование функций
Режим: --minify-whitespace
Удаляет пробелы в объявлениях функций.
function myFunction(param1, param2) {
return param1 + param2;
}
const arrow = (a, b) => a + b;function myFunction(a,b){return a+b}const arrow=(a,b)=>a+b;Минимизация скобок
Режим: Всегда активно
Добавляет скобки только когда необходимо для приоритета операторов.
(a + b) * c
a + (b * c)
((x))(a+b)*c
a+b*c
xИзменение имен свойств
Режим: --minify-identifiers (с конфигурацией)
Переименовывает свойства объектов в более короткие имена при настройке.
obj.longPropertyNameobj.aСвертка значений шаблонных литералов
Режим: --minify-syntax
Преобразует нестроковые интерполированные значения в строки и встраивает их в шаблон.
`hello ${123}`
`value: ${true}`
`result: ${null}`
`status: ${undefined}`
`big: ${10n}`"hello 123"
"value: true"
"result: null"
"status: undefined"
"big: 10"Свертка константы длины строки
Режим: --minify-syntax
Вычисляет свойство .length на строковых литералах во время компиляции.
"hello world".length
"test".length11
4Упрощение вызовов конструктора
Режим: --minify-syntax
Упрощает вызовы конструктора для встроенных типов.
new Object()
new Object(null)
new Object({a: 1})
new Array()
new Array(x, y){}
{}
{a:1}
[]
[x,y]Встраивание объектов с одним свойством
Режим: --minify-syntax
Встраивает доступ к свойству для объектов с одним свойством.
({fn: () => console.log('hi')}).fn()(() => console.log('hi'))()Свертка константы charCodeAt строки
Режим: Всегда активно
Вычисляет charCodeAt() на строковых литералах для ASCII символов.
"hello".charCodeAt(1)
"A".charCodeAt(0)101
65Преобразование равенства void 0 в равенство null
Режим: --minify-syntax
Преобразует проверки нестрогого равенства с void 0 в null поскольку они эквивалентны.
x == void 0
x != void 0x == null
x != nullОптимизация оператора отрицания
Режим: --minify-syntax
Перемещает оператор отрицания через запятые выражения.
-(a, b)
-(x, y, z)a,-b
x,y,-zВстраивание свойств import.meta
Режим: Режим бандла
Встраивает свойства import.meta во время сборки когда значения известны.
import.meta.dir
import.meta.file
import.meta.path
import.meta.url"/path/to/directory"
"filename.js"
"/full/path/to/file.js"
"file:///full/path/to/file.js"Объединение объявлений переменных
Режим: --minify-syntax
Объединяет смежные объявления переменных одного типа.
let a = 1;
let b = 2;
const c = 3;
const d = 4;let a=1,b=2;
const c=3,d=4;Объединение выражений операторов
Режим: --minify-syntax
Объединяет смежные выражения операторов используя оператор запятая.
console.log(1);
console.log(2);
console.log(3);console.log(1),console.log(2),console.log(3);Объединение return-операторов
Режим: --minify-syntax
Объединяет выражения перед return с оператором запятая.
console.log(x);
return y;return console.log(x),y;Объединение throw-операторов
Режим: --minify-syntax
Объединяет выражения перед throw с оператором запятая.
console.log(x);
throw new Error();throw(console.log(x),new Error());Встраивание TypeScript enum между модулями
Режим: --minify-syntax (режим бандла)
Встраивает значения enum через границы модулей.
// lib.ts
export enum Color { Red, Green, Blue }
// Вход (main.ts)
import { Color } from './lib';
const x = Color.Red;const x=0;Встраивание enum с вычисляемыми свойствами
Режим: --minify-syntax
Встраивает значения enum используемые как вычисляемые свойства объектов.
enum Keys { FOO = 'foo' }
const obj = { [Keys.FOO]: value }const obj={foo:value}Преобразование строкового числа в числовой индекс
Режим: --minify-syntax
Преобразует доступ к свойству со строковым числом в числовой индекс.
obj["0"]
arr["5"]obj[0]
arr[5]Сокращение тела стрелочной функции
Режим: Всегда активно
Использует синтаксис выражения тела когда стрелочная функция только возвращает значение.
() => { return x; }
(a) => { return a + 1; }() => x
a => a + 1Сокращение свойств объекта
Режим: Всегда активно
Использует краткий синтаксис когда имя свойства и идентификатор значения совпадают.
{ x: x, y: y }
{ name: name, age: age }{ x, y }
{ name, age }Сокращение методов
Режим: Всегда активно
Использует краткий синтаксис метода в литералах объектов.
{
foo: function() {},
bar: async function() {}
}{
foo() {},
async bar() {}
}Удаление операторов debugger
Режим: --drop=debugger
Удаляет операторы debugger из кода.
function test() {
debugger;
return x;
}function test(){return x}Удаление вызовов console
Режим: --drop=console
Удаляет все вызовы методов console.* из кода.
console.log("debug");
console.warn("warning");
x = console.error("error");void 0;
void 0;
x=void 0;Удаление пользовательских вызовов функций
Режим: --drop=<name>
Удаляет вызовы указанных глобальных функций или методов.
assert(condition);
obj.assert(test);void 0;
void 0;Сохранение имен
При минификации идентификаторов вы можете сохранить оригинальные имена функций и классов для целей отладки. Используйте флаг --keep-names:
bun build ./index.ts --minify --keep-names --outfile=out.jsИли в JavaScript API:
await Bun.build({
entrypoints: ["./index.ts"],
outdir: "./out",
minify: {
identifiers: true,
keepNames: true,
},
});Это сохраняет свойство .name на функциях и классах при этом минифицируя фактические имена идентификаторов в коде.
Комбинированный пример
Использование всех трех режимов минификации вместе:
const myVariable = 42;
const myFunction = () => {
const isValid = true;
const result = undefined;
return isValid ? myVariable : result;
};
const output = myFunction();// Выход с --minify (49 байт, уменьшение на 69%)
const a=42,b=()=>{const c=!0,d=void 0;return c?a:d},e=b();Когда использовать минификацию
Используйте --minify для:
- Продакшен-бандлов
- Уменьшения затрат на пропускную способность CDN
- Улучшения времени загрузки страницы
Используйте отдельные режимы для:
--minify-whitespace: Быстрое уменьшение размера без семантических изменений--minify-syntax: Меньший выход при сохранении читаемых идентификаторов для отладки--minify-identifiers: Максимальное уменьшение размера (комбинируйте с--keep-namesдля лучших трассировок стека)
Избегайте минификации для:
- Сборки для разработки (сложнее отлаживать)
- Когда нужны читаемые сообщения об ошибках
- Библиотек где потребители могут читать исходный код