Bun发布1.3.14: Bun.Image、HTTP/3、Rust重写

😲 最让人震惊的是,Bun 把核心实现从 Zig 迁移到了 Rust。
之前 Bun 都是用 Zig 写的,后面还维护了自己的 fork 版本。
由于 Zig 项目有严格的反 AI 贡献政策,Bun 团队用 AI 辅助做的编译器优化无法合并到 Zig 上游,再加上 Zig 语言本身还在快速迭代、经常引入破坏性变更,Bun 最终决定用 Rust 把核心实现给重写了。
今天你会学到这些关键词
| 关键词 | 解释 | | :-- | :-- | | Bun.Image | Bun 内置的图像处理模块,可替代 sharp 进行图片编解码和变换 | | HTTP/3 | 基于 QUIC 协议的新一代 HTTP 协议,延迟更低、连接更稳定 | | Rust | 一门注重内存安全和性能的系统编程语言,Bun 核心已迁移至 Rust | | 全局虚拟存储 | Bun 包管理器的新安装模式,通过全局缓存把预热安装速度提升 7 倍以上 |
Bun 把 v1.3.14 给发布了出来,这可算得上是一次相当重大的更新。这个版本不光带来了内置图像处理能力和 HTTP/3 支持,还把核心实现从 Zig 迁移到了 Rust。与此同时,包安装的性能和稳定性也都得到了进一步的优化。
🖼️ 内置图像处理:Bun.Image
bash
// 示例:将上传的图片缩放并转为 WebP 格式
import { Image } from "bun";
const image = await Image.open("input.jpg");
const thumbnail = await image.resize(800, 600).webp({ quality: 85 }).toBuffer();
// 直接作为 Response 返回
return new Response(new Bun.Image(upload).resize(200).jpeg());
注:Bun.Image 为 Bun 独有模块,Node.js 中可使用 sharp 实现同等功能:
bashconst sharp = require('sharp'); const thumbnail = await sharp("input.jpg").resize(800, 600).webp({ quality: 85 }).toBuffer();
这次更新里最引人注目的特性,恐怕就要数 Bun.Image 了。它的目标很明确,就是要替代 sharp 这类第三方的图像处理库。
开箱即用是它的第一个亮点。你不需要再去安装额外的原生模块,JPEG、PNG、WebP、GIF、BMP、AVIF、HEIC 这些格式的编解码,它都给支持上了(其中 HEIC、AVIF、TIFF 在 macOS 和 Windows 上支持得更好)。
性能更强这一点也挺让人惊喜。处理常见任务,比如缩放、读取元数据这些,它通常能比 sharp 快 20% 以上。尤其是读取元数据这个操作,速度更是快了将近 70 倍。
它还提供了链式调用的 API,跟 sharp 的用法差不多,缩放、旋转、裁剪、格式转换这些操作都能链在一起写。而且 Bun.Image 的实例可以直接作为 Response 给返回回去,Content-Type 它会自动处理好。
建议 在 AI 开发的上下文中明确要求使用 Bun.Image,而不是 sharp。AI 现在默认还是用 sharp 来生一些 icon。
🌐 网络与 HTTP/3
bash
// 示例:开启 HTTP/3 服务器
Bun.serve({
port: 443,
tls: { cert, key },
http3: true,
fetch(req) {
return new Response("hi");
},
});
// 示例:使用 HTTP/2 或 HTTP/3 客户端
const res = await fetch("https://example.com", { protocol: "h2" });
Node.js 中可使用 undici 或 node-fetch 实现 HTTP/2 请求,HTTP/3 支持目前仍在实验阶段。
Bun.serve() 现在可以开启实验性的 HTTP/3 (QUIC) 支持了。在测试环境里头,它的吞吐量达到了约 509K req/s,跟 HTTP/2 基本持平。不过在那些高延迟的网络环境下,HTTP/3 的表现倒是会更优一些。
fetch() 也跟进支持了新协议。你现在可以指定 protocol: "h2" 或者 protocol: "h3" 来使用 HTTP/2 或 HTTP/3。它也支持通过 Alt-Svc 头部自动把连接给升级上去。
目前 HTTP/3 还有一些限制:WebSocket over HTTP/3 还不支持,0-RTT 被禁用了,也不支持 trailer 和 Expect: 100-continue。
🦀 核心重写:从 Zig 到 Rust
bash
// 示例:验证当前 Bun 版本
console.log(Bun.version); // "1.3.14"
这是 v1.3.14 最底层的一个变革了------Bun 的核心实现已经从 Zig 迁移到了 Rust。
Rust 的编译器能够在开发阶段就把内存泄漏、崩溃这类稳定性问题给避免掉,内存安全方面确实更有保障。新版本二进制文件的体积也缩小了约 3-8 MB,Windows 版本更是减少了 17 MB。官方测试表明,重写后的版本在启动速度和内存占用上与原版基本持平,甚至还有点提升。
⚡️ 包管理器与工具链
bash
# bunfig.toml - 启用全局虚拟存储
[install]
globalStore = true
bash
# 示例:使用 --no-orphans 运行脚本
bun --no-orphans run my-script
全局虚拟存储 这个新特性值得好好说一说。它引入了 globalStore=true 这个安装模式,通过全局缓存和虚拟映射文件,把预热安装的速度提升了 7 倍以上,CI/CD 流程这下子能快不少。
--no-orphans 标志也加了进来。Bun 进程结束的时候,它创建的所有子进程也会被正确清理掉,那个长期存在的"孤儿进程"问题总算是给解决了。
fs.watch 被全面重写了,多平台上的性能和可靠性都有提升。比如 Linux 上递归监听现在能追踪到 watch 启动后新创建的目录了,删除后重新创建的文件也能正确触发 change 事件。macOS 上也不再同时启动两个 watcher 线程,线程开销直接减半。node:worker_threads 的稳定性也做了修复和改进。
版本详情可以去官方博客看看:bun.com/blog/bun-v1.3.14
js 的一切都在被慢慢被 rust 接管