Bun CLI:一键通吃的 JavaScript 终极武器

🔥 Bun CLI

用一个命令运行一切 --- TypeScript、React、测试、打包、包管理,统统搞定


引言:告别工具链地狱

你是否厌倦了这个场景?

bash 复制代码
npm install          # 包管理
npm run dev          # 启动开发服务器
npm run build        # 打包
npm test             # 测试
npx tsc --noEmit     # 类型检查
npx prettier --write # 格式化

七个工具、七个命令、七份配置文件。 这就是 Node.js 开发者的日常。

Bun 说:"够了。"

bash 复制代码
bun install    # 包管理(快 20-30x)
bun dev        # 开发服务器 + 热重载
bun build      # 打包(内置)
bun test       # 测试(内置)
bun index.tsx  # 直接运行 TypeScript + React

一个二进制、一套命令、零配置。 这就是 Bun 的 "CLI-Anything" 理念。


一、核心架构:为什么 Bun 能"一键通吃"

1.1 技术栈解析

组件 Bun Node.js 生态
JS 引擎 JavaScriptCore (Safari) V8 (Chrome)
核心语言 Zig C++
Transpiler 原生 Zig 实现 Babel / tsc / swc
包管理器 内置 npm / yarn / pnpm
打包器 内置 webpack / vite / esbuild
测试框架 内置 jest / vitest
Shell 执行 内置 API 需要 child_process

1.2 单二进制设计哲学

Bun 将所有功能集成在一个可执行文件中:

复制代码
bun 可执行文件
├── JavaScriptCore 运行时
├── Zig 原生 Transpiler
├── 包管理器(npm 替代)
├── 打包器(webpack 替代)
├── 测试框架(jest 替代)
└── Shell API(跨平台)

优势

  • 无进程间通信开销
  • 内存共享,零拷贝
  • 部署只需一个文件
  • 启动速度提升 4x

1.3 为什么选择 JavaScriptCore

指标 JSC (Bun) V8 (Node)
启动时间 5ms 20-50ms
内存占用 更低 较高
JIT 优化 适合 CLI 适合长运行

JavaScriptCore 来自 Safari/WebKit,天生适合"启动快、执行快"的 CLI 场景。


二、CLI-Anything:运行一切的魔法

2.1 文件类型支持(开箱即用)

bash 复制代码
# 直接运行,无需配置
bun index.js      # JavaScript
bun index.ts      # TypeScript(无需 tsc)
bun index.jsx     # React JSX(无需 Babel)
bun index.tsx     # React TSX
bun data.json     # JSON 文件
bun script.sh     # Shell 脚本

支持的扩展名
.js .cjs .mjs .ts .tsx .jsx .mts .cts .json .jsonc .json5 .toml .yaml .yml .wasm .node .html .sh

2.2 bun run:脚本执行的瑞士军刀

运行源文件
bash 复制代码
bun run index.tsx
bun index.tsx         # 简写形式(省略 run)

# 传递参数
bun run server.ts --port 3000

# Watch 模式(热重载)
bun --watch run index.tsx

# 减少内存占用
bun --smol run index.tsx
运行 package.json 脚本
bash 复制代码
bun run dev           # 运行 scripts.dev
bun run build         # 运行 scripts.build
bun run               # 查看所有可用脚本

速度对比

操作 Bun npm
run dev 6ms 170ms

28 倍

解析顺序

bun run <name> 按以下顺序查找:

  1. package.json scripts --- bun run build
  2. 源文件 --- bun run src/main.ts
  3. 项目依赖的 bin --- bun run eslint
  4. 系统命令 --- bun run ls

2.3 bunx:一键执行 npm 包

bash 复制代码
# 类似 npx,但快 100x
bunx cowsay "Hello world!"
bunx my-cli --foo bar

# 强制用 Bun 运行(忽略 shebang)
bunx --bun vite

# 指定包名(当 bin 名称与包名不同)
bunx -p @angular/cli ng

工作原理

  • 本地已安装 → 直接运行
  • 未安装 → 自动从 npm 下载并缓存
  • 后续运行 → 使用缓存,秒启动

2.4 Bun Shell:JavaScript 中的 Bash

typescript 复制代码
import { $ } from "bun";

// 执行 shell 命令
await $`echo "Hello World!"`;

// 管道操作
await $`echo "Hello" | wc -w`;

// 重定向
await $`cat < myfile.txt`;
await $`echo bun! > greeting.txt`;

// 与 JavaScript 互操作
const response = await fetch("https://example.com");
await $`cat < ${response} | wc -c`;

// Glob 模式
await $`rm -rf dist/**/*.{js,ts}`;

特性

  • 跨平台(Windows、Linux、macOS)
  • 默认字符串转义(防 shell injection)
  • 支持 JavaScript 对象作为输入输出

2.5 stdin 执行

bash 复制代码
# 从 stdin 读取并执行
echo "console.log('Hello')" | bun run -

# 将 .js 文件当作 TypeScript 运行
bun run - < secretly-typescript.js

三、内置工具链:告别 babel、jest、webpack

3.1 包管理器

bash 复制代码
bun install                    # 安装所有依赖
bun install --production       # 仅生产依赖
bun install --frozen-lockfile  # CI 模式

bun add lodash                 # 添加依赖
bun add -d typescript          # 添加开发依赖
bun add -g prettier            # 全局安装

bun remove lodash              # 移除依赖
bun update                     # 更新依赖
bun outdated                   # 检查过时依赖

命令对照表

Bun npm yarn pnpm
bun install npm install yarn pnpm install
bun add npm i yarn add pnpm add
bun add -d npm i -D yarn add -D pnpm add -D
bun remove npm uninstall yarn remove pnpm remove
bun update npm update yarn upgrade pnpm update

性能对比

操作 Bun npm pnpm
冷缓存安装 基准 20x 更慢 5x 更慢
热缓存安装 基准 30x 更慢 10x 更慢

3.2 测试框架

bash 复制代码
bun test                        # 运行所有测试
bun test --watch                # 监听模式
bun test --coverage             # 覆盖率报告
bun test --bail                 # 首次失败退出
bun test --timeout 5000         # 设置超时
bun test --only                 # 仅运行 .only 标记
bun test --update               # 更新快照

Jest 兼容 API

typescript 复制代码
import { test, expect, describe, beforeEach } from "bun:test";

describe("MyModule", () => {
  beforeEach(() => {
    // setup
  });

  test("example", () => {
    expect(1 + 1).toBe(2);
    expect([1, 2, 3]).toContain(2);
    expect(() => throw Error()).toThrow();
  });

  test.skip("skip this", () => {});
  test.only("only this", () => {});
});

特性

  • Jest 兼容断言
  • 快照测试
  • Mock 功能
  • 默认并行执行
  • 零配置 TypeScript

3.3 打包器

bash 复制代码
bun build ./src/index.ts --outdir ./dist
bun build ./src/index.ts --outfile ./bundle.js
bun build ./src/index.ts --minify        # 压缩
bun build ./src/index.ts --target browser
bun build ./src/index.ts --target node
bun build ./src/index.ts --format esm
bun build ./src/index.ts --sourcemap
bun build ./src/index.ts --external react

目标环境

  • browser --- 浏览器
  • node --- Node.js
  • bun --- Bun 运行时

输出格式

  • esm --- ES Modules
  • cjs --- CommonJS
  • iife --- 立即执行函数

3.4 开发服务器

bash 复制代码
bun dev                  # 启动开发服务器
bun --hot run server.ts  # 热重载

热重载特性

  • 文件变化自动重运行
  • 保持进程状态(可选)
  • 快速重启(< 50ms)

四、Transpiler 深度解析

4.1 工作流程

复制代码
源文件 (TS/TSX)
        ↓
    文件读取
        ↓
    Zig 解析器 (src/js_parser.zig)
        ↓
    AST 转换
  ├── 类型擦除 (Type Stripping)
  ├── JSX → JS 转换
  └── ESM/CommonJS 互操作
        ↓
    代码生成
        ↓
    字节码编译 (JSC)
        ↓
    执行

4.2 类型擦除(Type Stripping)

Bun 不进行完整类型检查,而是"擦除"类型:

typescript 复制代码
// 输入
interface Props { name: string; }
function App({ name }: Props) {
  return <div>Hello, {name}!</div>;
}

// 输出(擦除后)
function App({ name }) {
  return React.createElement("div", null, "Hello, ", name, "!");
}

为什么这样设计

  • 类型检查交给 IDE / tsc --noEmit
  • 运行时只做擦除,极大提速
  • 开发者获得即时反馈

4.3 性能数据

Transpiler TypeScript JSX
Bun (Zig) 最快 最快
esbuild 非常快 非常快
swc
Babel
tsc 最慢 不支持

五、实战案例

5.1 快速创建项目

bash 复制代码
bun init                    # 初始化新项目
bun create react            # 创建 React 项目
bun create next             # 创建 Next.js 项目

5.2 一键开发环境

bash 复制代码
# 安装依赖
bun add react react-dom
bun add -d @types/react

# 创建文件
cat > App.tsx << 'EOF'
export function App() {
  return <h1>Hello Bun!</h1>;
}
EOF

# 运行
bun App.tsx

5.3 测试驱动开发

bash 复制代码
# 创建测试
cat > math.test.ts << 'EOF'
import { test, expect } from "bun:test";

test("addition", () => {
  expect(1 + 1).toBe(2);
});

test("multiplication", () => {
  expect(2 * 3).toBe(6);
});
EOF

# 运行测试(watch 模式)
bun test --watch

5.4 生产构建

bash 复制代码
# 打包
bun build ./src/index.ts --outdir ./dist --minify --sourcemap

# 创建独立可执行文件
bun build ./src/index.ts --compile --outfile my-app
./my-app                   # 直接运行

六、与 Node.js/npm 对比

维度 Bun Node.js
哲学 一体化 Unix 小工具组合
安装速度 20-30x 更快 基准
启动速度 4x 更快 基准
TypeScript 原生支持 需要 tsc
JSX 原生支持 需要 Babel
测试 内置 需要 jest
打包 内置 需要 webpack
配置 零配置 多份配置
生态 新兴 15+ 年成熟

七、迁移指南

7.1 从 npm 迁移

bash 复制代码
# 1. 安装 Bun
curl -fsSL https://bun.sh/install | bash

# 2. 在现有项目运行
bun install              # 自动读取 package.json

# 3. 验证
bun test                 # 运行测试
bun run dev              # 运行开发脚本

7.2 兼容性检查

  • 大多数 npm 包直接兼容
  • 查阅 Node.js Compatibility
  • 原生模块 (.node) 需重新编译
  • 特定 Node.js API 可能有差异

八、参考资料

官方文档

GitHub

技术深潜


结语

Bun 的 CLI-Anything 理念简单而强大:

一个命令、一个工具、一切搞定。

这不是关于"更快"(虽然确实快)。这是关于简化

npm run build && npm test && npm run devbun build && bun test && bun dev

从 7 个工具到 1 个。

从"配置地狱"到"零配置天堂"。

Bun 让 JavaScript 开发回归本质:写代码,运行代码。

相关推荐
该昵称用户已存在4 小时前
拒绝封闭技术栈绑架:MyEMS 开源能源管理平台的架构中立性与兼容性设计
架构·开源
效能革命笔记7 小时前
2026年开源组件治理选型:Gitee SCA如何成为一体化解决方案的推荐之选
gitee·开源
Soari8 小时前
告别商业收费与审核枷锁:深度拆解 Open-Generative-AI,构建 MIT 开源、零过滤的私有化视频生成工作站
人工智能·开源·音视频·私有化部署·sora·ai视频生成·generative-ai
Soari8 小时前
挑战 100ms 延迟极限:深度拆解 dograh,构建企业级开源 WebRTC 实时语音智能体平台
开源·大模型·webrtc·实时音视频·voiceagent·语音智能体·dograh
梦梦代码精9 小时前
深度拆解:上门按摩系统如何成为本地生活“到家时代”的新引擎?
docker·小程序·uni-app·开源·生活·开源软件
爱上纯净的蓝天9 小时前
新手友好型开源项目推荐:开启你的开源之旅
开源
魔乐社区10 小时前
小参数・大码力・易部署 | Qwen3.6-27B上线魔乐社区,基于昇腾的部署教程来了
人工智能·开源·大模型
Languorous.11 小时前
Linux 系统简介——开源世界的基石
linux·运维·开源
Hommy8811 小时前
【剪映小助手】链接提取接口
开源·剪映api·开源剪映小助手·剪辑skills