Bun – 我可以用它做什么?

什么是 Javascript 世界中的新热点 Bun?为什么它这么快,我可以在我的项目中使用它吗?

近年来,Web 开发领域发现,虽然超级风格化的 站和具有大量使用 Javascript 进行的非常丰富的交互的 Web 应用程序可能会吸引用户,但页面的加载时间对用户的影响可能要大一百倍。经验的角度。因此,人们付出了大量努力来减少 站的加载时间指标。许多框架和模式已经(重新)出现以提供解决此问题的方法,例如服务器端渲染和静态站点生成。

进入贾里德萨姆纳。Jarred 注意到在 Node.js 中打印到控制台这样简单的操作非常慢。这是在 Node.js 和 Rust 中执行“Hello world”程序所需时间的示例。

log.js

JavaScript

console.log('Hello world!')

$ time node log.jsHello world!node  log.js  0,13s user 0,02s system 100% cpu 0,152 total

log.rs

JavaScript

fn main() {  println!("Hello world!");}
$ rustc log.rs$ time ./logHello world!./log  0,00s user 0,00s system 86% cpu 0,004 total

Jarred 说他对这个事实以及 Javascript 世界的其他现实非常困扰,比如必须选择和协调多种工具——运行时、捆绑器、转译器……他确信这不必是这个案子,他开始了一个人的旅程来建造Bun。

bun到底是什么?

Bun 首先是一个 Javascript 运行时,如 Node.js 和 Deno。它被设计成一个极快的 Javascript 运行时。但别担心,拥抱这个新的运行时并不意味着必须重构所有现有代码。Bun 实现了大多数 Node API 和 Web API,例如 fs、fetch、Buffer、WebSocket 等等。此外,Bun 还与大多数 NPM 包兼容,尽管它使用自己的包管理器,这也是为速度而构建的。

但 Bun 不仅仅是一个 Javascript 运行时,它还附带电池。它附带了 Javascript 项目中通常需要的所有工具:包管理器、捆绑器和转译器,不仅适用于 Javascript,还适用于 Typescript 和开箱即用的 JSX。此外,它还包括用于dotenv 配置加载的本机实现和 SQLite3 客户端

这是使用 NPM v8.15 和 Bun 包管理器 v0.1.5 安装常规大小的 package.json 的示例:

$ time npm installadded 563 packages, and audited 564 packages in 3mnpm install  166,14s user 16,06s system 92% cpu 3:16,08 total
$ bun installbun install v0.1.5 563 packages installed [9.70s]

但是bun怎么这么快?

Bun 的速度可以用两个主要因素来解释:Javascript 引擎的选择和原生实现的低级优化。

Node.js 和 Deno 都使用 V8 Javascript 引擎。虽然 V8 是为 Chrome 络浏览器提供动力的出色引擎,但 Bun 选择了不惜一切代价产生最佳性能的选项。Jarred 选择使用JavascriptCore 引擎来构建 Bun,这是为 Webkit 提供动力的引擎,它似乎在启动时以及在某些特定情况下表现更好。

另一个帮助将 Bun 优化到极致的决定是选择Zig作为其内置语言。 Zig 是一种没有垃圾收集器的低级编程语言,如 C 或 Rust。虽然这两种语言可能是构建 Bun 的绝佳选择,但 Zig 有一些 Jarred 重视的独特功能,这最终导致他选择 Zig 而不是其他语言。首先,Zig 没有隐藏的控制流,这使得它更容易确保在运行时不会意外调用辅助函数。此外,Zig 有一个名为“CompTime”的功能。使用 CompTime,您可以将一段代码标记为在编译时而不是执行时执行,从而节省可以从最终执行时间中划掉的任何宝贵时间。

使用bun

要使用 Bun,首先使用以下命令安装它:

curl https://bun.sh/install | bash

对于此示例,我们将构建一个 Web 服务器。Bun 带有一个开箱即用的 HTTP 服务器。如果用于启动 bun 的文件具有带 fetch 功能的默认导出,它将启动 HTTP 服务器,但您也可以使用Bun.serve()以清楚起见。这是一个基本示例:

http.ts

export default {  port: 3000,  fetch(request: Request): Response {    return new Response("Hello world!");  }};

请注意,对于此示例,不需要库。Typescript 和 HTTP 服务器都可以正常工作。现在,让我们运行代码并检查服务器是否已启动并正在运行:

$ bun run http.ts

$ curl http://localhost:3000Hello world!

出色的!我们现在可以向服务器引入新功能。我们可以使用改进的 Node.js API 来读取和返回文件的内容。我们还可以使用内置的 SQLite 客户端从数据库中获取记录。使用 Bun 提供的工具,我们可以轻松实现:

JavaScript

import {  readFileSync} from 'fs';import {  Database} from 'bun:sqlite';export default {  port: 3000,  async fetch(request: Request): Promise<Response> {    const urlParts = request.url.match(/https?://.+/(.*)/);    const [_, resource] = urlParts;    if (resource === 'file') {      const file: string = readFileSync('/home/roger/Projects/experiments/log/file.txt', { encoding: 'utf-8' });      return new Response(file);    }    else if (resource === 'db') {      const db = new Database('db.sqlite');      const query = db.query('SELECT * FROM foo');      const result = query.run();      db.close();      return new Response(result);    }    return new Response('Hello world!');  }};

我可以用bun做什么?

这并不意味着你现在不应该使用 Bun。如果您需要构建一个对生产不敏感的应用程序,这可能是您的选择。如果您想构建一个快速的概念验证应用程序并且不想摆弄 Typescript 和转译器库,那么它可能是一个很好的解决方案。另一种可能的用途是,如果您需要编写一个需要以最佳性能执行的脚本,并且您不必费心用 Rust 或 C 编写它。

总之,密切关注Bun。Jarred 在短短一年内构建的东西已经对 Javascript 区产生了巨大影响,并且有可能彻底改变它。

谢谢大家阅读,喜欢的朋友请关注点赞转发,带你了解最新技术趋势。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年7月11日
下一篇 2022年7月11日

相关推荐