Bun

您所在的位置:网站首页 bun是什么意思中文 Bun

Bun

2023-08-14 22:21| 来源: 网络整理| 查看: 265

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

近年来,网络开发领域发现,虽然用Javascript制作的超级风格化的网站和具有大量非常丰富的交互的网络应用可能会吸引用户,但页面的加载时间对用户体验的影响可能是百倍的。因此,已经有大量的努力来减少网站的加载时间指标。许多框架和模式已经(重新)出现,为这个问题提供解决方案,如服务器端渲染和静态网站生成。

进入Jarred Sumner。Jarred注意到,在Node.js中,像打印到控制台这样简单的动作是非常缓慢的。下面是一个在Node.js和Rust中执行 "Hello world "程序所需时间的例子。

log.js

JavaScript

console.log('Hello world!') 复制代码

外壳

$ time node log.js Hello world! node log.js 0,13s user 0,02s system 100% cpu 0,152 total 复制代码 log.rs

脚本

fn main() { println!("Hello world!"); } 复制代码

$ rustc log.rs $ time ./log Hello world! ./log 0,00s user 0,00s system 86% cpu 0,004 total 复制代码

Jarred说,他对这个事实以及Javascript世界的其他现实情况感到非常困扰,比如必须选择和协调多种工具--运行时、捆绑器、转码器......。他确信这不一定是事实,于是他开始了一个人的旅程,建立Bun。

究竟什么是Bun?

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

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

下面是一个使用NPM v8.15和Bun package manager v0.1.5安装常规大小package.json的例子。

外壳

$ time npm install added 563 packages, and audited 564 packages in 3m npm install 166,14s user 16,06s system 92% cpu 3:16,08 total 复制代码

$ bun install bun 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,首先用以下命令安装它。

Shell

curl https://bun.sh/install | bash 复制代码

是的,它是一个shell命令。不,(在写这篇文章的时候)它不适用于Windows。现在你可以开始使用Bun了。

在这个例子中,我们将建立一个Web服务器。Bun带有一个开箱即用的HTTP服务器。如果用来启动bun的文件有一个默认的带有fetch功能的导出,它就会启动HTTP服务器,但你也可以用Bun.serve() ,这样就很清楚了。下面是一个基本的例子。

http.ts

Shell

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

注意,对于这个例子来说,不需要库。Typescript和HTTP服务器都只是工作。现在,让我们运行代码并检查服务器是否已经启动和运行。

Shell

$ bun run http.ts 复制代码

$ curl http://localhost:3000 Hello 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 { 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还没有准备好用于生产应用。在写这篇文章的时候,Bun的最后一个版本是0.1.5的测试版本。它仍然有一个小的生态系统和社区,许多缺失的API,以及一些错误和边缘情况下的性能问题。尽管如此,这只是一个暂时的问题;Jarred和社区正在不懈地努力,以建立所有缺失的工具和API,并修复所有的bug。在第一次写这篇文章时,我描述了一些问题,如性能峰值和非法硬件指令。但这些问题解决得太快了,以至于这篇文章会不断地被淘汰。另外,专门为Bun打造的库也在不断出现。可能在不远的将来,Bun会成为一个用于生产环境的伟大工具,所以关注它将是明智的。

这并不意味着你现在就不应该使用Bun。如果你需要建立**一个对生产不敏感的应用程序,**它可能是你的选择。如果你想建立一个快速的概念验证应用程序,并且不想摆弄Typescript和转码器库,它可能是一个很好的解决方案。另一个可能的用途是,如果你需要写一个需要达到最佳性能的脚本,而你又懒得用Rust或C语言来写。

总而言之,请关注Bun。Jarred在短短一年的时间里所建立的东西已经在Javascript社区中产生了很大的影响,它有可能彻底改变它。

数据库 JavaScript引擎 Node.js 包管理器 TypeScript 网络开发 应用 Build(游戏引擎) Fetch(FTP客户端) Npm(软件)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3