Bun v0.6.9 发布!

家好,很高兴又见面了,我是”高级前端‬进阶‬”,由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!

Bun v0.6.9 发布!

今天给大家带来的主题是 Bun v0.6.9 版本的发布,带着大家看看在该版本中 Bun 运行时都带来了那些核心改动。话不多说,直接进入正题!

前言

阿特伍德定律(Atwood's Law)指出,任何可以用 JavaScript 编写的应用程序最终都将用 Javascript 编写。 这个预言是在 Node.js 诞生前两年提出的,结果证明也是超级正确的。 在浏览器上下文之外运行 JavaScript 环境的到来,鼓励开发者开始用纯 JS 编写服务器、CLI,甚至机器学习算法模型。

尽管 Node.js 是在 Server端运行 JavaScript 的实际标准,但并不是每个人都对它超级满意,所以在前端生态才涌现了其他优秀的 JS Runtime,列如 :Deno 、Bun。而 Bun 从一出生就引起了超级大的轰动,号称是最快的运行时。关于 JS 运行时的发展我也一直比较关注,我在头条开了一个合集重点关注前端不同 JavaScript 运行时的发展、新特性。下面是已经发布的部分文章传送门,更多文章可以在我的主页阅读。

  • 《 JS Runtime vs. JS Engine!Deno/Node是运行时!》
  • 《 前有Deno、后有Bun、Node.js已穷途末路?》
  • 《 Node.js、Deno、Bun 6大典型场景性能大PK?》
  • 《 Zig 单挑 Rust、C++!Nodejs对手 Bun 给的勇气?》
  • 《 µWebSockets:性能达 Fastify 8.5x/Socket.IO 10x?》
  • 《 运行时 Bun 又添王炸,支持 Bun宏!》
  • 《 盘点全网最火的6+ JavaScript 运行时!Node/Deno/Bun 在列! 》

本文将尝试解释 Bun v0.6.9 发布带来的诸多改动,话不多说,直接开始!

1.Bun 版本概览

Bun 是采用 Zig 语言编写的高性能 “全家桶” JavaScript 运行时,官方称其为 “all-in-one JavaScript runtime”。

所谓 “all in one”,是由于 Bun 运行时提供了打包、转译、安装和运行 JavaScript & TypeScript 项目的功能,内置原生打包器 (native bundler)、转译器、task runner、npm 客户端,以及 fetch、WebSocket等 Web API。

Bun v0.6.9 发布!

最近 Bun 的更新也是超级频繁,6 月才过一半就发了三个新版本,这引起了我足够的好奇,为什么这么急着发布 Bun v0.6.9?第一,大家一起回顾下 Bun 不同版本功能:

  • v0.6.0 – 介绍 bun build,Bun 的新 JavaScript 打包器。
  • v0.6.2 – 性能提升:JSON.parse 快 20%,代理(Proxy)和参数快 2 倍。
  • v0.6.3 – 实施了 node:vm,对 node:http 和 node:tls 进行了大量修复。
  • v0.6.4 – 实施了 require.cache、process.env.TZ 和快 80% 的 bun test。
  • v0.6.5 – 对 CommonJS 模块的本地支持(以前,Bun 将 CJS 转换为 ESM),
  • v0.6.6 – bun test 改善,包括 Github Actions 支持、test.only()、test.if()、describe.skip() 和 15 个以上的 expect() 匹配器; 还使用 fetch() 流式传输文件上传。
  • v0.6.7 – Node.js 兼容性改善以解锁 Discord.js、Prisma 和 Puppeteer
  • v0.6.8 – Bun.password,bun test 中的函数 mock,以及一个 toMatchObject 期望匹配器。 加上 Bun.serve() 中的实验性检查器模式。

根据官方表明,随着 Bun v0.6.9 的发布,该版本全面减少了 Bun 的内存使用,并修复了打包器/转译器、CommonJS 模块加载、bun run 和 bun install 中的众多错误。

可以通过如下命令快速安装 bun:

npm install -g bun
// npm
curl -fsSL https://bun.sh/install | bash
// curl
brew tap oven-sh/bun
brew install bun
// brew
docker pull oven/bun
docker run --rm --init --ulimit memlock=-1:-1 oven/bun
// docker

如果是升级 bun,直接使用下面命令即可:

bun upgrade

2.Bun v0.6.9 新特性

2.1 Bun.serve() 使用更少的内存来发送字符串

Bun v0.6.9 目前支持 Bun.serve() 中的零拷贝字符串响应主体(Response)。

零拷贝是指计算机执行IO操作时,CPU不需要将数据从一个存储区域复制到另一个存储区域,进而减少上下文切换以及CPU的拷贝时间,是一种IO操作优化技术。

Bun 官方团队还将此优化应用于 Bun.serve() 之外的 Response ,以下代码会克隆 text 两次:

const text = await Bun.file("file.txt").text();
// Copy #1
const response = new Response(text);
// Copy #2
await response.text();

随着 Bun v0.6.9 的发布,Bun 目前不会复制,从而节省内存开销。根据 Bun 官方团队开发者@jarredsumner 的论述,在下一个版本的 Bun 中,使用 Bun 的 HTTP 服务器发送字符串将使用更少的内存。列如用 12 MB 的字符串响应 1000 个请求后,Bun、Deno、Node.js 将会有不同的性能表现,而 Bun 可以遥遥领先其他运行时方案:

  • Bun: 60 MB ram
  • Deno: 425 MB ram
  • Node: 1414 MB ram

2.2 bun install 冷启动使用的内存减少 50%

随着 Bun v0.6.9 的发布,在 bun install 中可以释放更多内存,将 cold install 的内存使用量减少 50%。同时,根据 Bun 官方团队开发者@jarredsumner 的论述,在下一个版本的 Bun 中 bun install(冷)使用的内存可以减少 2 倍

2.3 在 Bun 的运行时导入模块使用更少的内存

在 Bun v0.6.9 版本中,修复了在 Bun 的运行时中导入模块时发生的 Bun 中的一些内存泄漏,并改善了与 JavaScriptCore 的绑定以进行源代码管理。

Bun v0.6.9 发布!

2.4 非 ascii 文件名

以前,Bun 在导入具有非 ascii 文件名的文件时会抛出错误。

bun run .js
// error: FileNotFound reading "/Users/jarred/Desktop/ð.js"

此错误是由打印错误和读取导入标识符名称时 Bun 的 JavaScriptCore 绑定中的错误引起的,在 Bun v0.6.9 版本中修复了这个错误。

2.5 bun test 中的 mock 修正

mockResolvedValue 目前已在 bun test 中修复。以前,mockResolvedValue 在 bun test 中似乎什么都不做。 要使用 mockResolvedValue:

import { mock, test, expect } from "bun:test";

test("hey", async () => {
  const fn = mock.mockResolvedValue(1);

  expect(fn()).toBeInstanceOf(Promise);

  const value = await fn();

  expect(value).toBe(1); // 1
});

返回的 mock 对象缺少 .bind、.apply、.call、.name 和 .length 函数,在 Bun v0.6.9 版本中已得到修复。同时 mock 函数的 .name 会自动从原始函数复制过来。

import { mock, test, expect } from "bun:test";

test("hey", async () => {
  const hey = mock(function yo() {
    return 42;
  });

  expect(hey.name).toBe("yo");
});

2.6 CommonJS require() 中的崩溃已修复

Bun v0.6.9 版本版本修复了导入许多 CommonJS 文件并在文件不再使用后运行垃圾收集器时可能发生的崩溃:

import "lodash/omit.js";
import "lodash/findIndex.js";
import "discord.js";

Bun.gc(true);

这是 CommonJS 模块加载器中的一个错误,无法正确阻止函数被垃圾收集。

2.7 node:crypto 中的内存泄漏已修复

Bun v0.6.9 版本修复了 node:crypto 中的内存泄漏,在以前的 Bun 版本中以下代码每次调用将泄漏大约 192 个字节。

const crypto = require("crypto");

function sha256(buf) {
  return crypto.createHash("sha256").update(buf).digest();
}

async function main() {
  for (var i = 1000000; i >= 0; i--) {
    const buf = Buffer.alloc(2046);
    const hash = sha256(buf);
    if (i % 1000 === 0) {
      await new Promise((r) => setTimeout(r, 20));
      global.gc ? global.gc() : Bun?.gc(true);
    }
  }
}

main();

修正之后的数据如下:

Bun v0.6.9 发布!

下面是修正之前的数据:

Bun v0.6.9 发布!

下面是 Node.js 的数据:

Bun v0.6.9 发布!

3.本文总结

本文主要和大家介绍 Bun v0.6.9 版本发布,带着大家看看在该版本中 Bun 运行时都带来了那些核心改动。信任通过本文的阅读,大家对 Bun v0.6.9 会有一个初步的了解。不过,从我个人的感觉上来看,在这个版本中 Bun v0.6.9 主要聚焦在永恒的性能优化、存量问题的修复上,而且后者占据了很大的比例,不得不让人感叹 Bun 虽然很优秀,但是问题也许多!

由于篇幅有限,关于 Bun 的更多用法和特性文章并没有过多展开,如果有兴趣,可以在我的主页继续阅读,同时文末的参考资料提供了大量优秀文档以供学习。最后,欢迎大家点赞、评论、转发、收藏,您的支持是我不断创作的动力。

参考资料

https://bun.sh/blog/bun-v0.6.9#bugfixes-to-mocks-in-bun-test

https://www.oschina.net/news/245231/bun-v0-6-9-released

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
大发快三输了为什么还有人玩的头像 - 鹿快
评论 共6条

请登录后发表评论