Skip to content

O Bun inclui um minificador rápido de JavaScript e TypeScript que pode reduzir tamanhos de bundle em 80% ou mais (dependendo do codebase) e fazer o código de output rodar mais rápido. O minificador realiza dezenas de otimizações incluindo constant folding, dead code elimination e transformações de sintaxe. Diferentemente de outros minificadores, o minificador do Bun faz o bun build rodar mais rápido já que há menos código para imprimir.

Uso na CLI

Habilitar toda minificação

Use a flag --minify para habilitar todos os modos de minificação:

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

A flag --minify automaticamente habilita:

  • Minificação de whitespace
  • Minificação de sintaxe
  • Minificação de identificadores

Modo de produção

A flag --production automaticamente habilita minificação:

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

A flag --production também:

  • Define process.env.NODE_ENV como production
  • Habilita o import e transform JSX em modo de produção

Controle granular

Você pode habilitar modos específicos de minificação individualmente:

bash
# Apenas remover whitespace
bun build ./index.ts --minify-whitespace --outfile=out.js

# Apenas minificar sintaxe
bun build ./index.ts --minify-syntax --outfile=out.js

# Apenas minificar identificadores
bun build ./index.ts --minify-identifiers --outfile=out.js

# Combinar modos específicos
bun build ./index.ts --minify-whitespace --minify-syntax --outfile=out.js

API JavaScript

Ao usar o bundler do Bun programaticamente, configure minificação através da opção minify:

ts
await Bun.build({
  entrypoints: ["./index.ts"],
  outdir: "./out",
  minify: true, // Habilita todos os modos de minificação
});

Para controle granular, passe um objeto:

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

Modos de Minificação

O minificador do Bun tem três modos independentes que podem ser habilitados separadamente ou combinados.

Minificação de whitespace (--minify-whitespace)

Remove todos whitespaces, newlines e formatação desnecessários do output.

Minificação de sintaxe (--minify-syntax)

Reescreve sintaxe JavaScript para formas equivalentes mais curtas e realiza constant folding, dead code elimination e outras otimizações.

Minificação de identificadores (--minify-identifiers)

Renomeia variáveis locais e nomes de função para identificadores mais curtos usando otimização baseada em frequência.

Todas as Transformações

Encurtamento de literais booleanos

Modo: --minify-syntax

Converte literais booleanos para expressões mais curtas.

ts
true
false
js
!0
!1

Otimizações de álgebra booleana

Modo: --minify-syntax

Simplifica expressões booleanas usando regras lógicas.

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

Encurtamento de undefined

Modo: --minify-syntax

Substitui undefined por equivalente mais curto.

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

Otimização de igualdade undefined

Modo: --minify-syntax

Otimiza verificações de igualdade loose com undefined.

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

Encurtamento de Infinity

Modo: --minify-syntax

Converte Infinity para expressões matemáticas.

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

Otimizações de typeof

Modo: --minify-syntax

Otimiza comparações de typeof e avalia expressões typeof constantes.

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"

Formatação de números

Modo: --minify-syntax

Formata números na representação mais compacta.

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

Constant folding aritmético

Modo: --minify-syntax

Avalia operações aritméticas em tempo de compilação.

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

Constant folding bitwise

Modo: --minify-syntax

Avalia operações bitwise em tempo de compilação.

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

Concatenação de strings

Modo: --minify-syntax

Combina literais de string em tempo de compilação.

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

Indexação de strings

Modo: --minify-syntax

Avalia acesso a caracteres de string em tempo de compilação.

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

Constant folding de template literals

Modo: --minify-syntax

Avalia template literals com expressões constantes.

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

Conversão de template literal para string

Modo: --minify-syntax

Converte template literals simples para strings regulares.

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

Otimização de aspas de strings

Modo: --minify-syntax

Escolhe o caractere de aspa ótimo para minimizar escapes.

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

Inline de spread de array

Modo: --minify-syntax

Faz inline de operações de spread de array com arrays constantes.

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

Indexação de arrays

Modo: --minify-syntax

Avalia acesso a array constante em tempo de compilação.

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

Otimização de acesso a propriedades

Modo: --minify-syntax

Converte notação de colchetes para notação de ponto quando possível.

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

Constant folding de comparações

Modo: --minify-syntax

Avalia comparações constantes em tempo de compilação.

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

Simplificação de operações lógicas

Modo: --minify-syntax

Simplifica operações lógicas com valores constantes.

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

Constant folding de nullish coalescing

Modo: --minify-syntax

Avalia nullish coalescing com valores conhecidos.

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

Simplificação de expressão vírgula

Modo: --minify-syntax

Remove expressões sem side effects de sequências de vírgula.

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

Constant folding de ternário

Modo: --minify-syntax

Avalia expressões condicionais com condições constantes.

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

Constant folding de expressão unária

Modo: --minify-syntax

Simplifica operações unárias.

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

Remoção de dupla negação

Modo: --minify-syntax

Remove duplas negações desnecessárias.

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

Otimização de declaração if

Modo: --minify-syntax

Otimiza declarações if com condições constantes.

ts
if (true) x;
if (false) x;
if (x) { a; }
if (x) {} else y;
js
x;
// removido
if(x)a;
if(!x)y;

Dead code elimination

Modo: --minify-syntax

Remove código inalcançável e código sem side effects.

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

Remoção de branches inalcançáveis

Modo: --minify-syntax

Remove branches que nunca podem executar.

ts
while (false) {
  neverRuns();
}
js
// removido inteiramente

Remoção de blocos vazios

Modo: --minify-syntax

Remove blocos vazios e braces desnecessários.

ts
{ }
if (x) { }
js
;
// removido

Unwrap de blocos de declaração única

Modo: --minify-syntax

Remove braces desnecessários em torno de declarações únicas.

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

Inline de enums TypeScript

Modo: --minify-syntax

Faz inline de valores de enum TypeScript em tempo de compilação.

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

Suporte a anotações pure

Modo: Sempre ativo

Respeita anotações /*@__PURE__*/ para tree shaking.

ts
const x = /*@__PURE__*/ expensive();
// Se x não for usado...
js
// removido inteiramente

Renomeação de identificadores

Modo: --minify-identifiers

Renomeia variáveis locais para nomes mais curtos baseado na frequência de uso.

ts
function calculateSum(firstNumber, secondNumber) {
  const result = firstNumber + secondNumber;
  return result;
}
js
function a(b,c){const d=b+c;return d}

Estratégia de nomeação:

  • Identificadores mais frequentemente usados recebem os nomes mais curtos (a, b, c...)
  • Letras únicas: a-z (26 nomes)
  • Letras duplas: aa-zz (676 nomes)
  • Letras triplas e além conforme necessário

Identificadores preservados:

  • Palavras-chave e reservadas JavaScript
  • Identificadores globais
  • Named exports (para manter API)
  • Nomes CommonJS: exports, module

Remoção de whitespace

Modo: --minify-whitespace

Remove todos whitespaces desnecessários.

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

Otimização de ponto e vírgula

Modo: --minify-whitespace

Insere ponto e vírgula apenas quando necessário.

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

Remoção de espaçamento de operadores

Modo: --minify-whitespace

Remove espaços em torno de operadores.

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

Remoção de comentários

Modo: --minify-whitespace

Remove comentários exceto comentários de licença importantes.

ts
// Este comentário é removido
/* Este também */
/*! Mas este comentário de licença é mantido */
function test() { /* comentário inline */ }
js
/*! Mas este comentário de licença é mantido */
function test(){}

Formatação de objetos e arrays

Modo: --minify-whitespace

Remove whitespace em literais de objeto e array.

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

Formatação de controle de fluxo

Modo: --minify-whitespace

Remove whitespace em estruturas de controle.

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);

Formatação de funções

Modo: --minify-whitespace

Remove whitespace em declarações de função.

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;

Minimização de parênteses

Modo: Sempre ativo

Adiciona parênteses apenas quando necessário para precedência de operadores.

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

Property mangling

Modo: --minify-identifiers (com configuração)

Renomeia propriedades de objeto para nomes mais curtos quando configurado.

ts
obj.longPropertyName
js
obj.a

Constant folding de valores de template literal

Modo: --minify-syntax

Converte valores interpolados não-string para strings e os fold no template.

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

Constant folding de string length

Modo: --minify-syntax

Avalia propriedade .length em literais de string em tempo de compilação.

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

Simplificação de chamadas de construtor

Modo: --minify-syntax

Simplifica chamadas de construtor para tipos built-in.

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

Inline de objeto de propriedade única

Modo: --minify-syntax

Faz inline de acesso a propriedade para objetos com uma única propriedade.

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

Constant folding de string charCodeAt

Modo: Sempre ativo

Avalia charCodeAt() em literais de string para caracteres ASCII.

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

Igualdade void 0 para igualdade null

Modo: --minify-syntax

Converte verificações de igualdade loose com void 0 para null já que são equivalentes.

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

Otimização de operador de negação

Modo: --minify-syntax

Move operador de negação através de expressões de vírgula.

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

Inline de propriedades import.meta

Modo: Modo bundle

Faz inline de propriedades import.meta em tempo de build quando valores são conhecidos.

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"

Merge de declarações de variáveis

Modo: --minify-syntax

Funde declarações de variáveis adjacentes do mesmo tipo.

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

Merge de declarações de expressão

Modo: --minify-syntax

Funde declarações de expressão adjacentes usando operador vírgula.

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

Merge de declarações return

Modo: --minify-syntax

Funde expressões antes de return com operador vírgula.

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

Merge de declarações throw

Modo: --minify-syntax

Funde expressões antes de throw com operador vírgula.

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

Inline de enum TypeScript cross-module

Modo: --minify-syntax (modo bundle)

Faz inline de valores de enum através de limites de módulo.

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

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

Inline de enum de propriedade computada

Modo: --minify-syntax

Faz inline de valores de enum usados como propriedades de objeto computadas.

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

String numérica para índice numérico

Modo: --minify-syntax

Converte acesso a propriedade numérica string para índice numérico.

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

Encurtamento de corpo de arrow function

Modo: Sempre ativo

Usa sintaxe de corpo de expressão quando uma arrow function apenas retorna um valor.

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

Shorthand de propriedade de objeto

Modo: Sempre ativo

Usa sintaxe shorthand quando nome da propriedade e identificador de valor coincidem.

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

Shorthand de método

Modo: Sempre ativo

Usa sintaxe de shorthand de método em literais de objeto.

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

Drop de declarações debugger

Modo: --drop=debugger

Remove declarações debugger do código.

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

Drop de chamadas console

Modo: --drop=console

Remove todas as chamadas de método console.* do código.

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

Drop de chamadas de função customizadas

Modo: --drop=<name>

Remove chamadas para funções globais ou métodos especificados.

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

Keep Names

Ao minificar identificadores, você pode querer preservar nomes originais de função e classe para propósitos de debug. Use a flag --keep-names:

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

Ou na API JavaScript:

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

Isso preserva a propriedade .name em funções e classes enquanto ainda minifica os nomes reais de identificador no código.

Exemplo Combinado

Usando todos os três modos de minificação juntos:

ts
const myVariable = 42;

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

const output = myFunction();
js
// Output com --minify (49 bytes, 69% redução)
const a=42,b=()=>{const c=!0,d=void 0;return c?a:d},e=b();

Quando Usar Minificação

Use --minify para:

  • Bundles de produção
  • Reduzir custos de banda de CDN
  • Melhorar tempos de carregamento de página

Use modos individuais para:

  • --minify-whitespace: Redução rápida de tamanho sem mudanças semânticas
  • --minify-syntax: Output menor enquanto mantém identificadores legíveis para debug
  • --minify-identifiers: Máxima redução de tamanho (combine com --keep-names para melhores stack traces)

Evite minificação para:

  • Builds de desenvolvimento (mais difícil de debug)
  • Quando você precisa de mensagens de erro legíveis
  • Bibliotecas onde consumidores podem ler o source

Bun by www.bunjs.com.cn edit