Skip to main content
Bun 包含一个快速的 JavaScript 和 TypeScript 压缩器,可以将包体积减少 80% 或更多(取决于代码库),并使输出代码运行更快。该压缩器执行数十种优化,包括常量折叠、死代码消除和语法转换。与其他压缩器不同,Bun 的压缩器使 bun build 运行更快,因为需要打印的代码更少。

CLI 用法

启用所有压缩

使用 --minify 标志启用所有压缩模式:
--minify 标志启用:
  • 空白压缩
  • 语法压缩
  • 标识符压缩

生产模式

--production 标志自动启用压缩:
--production 标志同时:
  • process.env.NODE_ENV 设置为 production
  • 启用生产模式的 JSX 导入和转换

精细控制

单独启用特定的压缩模式:

JavaScript API

编程式使用 Bun 的打包器时,通过 minify 选项配置压缩:
要精细控制,传入一个对象:

压缩模式

Bun 的压缩器有三个独立的模式,可以单独或一起启用。

空白压缩(--minify-whitespace

移除输出中的所有不必要空白、换行和格式。

语法压缩(--minify-syntax

将 JavaScript 语法重写为更短的等效形式,并执行常量折叠、死代码消除和其他优化。

标识符压缩(--minify-identifiers

使用基于频率的优化将局部变量和函数名重命名为更短的标识符。

所有转换

布尔字面量缩短

模式: --minify-syntax 将布尔字面量转换为更短的表达式。
输入
输出

布尔代数优化

模式: --minify-syntax 使用逻辑规则简化布尔表达式。
输入
输出

undefined 缩短

模式: --minify-syntax undefined 替换为更短的等效形式。
输入
输出

undefined 相等优化

模式: --minify-syntax 优化与 undefined 的宽松相等检查。
输入
输出

Infinity 缩短

模式: --minify-syntax 将 Infinity 转换为数学表达式。
输入
输出

typeof 优化

模式: --minify-syntax 优化 typeof 比较并评估常量 typeof 表达式。
输入
输出

数字格式化

模式: --minify-syntax 以最紧凑的表示形式格式化数字。
输入
输出

算术常量折叠

模式: --minify-syntax 在编译时评估算术运算。
输入
输出

位运算常量折叠

模式: --minify-syntax 在编译时评估位运算。
输入
输出

字符串拼接

模式: --minify-syntax 在编译时合并字符串字面量。
输入
输出

字符串索引

模式: --minify-syntax 在编译时评估字符串字符访问。
输入
输出

模板字面量折叠

模式: --minify-syntax 评估带有常量表达式的模板字面量。
输入
输出

模板字面量转字符串

模式: --minify-syntax 将没有替换内容的模板字面量转换为常规字符串。
输入
输出

字符串引号优化

模式: --minify-syntax 选择最佳引号字符以最小化转义。
输入
输出

数组展开内联

模式: --minify-syntax 内联带有常量数组的数组展开操作。
输入
输出

数组索引

模式: --minify-syntax 在编译时评估常量数组访问。
输入
输出

属性访问优化

模式: --minify-syntax 在可能的情况下将方括号表示法转换为点号表示法。
输入
输出

比较折叠

模式: --minify-syntax 在编译时评估常量比较。
输入
输出

逻辑运算折叠

模式: --minify-syntax 使用常量值简化逻辑运算。
输入
输出

空值合并折叠

模式: --minify-syntax 使用已知值评估空值合并。
输入
输出

逗号表达式简化

模式: --minify-syntax 从逗号序列中移除无副作用的表达式。
输入
输出

三元条件折叠

模式: --minify-syntax 使用常量条件评估条件表达式。
输入
输出

一元表达式折叠

模式: --minify-syntax 简化一元运算。
输入
输出

双重否定移除

模式: --minify-syntax 移除不必要的双重否定。
输入
输出

if 语句优化

模式: --minify-syntax 使用常量条件优化 if 语句。
输入
输出

死代码消除

模式: --minify-syntax 移除不可达代码和无副作用的代码。
输入
输出

不可达分支移除

模式: --minify-syntax 移除永远不会执行的分支。
输入
输出

空块移除

模式: --minify-syntax 移除空块和不必要的花括号。
输入
输出

单语句块解包

模式: --minify-syntax 移除单个语句周围的不必要花括号。
输入
输出

TypeScript 枚举内联

模式: --minify-syntax 在编译时内联 TypeScript 枚举值。
输入
输出

Pure 注解支持

模式: 始终激活 尊重用于 tree shaking(移除未使用代码)的 /*@__PURE__*/ 注解。
输入
输出

标识符重命名

模式: --minify-identifiers 根据使用频率将局部变量重命名为更短的名称。
输入
输出
命名策略:
  • 最频繁使用的标识符获得最短名称(a、b、c……)
  • 单字母:a-z(26 个名称)
  • 双字母:aa-zz(676 个名称)
  • 根据需要三字母及以上
保留的标识符:
  • JavaScript 关键字和保留字
  • 全局标识符
  • 命名导出(以维护 API)
  • CommonJS 名称:exportsmodule

空白移除

模式: --minify-whitespace 移除所有不必要的空白。
输入
输出

分号优化

模式: --minify-whitespace 仅在必要时插入分号。
输入
输出

运算符间距移除

模式: --minify-whitespace 移除运算符周围的空格。
输入
输出

注释移除

模式: --minify-whitespace 移除注释,但保留重要的许可证注释。
输入
输出

对象和数组格式化

模式: --minify-whitespace 移除对象和数组字面量中的空白。
输入
输出

控制流格式化

模式: --minify-whitespace 移除控制结构中的空白。
输入
输出

函数格式化

模式: --minify-whitespace 移除函数声明中的空白。
输入
输出

括号最小化

模式: 始终激活 仅在运算符优先级需要时添加括号。
输入
输出

模板字面量值折叠

模式: --minify-syntax 将非字符串插值值转换为字符串并折叠到模板中。
输入
输出

字符串长度常量折叠

模式: --minify-syntax 在编译时评估字符串字面量上的 .length 属性。
输入
输出

构造函数调用简化

模式: --minify-syntax 简化内置类型的构造函数调用。
输入
输出

单属性对象内联

模式: --minify-syntax 内联只有一个属性的对象的属性访问。
输入
输出

字符串 charCodeAt 常量折叠

模式: 始终激活 在 ASCII 字符的字符串字面量上评估 charCodeAt()
输入
输出

Void 0 相等转 null 相等

模式: --minify-syntax void 0 的宽松相等检查转换为 null,因为它们是等价的。
输入
输出

否定运算符优化

模式: --minify-syntax 将否定运算符移过逗号表达式。
输入
输出

Import.meta 属性内联

模式: 打包模式 在知道值时于构建时内联 import.meta 属性。
输入
输出

变量声明合并

模式: --minify-syntax 合并同类型相邻的变量声明。
输入
输出

表达式语句合并

模式: --minify-syntax 使用逗号运算符合并相邻的表达式语句。
输入
输出

return 语句合并

模式: --minify-syntax 使用逗号运算符合并 return 前的表达式。
输入
输出

throw 语句合并

模式: --minify-syntax 使用逗号运算符合并 throw 前的表达式。
输入
输出

TypeScript 枚举跨模块内联

模式: --minify-syntax(打包模式) 跨模块边界内联枚举值。
输入
输出

计算属性枚举内联

模式: --minify-syntax 内联用作计算对象属性的枚举值。
输入
输出

箭头函数体缩短

模式: --minify-syntax 当箭头函数只返回一个值时使用表达式体语法。
输入
输出

对象属性简写

模式: 始终激活 当属性名和值标识符匹配时使用简写语法。
输入
输出

丢弃 debugger 语句

模式: --drop=debugger 从代码中移除 debugger 语句。
输入
输出

丢弃 console 调用

模式: --drop=console 从代码中移除所有 console.* 方法调用。
输入
输出

丢弃自定义函数调用

模式: --drop=<name> 移除对指定全局函数及其方法的调用。
输入
使用 --drop=assert 输出

保留名称

要在压缩标识符时保留原始函数和类名以便调试,使用 --keep-names 标志:
或在 JavaScript API 中:
--keep-names 保留函数和类上的 .name 属性,同时仍然压缩标识符本身。

组合示例

同时使用所有三种压缩模式:
input.ts (158 bytes)
output.js

何时使用压缩

对以下场景使用 --minify
  • 生产包
  • 减少 CDN 带宽成本
  • 改善页面加载时间
对以下场景使用单独模式:
  • --minify-whitespace 在不改变语义的情况下减小体积
  • --minify-syntax 减小输出,同时保留可读标识符以便调试
  • --minify-identifiers 最大体积缩减(与 --keep-names 结合以获得更好的堆栈跟踪)
应避免压缩的场景:
  • 开发构建(更难调试)
  • 需要可读错误消息时
  • 消费者可能阅读源代码的库