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

相关推荐
mldong5 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排6 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60616 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角7 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!7 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰8 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi9 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen10 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马10 小时前
AI源码分析:拆解模型底层实现逻辑
前端
BillKu11 小时前
全局样式变量:CSS 自定义属性(--border-color)和SCSS 变量($border-color)的说明
javascript·css·scss