网站首页 > 精选文章 / 正文
大家好,很高兴又见面了,我是"高级前端?进阶?",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!
今天给大家带来的主题是 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 的更新也是非常频繁,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 的绑定以进行源代码管理。
2.4 非 ascii 文件名
以前,Bun 在导入具有非 ascii 文件名的文件时会抛出错误。
bun run .js
// error: FileNotFound reading "/Users/jarred/Desktop/e.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();
修正之后的数据如下:
下面是修正之前的数据:
下面是 Node.js 的数据:
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
Tags:native2ascii
猜你喜欢
- 2025-01-18 大数据Hadoop之——数据仓库Hive
- 2025-01-18 「网络工程师」无线网络AC+AP配置
- 2025-01-18 教你解锁Markdown高级用法,提升写作效率,建议收藏
- 2025-01-18 java做支付接口测试
- 2025-01-18 锐捷-无线AC统一管理AP配置(命令行)一
- 2025-01-18 阿里开源!又一款序列化框架来了,性能炸裂!
- 2025-01-18 Linux文件类基础命令(包含原理讲解)
- 2025-01-18 第三章:JNI类型和数据结构
- 2025-01-18 Blob-对象介绍
- 2025-01-18 多学习才能多赚钱之:c语法与java语法区别