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...

相关推荐
齐 飞1 分钟前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
神仙别闹18 分钟前
基于tensorflow和flask的本地图片库web图片搜索引擎
前端·flask·tensorflow
aPurpleBerry41 分钟前
JS常用数组方法 reduce filter find forEach
javascript
GIS程序媛—椰子1 小时前
【Vue 全家桶】7、Vue UI组件库(更新中)
前端·vue.js
DogEgg_0011 小时前
前端八股文(一)HTML 持续更新中。。。
前端·html
ZL不懂前端1 小时前
Content Security Policy (CSP)
前端·javascript·面试
乐闻x1 小时前
ESLint 使用教程(一):从零配置 ESLint
javascript·eslint
木舟10091 小时前
ffmpeg重复回听音频流,时长叠加问题
前端
王大锤43912 小时前
golang通用后台管理系统07(后台与若依前端对接)
开发语言·前端·golang
我血条子呢2 小时前
[Vue]防止路由重复跳转
前端·javascript·vue.js