超越Node.js的JavaScript运行环境Bun.js功能特性详解

作者:慢半拍时间:2026-10-30 23:55:32浏览:614

本文深入解析Bun.js这一现代JavaScript运行环境,重点对比其相较于Node.js在启动速度、内存占用及性能上的显著优势。文章详细阐述了Bun内置的打包器、转译器、包管理器及测试运行器如何整合传统开发工具链,并提供与Node.js的兼容性说明、TypeScript支持及Web API实现,旨在为开发者提供高效、低复杂度的前端与后端开发体验。

Bun.js

Bun 是一款面向现代的 JavaScript 运行环境,其定位类似于 Node 和 Deno。其核心特性包括:极快的启动速度、卓越的性能表现以及集成了打包器、转译器和包管理在内的完整工具链。

官方网站地址:https://bun.sh

Bun.js

核心优势

与传统 Node.js 相比,Bun.js 引入了多项新特性和功能,具体包括:

  • 具备更快的启动速度、更低的内存占用以及更完善的异常处理机制。此外,Bun.js 还提供了一系列配套的工具和库以辅助开发。

安装方法

npm install -g bun

更新操作

bun upgrade

Bun 诞生的背景与目标

Bun 的设计目标非常明确:在保留 JavaScript 所有优势的同时,消除开发过程中的缓慢与复杂性。您熟悉的库和框架应当继续正常工作,且无需放弃已有的开发惯例。

然而,由于 Bun 已经内置替代了诸多工具,您需要放弃许多冗余的第三方工具:

作为 Node.js 的即插即用替代品,您不再需要依赖以下工具:

node npx - bunx 的执行速度比 npx 快 5 倍 nodemon - Bun 内置了 watch 模式! dotenv,cross-env - Bun 默认支持读取 .env 文件

转译器 - Bun 原生支持运行 .js,.ts,.cjs,.mjs,.jsx 和 .tsx 文件,这些功能可以替代:

tsc - (建议保留用于类型检查!) babel,.babelrc,@babel/preset-* ts-node,ts-node-esm tsx

打包工具 - Bun 本身是一个高性能的 JavaScript 打包工具,并提供与 esbuild 兼容的插件 API,因此您无需再使用:

esbuild
webpack
parcel,.parcelrc
rollup,rollup.config.js

包管理功能

包管理器 - Bun 是一个与 npm 兼容的包管理工具,提供熟悉的命令行操作。它能读取您的 package.json,并像其他包管理器一样写入 node_modules 目录,从而可以替换:

npm,.npmrc,package-lock.json
yarn,yarn.lock
pnpm,pnpm.lock,pnpm-workspace.yaml
lerna

测试库 - Bun 是一个与 Jest 兼容的测试运行器,支持快照测试、模拟和代码覆盖率统计,因此您不再需要:

jest,jest.config.js
ts-jest,@swc/jest,babel-jest
jest-extended
vitest,vitest.config.ts

尽管这些工具在各自领域表现优异(在大多数情况下),但将它们全部组合使用不可避免地会导致系统脆弱性和缓慢的开发体验。它们执行了大量冗余工作;当运行 jest 时,您的代码会被各种工具解析超过 3 次!而且,用于将所有组件粘合在一起的胶水代码、插件和适配器最终往往会磨损失效。

Bun 作为一个单一的集成工具包,有效避免了这些集成问题。工具包中的每个工具都提供了从性能到 API 设计的最佳开发体验。

JavaScript 运行时基础

Bun 是一个 JavaScript 运行时环境。 Bun 是一个高速的 JavaScript 运行时环境。其目标是让构建软件的体验更快、更少令人沮丧,且更有趣。

兼容性说明

Bun 旨在成为 Node.js 的即插即用替代品。这意味着现有的 Node.js 应用程序和 npm 包可以在 Bun 中正常运行。Bun 内置支持 Node API,包括:

内置模块,如 fs、path 和 net 全局变量,如 __dirname 和 process 以及 Node.js 模块解析算法(例如 node_modules)

虽然与 Node.js 实现完全兼容是不可能的,但是 Bun 可以运行几乎所有现存的 Node.js 应用程序。

Bun 通过了针对 npm 上最受欢迎的 Node.js 包的测试套件的测试。像 Express、Koa 和 Hono 这样的服务器框架可以正常工作。使用最受欢迎的全栈框架构建的应用程序也可以正常运行。这些库和框架共同覆盖了 Node.js 的所有重要 API 面。

性能表现

Bun 运行速度极快,其启动速度比 Node.js 快 4 倍。当运行 TypeScript 文件时,这种差异会被进一步放大,因为 Node.js 需要额外将其转译为可执行的代码。

Bun 运行一个 "hello world" TypeScript 文件的速度比 esbuild 和 Node.js 快 5 倍。

与 Node.js 和其他使用 Google 的 V8 引擎构建的运行时不同,Bun 基于 Apple 的 WebKit 引擎构建。WebKit 是 Safari 浏览器的引擎,每天被数十亿台设备使用。它快速、高效,并经过了几十年的实战测试。

TypeScript 和 JSX 支持

Bun 内置了 JavaScript 转译器。这意味着您可以直接运行 JavaScript、TypeScript,甚至是 JSX/TSX 文件,无需安装任何额外依赖。

TypeScript JSX/TSX

bun index.ts

ESM 和 CommonJS 兼容性

从 CommonJS 到 ES 模块的过渡过程缓慢且充满挑战。在 ESM 推出之后,Node.js 花费了 5 年时间才支持它,且当时需要 --experimental-modules 标志。尽管如此,生态系统仍然充斥着 CommonJS 代码。

Bun 始终同时支持这两种模块系统。您无需担心文件扩展名、.js vs .cjs vs .mjs 的区别,也不需要在 package.json 中包含 "type": "module" 配置。

您甚至可以在同一个文件中使用 import 和 require()。一切都能正常运行。

import lodash from "lodash";
const _ = require("underscore");

Web API 支持

Bun 内置支持浏览器中可用的 Web 标准 API,例如 fetch、Request、Response、WebSocket 和 ReadableStream。

const response = await fetch("https://example.com/");
const text = await response.text();

您不再需要安装像 node-fetch 和 ws 这样的第三方包。Bun 的内置 Web API 是使用原生代码实现的,比第三方替代品更快、更可靠。

热重载功能

Bun 旨在提高开发人员的效率。您可以使用 --hot 参数运行 Bun,以启用热重载功能,当文件发生更改时自动重新加载应用程序。

bun --hot server.ts

与像 nodemon 那样硬重启整个进程的工具不同,Bun 在不终止旧进程的情况下重新加载您的代码。这意味着 HTTP 和 WebSocket 连接不会断开,且应用状态不会丢失。

插件系统

Bun 被设计为高度可定制。

您可以定义插件来拦截导入并执行自定义加载逻辑。插件可以添加对其他文件类型的支持,例如 .yaml 或 .png。插件 API 受 esbuild 启发,这意味着大多数 esbuild 插件在 Bun 中都可以正常工作。

import { plugin } from "bun";
plugin({
  name: "YAML",
  async setup(build) {
    const { load } = await import("js-yaml");
    const { readFileSync } = await import("fs");
    build.onLoad({ filter: /.(yaml|yml)$/ }, (args) => {
      const text = readFileSync(args.path, "utf8");
      const exports = load(text) as Record<string, any>;
      return { exports, loader: "object" };
    });
  },
});

Bun API 详解

Bun 附带高度优化的标准库 API,用于满足开发人员最核心的需求。 与 Node.js API 不同,这些 Bun 原生 API 被设计为快速且易于使用,而非为了向后兼容。

Bun.file()

使用 un.file()在特定路径上惰性加载文件。

const file = Bun.file("package.json");
const contents = await file.text();

它返回一个 BunFile 对象,该对象扩展了 Web 标准文件。可以以各种格式惰性加载文件内容。

const file = Bun.file("package.json");
await file.text(); // string
await file.arrayBuffer(); // ArrayBuffer
await file.blob(); // Blob
await file.json(); // {...}

Bun 读取文件的速度比 Node.js 快 10 倍。

Bun.write()

使用 Bun.write() 是一个灵活的 API,可以将几乎任何数据写入磁盘 —— 字符串、二进制数据、Blob,甚至是 Response 对象。

await Bun.write("index.html", "&lt;html/&gt;");
await Bun.write("index.html", Buffer.from("&lt;html/&gt;"));
await Bun.write("index.html", Bun.file("home.html"));
await Bun.write("index.html", await fetch("https://example.com/"));

Bun 写入文件的速度比 Node.js 快 3 倍。

Bun.serve()

使用Bun.serve()启动 HTTP 服务器、WebSocket 服务器或两者兼备。它基于熟悉的 Web 标准 API,如 Request 和 Response。

Bun.serve({
  port: 3000,
  fetch(request) {
    return new Response("Hello from Bun!");
  },
});

Bun 每秒可处理的请求数量比 Node.js 多 4 倍。

您还可以使用 tls 选项配置 TLS 加密。

Bun.serve({
  port: 3000,
  fetch(request) {
    return new Response("Hello from Bun!");
  },
  tls: {
    key: Bun.file("/path/to/key.pem"),
    cert: Bun.file("/path/to/cert.pem"),
  }
});

为了支持 WebSockets 和 HTTP 并存,只需在 websocket 配置内定义事件处理程序。与 Node.js 不同,Bun 提供了内置的 WebSocket API,无需依赖如 ws 这样的第三方库。

Bun.serve({
  fetch() { ... },
  websocket: {
    open(ws) { ... },
    message(ws, data) { ... },
    close(ws, code, reason) { ... },
  },
});

Bun 每秒可处理的消息数量比 Node.js 上的 ws 库多 5 倍。

bun:sqlite

Bun 内置了对 SQLite 的支持。它具有受 better-sqlite3 启发的 API,但是使用原生代码编写以提高速度。

import { Database } from "bun:sqlite";

const db = new Database(":memory:");
const query = db.query("select 'Bun' as runtime;");
query.get(); // =&gt; { runtime: "Bun" }

Bun 查询 SQLite 的速度可以比 Node.js 上的 better-sqlite3 快 4 倍。

Bun.password

Bun 还支持常见但复杂的 API,这些功能通常不需要开发者自己实现。

您可以使用 un.password使用`bcrypt 或 argon2 哈希和验证密码,无需引入外部依赖项。

const password = "super-secure-pa$word";
const hash = await Bun.password.hash(password);
// => $argon2id$v=19$m=65536,t=2,p=1$tFq+9AVr1bfPxQdh...
const isMatch = await Bun.password.verify(password, hash);
// => true

包管理器功能

即使您不将 Bun 用作运行时,Bun 的内置包管理器也可以加速您的开发工作流程。您不再需要盯着 npm 的旋转加载图标等待依赖项安装。

Bun 的操作界面可能看起来像您习惯的包管理器 —

bun install
bun add <package> [--dev|--production|--peer]
bun remove <package>
bun update <package>

Linux 环境示例

Bun.js

Bun.js 支持 Windows 操作系统。Bun.js 基于 Node.js,因此可以在支持 Node.js 的所有操作系统上运行,包括 Windows、macOS 和 Linux。您可以在 Windows 上使用 Bun.js 来开发和运行 JavaScript 应用程序,而且其性能和功能与在其他操作系统上使用 Bun.js 相同。

console.log("Hello, world!");
function add(num1,num2){
  return num1+num2;
}
console.log(add(1,2))

Bun.js

读取文件的服务示例

好的,以下是一个使用 Bun.js 创建读取文件的本地 HTTP 服务器的示例:

  • 首先,您需要安装 Bun.js。您可以在命令行中运行以下命令来安装最新版本的 Bun.js:
npm install -g bun
  • 接下来,您可以创建一个新的 JavaScript 文件,例如 server.js,并在其中编写一些代码。例如,以下代码将创建一个本地 HTTP 服务器,并在访问 http://localhost:3000/ 时返回一个文本文件的内容:
const { serve } = require("bun");
const { readFileSync } = require("fs");
serve({
  port: 3000,
  fetch(request) {
    const fileContent = readFileSync("./file.txt", "utf8");
    return new Response(fileContent);
  },
});
  • 然后,您需要在与 server.js 文件相同的目录下创建一个名为 file.txt 的文本文件,并在其中添加一些文本内容。
  • 最后,您可以使用 Bun.js 运行这个 JavaScript 文件。在命令行中,导航到包含 server.js 文件的目录,并运行以下命令:
bun server.js

Bun.js 将会运行 server.js 文件,并在控制台中输出 "Listening on http://localhost:3000/"。现在,可以在浏览器中访问 http://localhost:3000/,并将会看到 file.txt 文件的内容。

以上就是超越Node.js的JavaScript运行环境Bun.js功能特性详解的详细内容,更多关于JavaScript运行环境Bun.js的资料请关注本站其它相关文章!

作者最新文章