Bun 入门教程:下一代 JavaScript 运行时

Bun 入门教程:下一代 JavaScript 运行时

一行命令安装,一个工具替代整个前端工具链,Bun 正在以惊人的速度改变 JavaScript 开发者的工作方式。

如果你问前端开发者最希望改进开发流程的哪个部分,很多人会提到“减少工具链复杂性”。Bun 正是为了这个目标而生——一个用 Zig 语言编写、基于 JavaScriptCore 引擎的全新 JavaScript 运行时。

它的速度比 Node.js 快 4 倍,比 npm 快约 28 倍,并且将运行时、包管理器、打包工具和测试运行器全部集成在一个可执行文件中。


01 Bun 的核心优势

在 Node.js 主导 JavaScript 后端开发十多年后,Bun 带来了一场效率革命。它不仅是一个运行时,更是一套完整的开发工具链。

Bun 的构建理念很直接:用一个高度优化的工具解决 JavaScript 开发中的多种需求

性能飞跃是 Bun 最引人注目的特点。与使用 V8 引擎的 Node.js 不同,Bun 采用 Safari 浏览器使用的 JavaScriptCore 引擎。

这种设计选择,加上 Zig 语言带来的系统级优化,使得 Bun 在启动速度和内存使用方面都有显著提升。

Bun 最吸引人的特性包括:原生 TypeScript 支持(无需任何配置或构建步骤)、兼容 Node.js API 和 npm 包一体化工具链(运行时、包管理器、打包工具、测试运行器)。

02 Bun 与其他工具对比

为了直观展示 Bun 的优势,我们将其与常见的开发工具进行对比:

类别 Bun Node.js Deno 其他工具
运行时 基于 JavaScriptCore,支持直接运行 .ts、.jsx、.tsx 文件 基于 V8 引擎,需要工具转译 TypeScript 基于 V8 引擎,内置 TypeScript 支持 -
包管理器 内置,速度极快(比 npm 快约 28 倍) npm(默认),成熟但较慢 内置,兼容 npm Yarn、pnpm
打包工具 内置快速原生打包器 需要第三方工具(如 webpack) 内置基础打包功能 Webpack、Vite、esbuild
测试运行器 内置,兼容 Jest 语法 需要第三方框架(如 Jest) 内置测试运行器 Jest、Vitest

Bun 的独特之处在于将这四个功能集成在一个工具中,避免了不同工具间的配置冲突和兼容性问题。

03 快速开始:安装与设置

安装 Bun 非常简单,一条命令即可完成。Bun 支持 macOS、Linux 和 WSL。

打开终端,运行以下命令:

curl -fsSL https://bun.sh/install | bash

安装完成后,可以通过以下命令验证安装并查看版本:

bun --version

如果需要升级 Bun 到最新版本,只需运行:

bun upgrade

对于想要尝试最新功能的开发者,还可以安装 canary 版本:

bun upgrade --canary

Bun 也提供了其他安装方式,如通过 Homebrew(macOS)或下载预构建的二进制文件(Windows)。虽然 Bun 对 Windows 的原生支持还在完善中,但在 WSL 环境下可以完美运行。

04 常用 Bun 命令速查表

命令 说明
bun init 初始化一个新的 Bun 项目
bun run <file> 运行 JavaScript/TypeScript 文件
bun install 安装项目所有依赖
bun add <package> 添加一个生产依赖包
bun add -d <package> 添加一个开发依赖包
bun remove <package> 移除一个包
bun update 更新所有依赖到最新版本
bun test 运行测试(兼容 Jest 语法)
bun build <entry> 打包应用
bun --hot <file> 以热重载模式运行文件
bun --watch <file> 以文件监听模式运行
bun upgrade 将 Bun 升级到最新版本

05 第一个 Bun 项目:HTTP 服务器

让我们通过创建一个简单的 HTTP 服务器来体验 Bun 的开发流程。首先,创建一个新项目目录并初始化:

mkdir bun-quickstart
cd bun-quickstart
bun init

bun init 命令会启动一个交互式向导,创建项目的基本结构。对于这个示例,你可以直接按回车键接受所有默认选项。

完成后,会生成以下文件:package.json(项目配置)、index.ts(TypeScript 入口文件)、tsconfig.json(TypeScript 配置)等。

接下来,打开 index.ts 文件,输入以下代码创建 HTTP 服务器:

const server = Bun.serve({
  port: 3000,
  fetch(req) {
    return new Response('Bun!');
  },
});

console.log(`Listening on http://localhost:${server.port} ...`);

这段代码创建了一个监听 3000 端口的服务器,对所有请求返回“Bun!”文本。

运行这个服务器只需一个命令:

bun index.ts

现在访问 http://localhost:3000,你应该能看到“Bun!”的响应。这就是 Bun 的基本使用流程——简洁、直观、无需复杂配置。

06 Bun 与 TypeScript:无缝支持

Bun 对 TypeScript 的原生支持是其一大亮点。与 Node.js 不同,Bun 不需要任何额外的转译步骤或配置就能直接运行 TypeScript 文件。

如果你在现有项目中集成 Bun,可能会遇到 Bun 全局变量的类型错误。解决这个问题很简单:

首先,安装 Bun 的类型定义:

bun add -d @types/bun

然后,在 tsconfig.json 中添加以下配置:

{
  "compilerOptions": {
    "lib": ["ESNext"],
    "target": "ESNext",
    "module": "Preserve",
    "moduleDetection": "force",
    "moduleResolution": "bundler",
    "allowImportingTsExtensions": true,
    "verbatimModuleSyntax": true,
    "noEmit": true
  }
}

这种配置使 TypeScript 编译器能够正确识别 Bun 的 API,同时保持最佳性能。

07 Bun 的包管理:极速安装

Bun 内置的包管理器是其速度优势的集中体现。它完全兼容 npm 的 package.json 格式,意味着你可以无缝迁移现有项目。

为了提升开发体验,可以在 package.json 中添加脚本:

{
  "scripts": {
    "start": "bun --hot index.ts",
    "dev": "bun --watch index.ts",
    "test": "bun test"
  }
}

使用 bun --hot 命令可以启用热重载功能,当文件变化时自动重启服务器而不丢失连接状态。

bun --watch 则会在文件变化时自动重启进程。这些功能大大提升了开发效率。

08 Bun 的高级功能

除了基础运行时和包管理功能,Bun 还提供了许多高级功能,进一步简化开发流程。

内置测试框架:Bun 提供了与 Jest 兼容的测试运行器,可以通过 bun test 命令使用。你不需要额外安装测试框架,也不需要复杂配置。

强大的打包工具:Bun 内置的打包器可以将 TypeScript 和 JavaScript 打包成优化后的文件:

bun build ./src/index.tsx --outdir ./build --minify

或者通过 JavaScript API 使用:

await Bun.build({
  entrypoints: ['./src/index.tsx'],
  outdir: './build',
  minify: true,
});

丰富的内置 API:Bun 提供了一系列高度优化的原生 API,包括文件 I/O、哈希计算、SQLite 集成等。

例如,读写文件非常简单:

const file = Bun.file('package.json');
const pkg = await file.json();
await Bun.write(file, JSON.stringify(pkg, null, 2));

09 实际项目示例:博客 API

让我们通过一个更实际的例子—构建一个简单的博客 API—来展示 Bun 在实际开发中的应用。

首先,初始化项目并安装所需依赖:

bun init blog-api
cd blog-api
bun add elysia knex dotenv pg

这里我们使用 Elysia(一个高性能的 Bun Web 框架)和 Knex(SQL 查询构建器)。

设置数据库连接:

// db.js
const knex = require('knex');
const knexFile = require('./knexfile.js');

const environment = process.env.NODE_ENV || 'development';
export default knex(knexFile[environment]);

创建博客文章模型和 API 端点:

// index.ts
import { Elysia } from 'elysia';
import db from './db';

const app = new Elysia();

// 获取所有文章
app.get('/posts', async () => {
  const posts = await db.select('*').from('blog');
  return new Response(JSON.stringify(posts));
});

// 创建新文章
app.post('/posts', async (context) => {
  const { title, content, author } = context.body;
  const post = await db('blog').insert({ title, content, author });
  return new Response(JSON.stringify(post));
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

这个示例展示了 Bun 在实际项目中的使用模式:简洁的 API、直接的异步处理和完整的类型安全。

10 开发实践与优化建议

Bun 虽然强大,但作为相对较新的工具,在实践中需要注意以下几点:

环境隔离:由于 Bun 更新迅速,建议使用 Docker 进行环境隔离,避免污染本地环境。可以创建一个 Docker 辅助函数:

bun() {
  local port=${1:-8080}
  docker run -it --rm -w /app -v "$(pwd)":/app -p ${port}:${port} --init oven/bun bun "${@:2}"
}

性能优化:Bun 提供了一些标志来优化性能:

  • --smol:使用更少内存,但更频繁地进行垃圾回收
  • --preload:在其他模块加载前预先导入模块
  • --prefer-offline:优先使用本地缓存

调试支持:Bun 内置了强大的调试功能:

  • --inspect:激活调试器
  • --inspect-brk:在第一行代码处设置断点
  • --inspect-wait:等待调试器连接

IDE 集成:主流 IDE 如 WebStorm 已经提供了对 Bun 的良好支持,可以直接从编辑器运行和调试 Bun 项目。


Bun 项目在 GitHub 上已经获得了超过 8 万颗星,这个数字背后是开发者对更简单、更高效开发体验的渴望。

从简单的脚本到完整的企业级应用,Bun 正逐渐证明自己不仅是 Node.js 的替代品,更是 JavaScript 工具链进化的下一个方向。

参考资源

  1. Bun 官方文档 - 最全面的 API 参考和指南
  2. Bun GitHub 仓库 - 源代码和最新发布
  3. JavaScript 运行时的未来:Bun 与 Node.js、Deno 的比较 - 技术深度分析文章
posted @ 2026-01-11 07:52  thxis0  阅读(108)  评论(0)    收藏  举报