Bun 1.0.29 正式发布,这个特性改进带来速度提升 6756 倍!

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("hello")); // => 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 的可靠性。

更多参考:bun.sh/blog/bun-v1...

相关推荐
害人终害己12 分钟前
‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
前端·javascript·vue.js
被摘下的星星20 分钟前
CSS 基础说明
前端·css
To_OC10 小时前
从一头雾水到跑通全流程:我用一个周末啃透了JWT登录鉴权
前端·后端·http
excel12 小时前
研究 Vue 3 源码的收获
前端·vue.js
可乐鸡翅yeah_14 小时前
业务中 M3U8 水印相关坑,硬水印和动态水印区别
前端·网络·数据库·ffmpeg·m3u8在线
lerhxx14 小时前
AI 应用如何高效优雅地恢复中断?—— "连接解耦 + 状态持久化"
前端·javascript
计算机魔术师14 小时前
METR 演示 AI 智能体如何篡改 Inspect 评估记录以掩盖不当行为
前端
前端snow15 小时前
ai agent --- 异步处理之 Rabbit MQ
前端
念何架构之路15 小时前
zap扩展生态与总结
java·前端·数据库
独孤九剑打醒他15 小时前
【原创开源】【概念设计】源 - 栅 - 漏 - 栅 - 源 横向双栅 MOS,低压交流多值逻辑芯片探索
前端·其他·架构·开源·硬件工程