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

相关推荐
Yolanda9411 小时前
【项目经验】钉钉免密登录实现
前端·javascript·钉钉
2601_9496130211 小时前
flutter_for_openharmony家庭药箱管理app实战+药品详情实现
java·前端·flutter
摘星编程11 小时前
在OpenHarmony上用React Native:collapsable节点优化策略
javascript·react native·react.js
We་ct11 小时前
LeetCode 15. 三数之和:排序+双指针解法全解析
前端·算法·leetcode·typescript
美狐美颜SDK开放平台11 小时前
直播场景下抖动特效的实现方案:美颜sdk开发经验分享
前端·人工智能·美颜sdk·直播美颜sdk·视频美颜sdk
Beginner x_u11 小时前
JavaScript 原型、原型链与原型继承的核心机制解析
开发语言·javascript·原型模式·原型原型链
草青工作室12 小时前
java-FreeMarker3.4自定义异常处理
java·前端·python
美狐美颜sdk12 小时前
抖动特效在直播美颜sdk中的实现方式与优化思路
前端·图像处理·人工智能·深度学习·美颜sdk·直播美颜sdk·美颜api
Mr Xu_12 小时前
Vue3 + Element Plus 实战:App 版本管理后台——动态生成下载二维码与封装文件上传
前端·javascript·vue.js
闻哥12 小时前
从 AJAX 到浏览器渲染:前端底层原理与性能指标全解析
java·前端·spring boot·ajax·okhttp·面试