Bun 是一款集 JavaScript 运行时、捆绑程序、转换器和包管理器于一体的超快 JavaScript 程序。下面是最近几次发布的版本主要特性回顾:
- v1.0.0 - Bun 的第一个稳定版本!
- ...
- v1.0.26 修复了 30 个错误,在
bun:sqlite
中添加了对多语句查询的支持,使bun --watch
在长时间运行的会话中更加可靠,Bun.FileSystemRouter
现在支持 64 个以上的路由,修复了expect().toStrictEqual()
的一个错误,修复了error.stack
的 2 个错误,提高了 Node.js 的兼容性。 - v1.0.27 修正了 72 个 bug,Bun Shell 支持在非零退出代码时抛出,使用异步生成器生成流响应体,提高了
fetch()
的可靠性,http2 客户端,Bun.Glob
修正。修复了 Linux 上bun --watch
的回归。改进 Node.js 兼容性。 - v1.0.28 修复了 6 个错误。修复了影响 Prisma 和 Astro、
node:events
、node:readline
和node:http2
的错误。修复了 Bun Shell 中涉及 stdin 重定向的错误,并修复了bun:test
中test.each
和describe.only
的错误。
2024年02月23日,Bun 1.0.29 正式发布,该版本修复了 8 个错误,重要特性更新如下:
- bunx 更频繁地检查更新
Bun.stringWidth(a)
是流行的"string-width"
软件包的替代品,速度快了约 6,756 倍
bunx 更频繁地检查更新
bunx 与 npx 类似,只是由 bun install 提供动力。它的启动速度比 npx 快 100 倍。
bunx 中的一个缓存失效错误导致它不能像应有的那样频繁检查更新。现在,检测依靠 stat 中的时间戳来确定距离上次检查是否已过去 24 小时,这样更可靠。
同时还明确规定,使用 bunx create-vite@latest 标签将始终检查最新版本,并删除先前安装的版本(如果存在)。
Bun.stringWidth() 比 string-width
包快 6,756 倍
Bun.stringWidth(string) 返回字符串在终端中的可见宽度。当您想知道一个字符串在终端中将占多少列时,此功能非常有用。
js
import { stringWidth } from "bun";
// text
console.log(stringWidth("hello")); // => 5
// emoji
console.log(stringWidth("👋")); // => 2
// ansi colors
console.log(stringWidth("[31mhello[39m")); // => 5
// fullwidth characters
console.log(stringWidth("你好")); // => 4
// graphemes
console.log(stringWidth("👩👩👧👦")); // => 2
它支持 ANSI 转义码、全宽字符、音节和表情符号。它支持 Latin1、UTF-16 和 UTF-8 编码,并对每种编码进行了优化。
string-width
软件包的下载量每周超过 1 亿次。将其作为 Bun 的内置函数,意味着你不需要为这种常见的使用情况安装额外的软件包,而且我们还能对其进行优化。
在这个基准测试中,当 ascii 输入大于 500 个字符时,Bun.stringWidth
的速度是 string-width
的 6756 倍。对于 25,000 个 ascii 或 ansi 字符,速度范围从最差情况下的 48 倍到 137,623 倍不等。
bash
❯ bun string-width.mjs
cpu: 13th Gen Intel(R) Core(TM) i9-13900
runtime: bun 1.0.29 (x64-linux)
benchmark time (avg) (min ... max) p75 p99 p995
------------------------------------------------------------------------------------- -----------------------------
Bun.stringWidth 500 chars ascii 37.09 ns/iter (36.77 ns ... 41.11 ns) 37.07 ns 38.84 ns 38.99 ns
❯ node string-width.mjs
cpu: 13th Gen Intel(R) Core(TM) i9-13900
runtime: node v21.4.0 (x64-linux)
benchmark time (avg) (min ... max) p75 p99 p995
------------------------------------------------------------------------------------- -----------------------------
npm/string-width 500 chars ascii 249,710 ns/iter (239,970 ns ... 293,180 ns) 250,930 ns 276,700 ns 281,450 ns
为了使 Bun.stringWidth
快速运行,在 Zig 中使用优化的 SIMD 指令实现了它,并考虑到了 Latin1、UTF-16 和 UTF-8 编码。它实现了与 string-width
相同的 API,并通过了测试。这也修正了 console.table
中的一个边缘情况。
expect(a).toBeOneOf([a, b, c]) in bun:test
bun:test
获得了一个新的匹配器:toBeOneOf
。当您要检查某个值是否是一系列值之一时,这个工具非常有用。
js
import { test, expect } from "bun:test";
test("my test here", () => {
expect(1).toBeOneOf([1, 2, 3]);
});
其他
修复了影响 Prisma 的内存泄漏。Shell 现在支持高级重定向,如 2>&1、&>。改进 bunx、bun install、WebSocket 客户端和 Bun Shell 的可靠性。