Skip to content

Bun включает быстрый минификатор JavaScript и TypeScript который может уменьшить размеры бандлов на 80% или более (в зависимости от кодовой базы) и ускорить выполнение выходного кода. Минификатор выполняет десятки оптимизаций включая свертку констант устранение мертвого кода и преобразования синтаксиса. В отличие от других минификаторов минификатор Bun ускоряет работу bun build поскольку кода для печати меньше.

Использование CLI

Включить всю минификацию

Используйте флаг --minify для включения всех режимов минификации:

bash
bun build ./index.ts --minify --outfile=out.js

Флаг --minify автоматически включает:

  • Минификацию пробелов
  • Минификацию синтаксиса
  • Минификацию идентификаторов

Режим продакшена

Флаг --production автоматически включает минификацию:

bash
bun build ./index.ts --production --outfile=out.js

Флаг --production также:

  • Устанавливает process.env.NODE_ENV в production
  • Включает JSX импорт и преобразование в режиме продакшена

Детальный контроль

Вы можете включить определенные режимы минификации по отдельности:

bash
# Только удалить пробелы
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.js

JavaScript API

При программном использовании бандлера Bun настройте минификацию через опцию minify:

ts
await Bun.build({
  entrypoints: ["./index.ts"],
  outdir: "./out",
  minify: true, // Включить все режимы минификации
});

Для детального контроля передайте объект:

ts
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

Преобразует булевы литералы в более короткие выражения.

ts
true
false
js
!0
!1

Оптимизации булевой алгебры

Режим: --minify-syntax

Упрощает булевы выражения используя логические правила.

ts
!!x
x === true
x && true
x || false
!true
!false
js
x
x
x
x
!1
!0

Сокращение undefined

Режим: --minify-syntax

Заменяет undefined на более короткий эквивалент.

ts
undefined
let x = undefined;
js
void 0
let x=void 0;

Оптимизация сравнения undefined

Режим: --minify-syntax

Оптимизирует проверки нестрогого равенства с undefined.

ts
x == undefined
x != undefined
js
x == null
x != null

Сокращение Infinity

Режим: --minify-syntax

Преобразует Infinity в математические выражения.

ts
Infinity
-Infinity
js
1/0
-1/0

Оптимизации typeof

Режим: --minify-syntax

Оптимизирует сравнения typeof и вычисляет константные выражения typeof.

ts
typeof x === 'undefined'
typeof x !== 'undefined'
typeof require
typeof null
typeof true
typeof 123
typeof "str"
typeof 123n
js
typeof x>'u'
typeof x<'u'
"function"
"object"
"boolean"
"number"
"string"
"bigint"

Форматирование чисел

Режим: --minify-syntax

Форматирует числа в наиболее компактном представлении.

ts
10000
100000
1000000
1.0
-42.0
js
1e4
1e5
1e6
1
-42

Свертка арифметических констант

Режим: --minify-syntax

Вычисляет арифметические операции во время компиляции.

ts
1 + 2
10 - 5
3 * 4
10 / 2
10 % 3
2 ** 3
js
3
5
12
5
1
8

Свертка битовых констант

Режим: --minify-syntax

Вычисляет битовые операции во время компиляции.

ts
5 & 3
5 | 3
5 ^ 3
8 << 2
32 >> 2
~5
js
1
7
6
32
8
-6

Конкатенация строк

Режим: --minify-syntax

Объединяет строковые литералы во время компиляции.

ts
"a" + "b"
"x" + 123
"foo" + "bar" + "baz"
js
"ab"
"x123"
"foobarbaz"

Индексация строк

Режим: --minify-syntax

Вычисляет доступ к символу строки во время компиляции.

ts
"foo"[2]
"hello"[0]
js
"o"
"h"

Свертка шаблонных литералов

Режим: --minify-syntax

Вычисляет шаблонные литералы с константными выражениями.

ts
`a${123}b`
`result: ${5 + 10}`
js
"a123b"
"result: 15"

Преобразование шаблонных литералов в строки

Режим: --minify-syntax

Преобразует простые шаблонные литералы в обычные строки.

ts
`Hello World`
`Line 1
Line 2`
js
"Hello World"
"Line 1\nLine 2"

Оптимизация кавычек в строках

Режим: --minify-syntax

Выбирает оптимальный символ кавычки для минимизации экранирований.

ts
"It's a string"
'He said "hello"'
`Simple string`
js
"It's a string"
'He said "hello"'
"Simple string"

Встраивание spread-операций массива

Режим: --minify-syntax

Встраивает spread-операции массива с константными массивами.

ts
[1, ...[2, 3], 4]
[...[a, b]]
js
[1,2,3,4]
[a,b]

Индексация массива

Режим: --minify-syntax

Вычисляет константный доступ к массиву во время компиляции.

ts
[x][0]
['a', 'b', 'c'][1]
['a', , 'c'][1]
js
x
'b'
void 0

Оптимизация доступа к свойствам

Режим: --minify-syntax

Преобразует нотацию с квадратными скобками в точечную нотацию когда это возможно.

ts
obj["property"]
obj["validName"]
obj["123"]
obj["invalid-name"]
js
obj.property
obj.validName
obj["123"]
obj["invalid-name"]

Свертка сравнений

Режим: --minify-syntax

Вычисляет константные сравнения во время компиляции.

ts
3 < 5
5 > 3
3 <= 3
5 >= 6
"a" < "b"
js
!0
!0
!0
!1
!0

Упрощение логических операций

Режим: --minify-syntax

Упрощает логические операции с константными значениями.

ts
true && x
false && x
true || x
false || x
js
x
!1
!0
x

Сворачивание nullish coalescing

Режим: --minify-syntax

Вычисляет nullish coalescing с известными значениями.

ts
null ?? x
undefined ?? x
42 ?? x
js
x
x
42

Упрощение запятых выражений

Режим: --minify-syntax

Удаляет выражения без побочных эффектов из последовательностей запятых.

ts
(0, x)
(123, "str", x)
js
x
x

Свертка тернарного условия

Режим: --minify-syntax

Вычисляет условные выражения с константными условиями.

ts
true ? a : b
false ? a : b
x ? true : false
x ? false : true
js
a
b
x ? !0 : !1
x ? !1 : !0

Свертка унарных выражений

Режим: --minify-syntax

Упрощает унарные операции.

ts
+123
+"123"
-(-x)
~~x
!!x
js
123
123
123
123
x
~~x
!!x
x

Удаление двойного отрицания

Режим: --minify-syntax

Удаляет ненужные двойные отрицания.

ts
!!x
!!!x
js
x
!x

Оптимизация if-операторов

Режим: --minify-syntax

Оптимизирует if-операторы с константными условиями.

ts
if (true) x;
if (false) x;
if (x) { a; }
if (x) { } else y;
js
x;
// удалено
if(x)a;
if(!x)y;

Устранение мертвого кода

Режим: --minify-syntax

Удаляет недостижимый код и код без побочных эффектов.

ts
if (false) {
  unreachable();
}
function foo() {
  return x;
  deadCode();
}
js
function foo(){return x}

Удаление недостижимых ветвей

Режим: --minify-syntax

Удаляет ветви которые никогда не выполняются.

ts
while (false) {
  neverRuns();
}
js
// удалено полностью

Удаление пустых блоков

Режим: --minify-syntax

Удаляет пустые блоки и ненужные фигурные скобки.

ts
{ }
if (x) { }
js
;
// удалено

Разворачивание блоков с одним оператором

Режим: --minify-syntax

Удаляет ненужные фигурные скобки вокруг одиночных операторов.

ts
if (condition) {
  doSomething();
}
js
if(condition)doSomething();

Встраивание TypeScript enum

Режим: --minify-syntax

Встраивает значения TypeScript enum во время компиляции.

ts
enum Color { Red, Green, Blue }
const x = Color.Red;
js
const x=0;

Поддержка аннотаций @PURE

Режим: Всегда активно

Уважает аннотации /*@__PURE__*/ для встряхивания дерева.

ts
const x = /*@__PURE__*/ expensive();
// Если x не используется...
js
// удалено полностью

Переименование идентификаторов

Режим: --minify-identifiers

Переименовывает локальные переменные в более короткие имена на основе частоты использования.

ts
function calculateSum(firstNumber, secondNumber) {
  const result = firstNumber + secondNumber;
  return result;
}
js
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

Удаляет все ненужные пробелы.

ts
function add(a, b) {
    return a + b;
}
let x = 10;
js
function add(a,b){return a+b;}let x=10;

Оптимизация точек с запятой

Режим: --minify-whitespace

Вставляет точки с запятой только когда необходимо.

ts
let a = 1;
let b = 2;
return a + b;
js
let a=1;let b=2;return a+b

Удаление пробелов вокруг операторов

Режим: --minify-whitespace

Удаляет пробелы вокруг операторов.

ts
a + b
x = y * z
foo && bar || baz
js
a+b
x=y*z
foo&&bar||baz

Удаление комментариев

Режим: --minify-whitespace

Удаляет комментарии за исключением важных лицензионных комментариев.

ts
// Этот комментарий удаляется
/* Как и этот */
/*! Но этот лицензионный комментарий сохраняется */
function test() { /* встроенный комментарий */ }
js
/*! Но этот лицензионный комментарий сохраняется */
function test(){}

Форматирование объектов и массивов

Режим: --minify-whitespace

Удаляет пробелы в литералах объектов и массивов.

ts
const obj = {
    name: "John",
    age: 30
};
const arr = [1, 2, 3];
js
const obj={name:"John",age:30};const arr=[1,2,3];

Форматирование управляющих структур

Режим: --minify-whitespace

Удаляет пробелы в управляющих структурах.

ts
if (condition) {
    doSomething();
}
for (let i = 0; i < 10; i++) {
    console.log(i);
}
js
if(condition)doSomething();for(let i=0;i<10;i++)console.log(i);

Форматирование функций

Режим: --minify-whitespace

Удаляет пробелы в объявлениях функций.

ts
function myFunction(param1, param2) {
    return param1 + param2;
}
const arrow = (a, b) => a + b;
js
function myFunction(a,b){return a+b}const arrow=(a,b)=>a+b;

Минимизация скобок

Режим: Всегда активно

Добавляет скобки только когда необходимо для приоритета операторов.

ts
(a + b) * c
a + (b * c)
((x))
js
(a+b)*c
a+b*c
x

Изменение имен свойств

Режим: --minify-identifiers (с конфигурацией)

Переименовывает свойства объектов в более короткие имена при настройке.

ts
obj.longPropertyName
js
obj.a

Свертка значений шаблонных литералов

Режим: --minify-syntax

Преобразует нестроковые интерполированные значения в строки и встраивает их в шаблон.

ts
`hello ${123}`
`value: ${true}`
`result: ${null}`
`status: ${undefined}`
`big: ${10n}`
js
"hello 123"
"value: true"
"result: null"
"status: undefined"
"big: 10"

Свертка константы длины строки

Режим: --minify-syntax

Вычисляет свойство .length на строковых литералах во время компиляции.

ts
"hello world".length
"test".length
js
11
4

Упрощение вызовов конструктора

Режим: --minify-syntax

Упрощает вызовы конструктора для встроенных типов.

ts
new Object()
new Object(null)
new Object({a: 1})
new Array()
new Array(x, y)
js
{}
{}
{a:1}
[]
[x,y]

Встраивание объектов с одним свойством

Режим: --minify-syntax

Встраивает доступ к свойству для объектов с одним свойством.

ts
({fn: () => console.log('hi')}).fn()
js
(() => console.log('hi'))()

Свертка константы charCodeAt строки

Режим: Всегда активно

Вычисляет charCodeAt() на строковых литералах для ASCII символов.

ts
"hello".charCodeAt(1)
"A".charCodeAt(0)
js
101
65

Преобразование равенства void 0 в равенство null

Режим: --minify-syntax

Преобразует проверки нестрогого равенства с void 0 в null поскольку они эквивалентны.

ts
x == void 0
x != void 0
js
x == null
x != null

Оптимизация оператора отрицания

Режим: --minify-syntax

Перемещает оператор отрицания через запятые выражения.

ts
-(a, b)
-(x, y, z)
js
a,-b
x,y,-z

Встраивание свойств import.meta

Режим: Режим бандла

Встраивает свойства import.meta во время сборки когда значения известны.

ts
import.meta.dir
import.meta.file
import.meta.path
import.meta.url
js
"/path/to/directory"
"filename.js"
"/full/path/to/file.js"
"file:///full/path/to/file.js"

Объединение объявлений переменных

Режим: --minify-syntax

Объединяет смежные объявления переменных одного типа.

ts
let a = 1;
let b = 2;
const c = 3;
const d = 4;
js
let a=1,b=2;
const c=3,d=4;

Объединение выражений операторов

Режим: --minify-syntax

Объединяет смежные выражения операторов используя оператор запятая.

ts
console.log(1);
console.log(2);
console.log(3);
js
console.log(1),console.log(2),console.log(3);

Объединение return-операторов

Режим: --minify-syntax

Объединяет выражения перед return с оператором запятая.

ts
console.log(x);
return y;
js
return console.log(x),y;

Объединение throw-операторов

Режим: --minify-syntax

Объединяет выражения перед throw с оператором запятая.

ts
console.log(x);
throw new Error();
js
throw(console.log(x),new Error());

Встраивание TypeScript enum между модулями

Режим: --minify-syntax (режим бандла)

Встраивает значения enum через границы модулей.

ts
// lib.ts
export enum Color { Red, Green, Blue }

// Вход (main.ts)
import { Color } from './lib';
const x = Color.Red;
js
const x=0;

Встраивание enum с вычисляемыми свойствами

Режим: --minify-syntax

Встраивает значения enum используемые как вычисляемые свойства объектов.

ts
enum Keys { FOO = 'foo' }
const obj = { [Keys.FOO]: value }
js
const obj={foo:value}

Преобразование строкового числа в числовой индекс

Режим: --minify-syntax

Преобразует доступ к свойству со строковым числом в числовой индекс.

ts
obj["0"]
arr["5"]
js
obj[0]
arr[5]

Сокращение тела стрелочной функции

Режим: Всегда активно

Использует синтаксис выражения тела когда стрелочная функция только возвращает значение.

ts
() => { return x; }
(a) => { return a + 1; }
js
() => x
a => a + 1

Сокращение свойств объекта

Режим: Всегда активно

Использует краткий синтаксис когда имя свойства и идентификатор значения совпадают.

ts
{ x: x, y: y }
{ name: name, age: age }
js
{ x, y }
{ name, age }

Сокращение методов

Режим: Всегда активно

Использует краткий синтаксис метода в литералах объектов.

ts
{
  foo: function() {},
  bar: async function() {}
}
js
{
  foo() {},
  async bar() {}
}

Удаление операторов debugger

Режим: --drop=debugger

Удаляет операторы debugger из кода.

ts
function test() {
  debugger;
  return x;
}
js
function test(){return x}

Удаление вызовов console

Режим: --drop=console

Удаляет все вызовы методов console.* из кода.

ts
console.log("debug");
console.warn("warning");
x = console.error("error");
js
void 0;
void 0;
x=void 0;

Удаление пользовательских вызовов функций

Режим: --drop=<name>

Удаляет вызовы указанных глобальных функций или методов.

ts
assert(condition);
obj.assert(test);
js
void 0;
void 0;

Сохранение имен

При минификации идентификаторов вы можете сохранить оригинальные имена функций и классов для целей отладки. Используйте флаг --keep-names:

bash
bun build ./index.ts --minify --keep-names --outfile=out.js

Или в JavaScript API:

ts
await Bun.build({
  entrypoints: ["./index.ts"],
  outdir: "./out",
  minify: {
    identifiers: true,
    keepNames: true,
  },
});

Это сохраняет свойство .name на функциях и классах при этом минифицируя фактические имена идентификаторов в коде.

Комбинированный пример

Использование всех трех режимов минификации вместе:

ts
const myVariable = 42;

const myFunction = () => {
  const isValid = true;
  const result = undefined;
  return isValid ? myVariable : result;
};

const output = myFunction();
js
// Выход с --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 для лучших трассировок стека)

Избегайте минификации для:

  • Сборки для разработки (сложнее отлаживать)
  • Когда нужны читаемые сообщения об ошибках
  • Библиотек где потребители могут читать исходный код

Bun от www.bunjs.com.cn