Only remove whitespace
bun build ./index.ts --minify-whitespace --outfile=out.js
Only minify syntax
bun build ./index.ts --minify-syntax --outfile=out.js
Only minify identifiers
bun build ./index.ts --minify-identifiers --outfile=out.js
Combine specific modes
bun build ./index.ts --minify-whitespace --minify-syntax --outfile=out.js
## JavaScript API
When using Bun’s bundler programmatically, configure minification through the `minify` option:
await Bun.build({ entrypoints: ["./index.ts"], outdir: "./out", minify: true, // Enable all minification modes });
For granular control, pass an object:
await Bun.build({ entrypoints: ["./index.ts"], outdir: "./out", minify: { whitespace: true, syntax: true, identifiers: true, }, });
## Minification Modes
Bun’s minifier has three independent modes that can be enabled separately or combined.
### Whitespace minification (`--minify-whitespace`)
Removes all unnecessary whitespace, newlines, and formatting from the output.
### Syntax minification (`--minify-syntax`)
Rewrites JavaScript syntax to shorter equivalent forms and performs constant folding, dead code elimination, and other optimizations.
### Identifier minification (`--minify-identifiers`)
Renames local variables and function names to shorter identifiers using frequency-based optimization.
## All Transformations
### Boolean literal shortening
**Mode:** `--minify-syntax` Converts boolean literals to shorter expressions.
Input
true false
Output
!0 !1
### Boolean algebra optimizations
**Mode:** `--minify-syntax` Simplifies boolean expressions using logical rules.
Input
!!x x === true x && true x || false !true !false
Output
x x x x !1 !0
### Undefined shortening
**Mode:** `--minify-syntax` Replaces `undefined` with shorter equivalent.
Input
undefined let x = undefined;
Output
void 0 let x=void 0;
### Undefined equality optimization
**Mode:** `--minify-syntax` Optimizes loose equality checks with undefined.
Input
x == undefined x != undefined
Output
x == null x != null
### Infinity shortening
**Mode:** `--minify-syntax` Converts Infinity to mathematical expressions.
Input
Infinity -Infinity
Output
1/0 -1/0
### Typeof optimizations
**Mode:** `--minify-syntax` Optimizes typeof comparisons and evaluates constant typeof expressions.
Input
typeof x === 'undefined' typeof x !== 'undefined' typeof require typeof null typeof true typeof 123 typeof "str" typeof 123n
Output
typeof x>'u' typeof x<'u' "function" "object" "boolean" "number" "string" "bigint"
### Number formatting
**Mode:** `--minify-syntax` Formats numbers in the most compact representation.
Input
10000 100000 1000000 1.0 -42.0
Output
1e4 1e5 1e6 1 -42
### Arithmetic constant folding
**Mode:** `--minify-syntax` Evaluates arithmetic operations at compile time.
Input
1 + 2 10 - 5 3 * 4 10 / 2 10 % 3 2 ** 3
Output
3 5 12 5 1 8
### Bitwise constant folding
**Mode:** `--minify-syntax` Evaluates bitwise operations at compile time.
Input
5 & 3 5 | 3 5 ^ 3 8 << 2 32 >> 2 ~5
Output
1 7 6 32 8 -6
### String concatenation
**Mode:** `--minify-syntax` Combines string literals at compile time.
Input
"a" + "b" "x" + 123 "foo" + "bar" + "baz"
Output
"ab" "x123" "foobarbaz"
### String indexing
**Mode:** `--minify-syntax` Evaluates string character access at compile time.
Input
"foo"[2] "hello"[0]
Output
"o" "h"
### Template literal folding
**Mode:** `--minify-syntax` Evaluates template literals with constant expressions.
Input
a${123}b
result: ${5 + 10}
Output
"a123b" "result: 15"
### Template literal to string conversion
**Mode:** `--minify-syntax` Converts simple template literals to regular strings.
Input
Hello World
Line 1 Line 2
Output
"Hello World" "Line 1\nLine 2"
### String quote optimization
**Mode:** `--minify-syntax` Chooses the optimal quote character to minimize escapes.
Input
"It's a string"
'He said "hello"'
Simple string
Output
"It's a string" 'He said "hello"' "Simple string"
### Array spread inlining
**Mode:** `--minify-syntax` Inlines array spread operations with constant arrays.
Input
[1, ...[2, 3], 4] [...[a, b]]
Output
[1,2,3,4] [a,b]
### Array indexing
**Mode:** `--minify-syntax` Evaluates constant array access at compile time.
Input
[x][0] ['a', 'b', 'c'][1] ['a', , 'c'][1]
Output
x 'b' void 0
### Property access optimization
**Mode:** `--minify-syntax` Converts bracket notation to dot notation when possible.
Input
obj["property"] obj["validName"] obj["123"] obj["invalid-name"]
Output
obj.property obj.validName obj["123"] obj["invalid-name"]
### Comparison folding
**Mode:** `--minify-syntax` Evaluates constant comparisons at compile time.
Input
3 < 5 5 > 3 3 <= 3 5 >= 6 "a" < "b"
Output
!0 !0 !0 !1 !0
### Logical operation folding
**Mode:** `--minify-syntax` Simplifies logical operations with constant values.
Input
true && x false && x true || x false || x
Output
x !1 !0 x
### Nullish coalescing folding
**Mode:** `--minify-syntax` Evaluates nullish coalescing with known values.
Input
null ?? x undefined ?? x 42 ?? x
Output
x x 42
### Comma expression simplification
**Mode:** `--minify-syntax` Removes side-effect-free expressions from comma sequences.
Input
(0, x) (123, "str", x)
Output
x x
### Ternary conditional folding
**Mode:** `--minify-syntax` Evaluates conditional expressions with constant conditions.
Input
true ? a : b false ? a : b x ? true : false x ? false : true
Output
a b x ? !0 : !1 x ? !1 : !0
### Unary expression folding
**Mode:** `--minify-syntax` Simplifies unary operations.
Input
+123 +"123" -(-x) ~~x !!x
Output
123 123 123 123 x ~~x !!x x
### Double negation removal
**Mode:** `--minify-syntax` Removes unnecessary double negations.
Input
!!x !!!x
Output
x !x
### If statement optimization
**Mode:** `--minify-syntax` Optimizes if statements with constant conditions.
Input
if (true) x; if (false) x; if (x) { a; } if (x) {} else y;
Output
x; // removed if(x)a; if(!x)y;
### Dead code elimination
**Mode:** `--minify-syntax` Removes unreachable code and code without side effects.
Input
if (false) { unreachable(); } function foo() { return x; deadCode(); }
Output
function foo(){return x}
### Unreachable branch removal
**Mode:** `--minify-syntax` Removes branches that can never execute.
Input
while (false) { neverRuns(); }
Output
// removed entirely
### Empty block removal
**Mode:** `--minify-syntax` Removes empty blocks and unnecessary braces.
Input
{ } if (x) { }
Output
; // removed
### Single statement block unwrapping
**Mode:** `--minify-syntax` Removes unnecessary braces around single statements.
Input
if (condition) { doSomething(); }
Output
if(condition)doSomething();
### TypeScript enum inlining
**Mode:** `--minify-syntax` Inlines TypeScript enum values at compile time.
Input
enum Color { Red, Green, Blue } const x = Color.Red;
Output
const x=0;
### Pure annotation support
**Mode:** Always active Respects `/*@__PURE__*/` annotations for tree shaking.
Input
const x = /@PURE/ expensive(); // If x is unused...
Output
// removed entirely
### Identifier renaming
**Mode:** `--minify-identifiers` Renames local variables to shorter names based on usage frequency.
Input
function calculateSum(firstNumber, secondNumber) { const result = firstNumber + secondNumber; return result; }
Output
function a(b,c){const d=b+c;return d}
**Naming strategy:**
* Most frequently used identifiers get the shortest names (a, b, c…)
* Single letters: a-z (26 names)
* Double letters: aa-zz (676 names)
* Triple letters and beyond as needed
**Preserved identifiers:**
* JavaScript keywords and reserved words
* Global identifiers
* Named exports (to maintain API)
* CommonJS names: `exports`, `module`
### Whitespace removal
**Mode:** `--minify-whitespace` Removes all unnecessary whitespace.
Input
function add(a, b) { return a + b; } let x = 10;
Output
function add(a,b){return a+b;}let x=10;
### Semicolon optimization
**Mode:** `--minify-whitespace` Inserts semicolons only when necessary.
Input
let a = 1; let b = 2; return a + b;
Output
let a=1;let b=2;return a+b
### Operator spacing removal
**Mode:** `--minify-whitespace` Removes spaces around operators.
Input
a + b x = y * z foo && bar || baz
Output
a+b x=y*z foo&&bar||baz
**Mode:** `--minify-whitespace` Removes comments except important license comments.
Input
// This comment is removed /* So is this / /! But this license comment is kept / function test() { / inline comment */ }
Output
/*! But this license comment is kept */ function test(){}
### Object and array formatting
**Mode:** `--minify-whitespace` Removes whitespace in object and array literals.
Input
const obj = { name: "John", age: 30 }; const arr = [1, 2, 3];
Output
const obj={name:"John",age:30};const arr=[1,2,3];
### Control flow formatting
**Mode:** `--minify-whitespace` Removes whitespace in control structures.
Input
if (condition) { doSomething(); } for (let i = 0; i < 10; i++) { console.log(i); }
Output
if(condition)doSomething();for(let i=0;i<10;i++)console.log(i);
### Function formatting
**Mode:** `--minify-whitespace` Removes whitespace in function declarations.
Input
function myFunction(param1, param2) { return param1 + param2; } const arrow = (a, b) => a + b;
Output
function myFunction(a,b){return a+b}const arrow=(a,b)=>a+b;
### Parentheses minimization
**Mode:** Always active Only adds parentheses when necessary for operator precedence.
Input
(a + b) * c a + (b * c) ((x))
Output
(a+b)c a+bc x
### Property mangling
**Mode:** `--minify-identifiers` (with configuration) Renames object properties to shorter names when configured.
Input
obj.longPropertyName
Output (with property mangling enabled)
obj.a
### Template literal value folding
**Mode:** `--minify-syntax` Converts non-string interpolated values to strings and folds them into the template.
Input
hello ${123}
value: ${true}
result: ${null}
status: ${undefined}
big: ${10n}
Output
"hello 123" "value: true" "result: null" "status: undefined" "big: 10"
### String length constant folding
**Mode:** `--minify-syntax` Evaluates `.length` property on string literals at compile time.
Input
"hello world".length "test".length
Output
11 4
### Constructor call simplification
**Mode:** `--minify-syntax` Simplifies constructor calls for built-in types.
Input
new Object() new Object(null) new Object({a: 1}) new Array() new Array(x, y)
Output
{} {} {a:1} [] [x,y]
### Single property object inlining
**Mode:** `--minify-syntax` Inlines property access for objects with a single property.
Input
({fn: () => console.log('hi')}).fn()
Output
(() => console.log('hi'))()
### String charCodeAt constant folding
**Mode:** Always active Evaluates `charCodeAt()` on string literals for ASCII characters.
Input
"hello".charCodeAt(1) "A".charCodeAt(0)
Output
101 65
### Void 0 equality to null equality
**Mode:** `--minify-syntax` Converts loose equality checks with `void 0` to `null` since they’re equivalent.
Input
x == void 0 x != void 0
Output
x == null x != null
### Negation operator optimization
**Mode:** `--minify-syntax` Moves negation operator through comma expressions.
Input
-(a, b) -(x, y, z)
Output
a,-b x,y,-z
### Import.meta property inlining
**Mode:** Bundle mode Inlines `import.meta` properties at build time when values are known.
Input
import.meta.dir import.meta.file import.meta.path import.meta.url
Output
"/path/to/directory" "filename.js" "/full/path/to/file.js" "file:///full/path/to/file.js"
### Variable declaration merging
**Mode:** `--minify-syntax` Merges adjacent variable declarations of the same type.
Input
let a = 1; let b = 2; const c = 3; const d = 4;
Output
let a=1,b=2; const c=3,d=4;
### Expression statement merging
**Mode:** `--minify-syntax` Merges adjacent expression statements using comma operator.
Input
console.log(1); console.log(2); console.log(3);
Output
console.log(1),console.log(2),console.log(3);
### Return statement merging
**Mode:** `--minify-syntax` Merges expressions before return with comma operator.
Input
console.log(x); return y;
Output
return console.log(x),y;
### Throw statement merging
**Mode:** `--minify-syntax` Merges expressions before throw with comma operator.
Input
console.log(x); throw new Error();
Output
throw(console.log(x),new Error());
### TypeScript enum cross-module inlining
**Mode:** `--minify-syntax` (bundle mode) Inlines enum values across module boundaries.
Input
// lib.ts export enum Color { Red, Green, Blue }
// Input (main.ts) import { Color } from './lib'; const x = Color.Red;
Output
const x=0;
### Computed property enum inlining
**Mode:** `--minify-syntax` Inlines enum values used as computed object properties.
Input
enum Keys { FOO = 'foo' } const obj = { [Keys.FOO]: value }
Output
const obj={foo:value}
### String number to numeric index
**Mode:** `--minify-syntax` Converts string numeric property access to numeric index.
Input
obj["0"] arr["5"]
Output
obj[0] arr[5]
### Arrow function body shortening
**Mode:** Always active Uses expression body syntax when an arrow function only returns a value.
Input
() => { return x; } (a) => { return a + 1; }
Output
() => x a => a + 1
### Object property shorthand
**Mode:** Always active Uses shorthand syntax when property name and value identifier match.
Input
{ x: x, y: y } { name: name, age: age }
Output
{ x, y } { name, age }
### Method shorthand
**Mode:** Always active Uses method shorthand syntax in object literals.
Input
{ foo: function() {}, bar: async function() {} }
Output
{ foo() {}, async bar() {} }
### Drop debugger statements
**Mode:** `--drop=debugger` Removes `debugger` statements from code.
Input
function test() { debugger; return x; }
Output
function test(){return x}
### Drop console calls
**Mode:** `--drop=console` Removes all `console.*` method calls from code.
Input
console.log("debug"); console.warn("warning"); x = console.error("error");
Output
void 0; void 0; x=void 0;
### Drop custom function calls
**Mode:** `--drop=<name>` Removes calls to specified global functions or methods.
Input
assert(condition); obj.assert(test);
Output with --drop=assert
void 0; void 0;
## Keep Names
When minifying identifiers, you may want to preserve original function and class names for debugging purposes. Use the `--keep-names` flag:
bun build ./index.ts --minify --keep-names --outfile=out.js
Or in the JavaScript API:
await Bun.build({ entrypoints: ["./index.ts"], outdir: "./out", minify: { identifiers: true, keepNames: true, }, });
This preserves the `.name` property on functions and classes while still minifying the actual identifier names in the code.
## Combined Example
Using all three minification modes together:
input.ts (158 bytes)
const myVariable = 42;
const myFunction = () => { const isValid = true; const result = undefined; return isValid ? myVariable : result; };
const output = myFunction();
output.js
// Output with --minify (49 bytes, 69% reduction) const a=42,b=()=>{const c=!0,d=void 0;return c?a:d},e=b();
## When to Use Minification
**Use `--minify` for:**
* Production bundles
* Reducing CDN bandwidth costs
* Improving page load times
**Use individual modes for:**
* **`--minify-whitespace`:** Quick size reduction without semantic changes
* **`--minify-syntax`:** Smaller output while keeping readable identifiers for debugging
* **`--minify-identifiers`:** Maximum size reduction (combine with `--keep-names` for better stack traces)
**Avoid minification for:**
* Development builds (harder to debug)
* When you need readable error messages
* Libraries where consumers may read the source