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:eventsnode:readlinenode:http2 的错误。修复了 Bun Shell 中涉及 stdin 重定向的错误,并修复了 bun:testtest.eachdescribe.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...

相关推荐
子兮曰2 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰2 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万2 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝2 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋2 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁2 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄2 天前
JavaScript 隐式全局变量解析
javascript
汉堡大王95272 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大2 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师2 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端