什么是Bun?基于Node.js的一体化运行环境

什么是Bun?基于Node.js的一体化运行环境

JavaScript 是世界上最流行、应用最广泛的编程语言之一。它为网络应用程序、移动应用程序、桌面软件甚至嵌入式设备提供支持。尽管它被广泛使用,但也并非没有挑战。与所有技术一样,JavaScript 也面临着性能、兼容性、安全性和复杂性等问题。

为了解决这些问题,多年来开发了多个 JavaScript 运行时。其中,Node.jsDeno 尤为突出,它们都为解决 JavaScript 的局限性提供了解决方案。然而,它们在解决了许多问题的同时,也带来了新的问题,如需要不必要的软件包和较慢的运行时性能。

现在,JavaScript 运行时 Bun 已经出现了一段时间,但该团队最近才于 2023 年 9 月发布了稳定版本。Bun 的目标是成为 Node.js 更直接、更高效的替代品。

本文将探讨 Bun 及其独特功能,以及如何将其集成到 JavaScript 项目中。

什么是 Bun?

Bun.sh 网站主页

Bun.sh 网站主页

Bun 是一个 JavaScript 运行时,主要使用 Zig 编程语言编写。它旨在解决 Node.js 的局限性,同时提供更精简、更高效的开发体验。

然而,Bun 并不像多年来出现的许多 JavaScript 运行时一样,只是另一种 JavaScript 运行时: 它是一个一体化工具包,旨在彻底改变开发人员使用 JavaScript 和 TypeScript 的方式。Bun 扩展了为苹果 Safari 提供动力的 JavaScriptCore 引擎,可以实现更快的启动时间和更好的内存使用率。

与 Node.js 不同,Bun 的运行不依赖 npm 或外部依赖项。相反,它有一个内置的标准库,为各种协议和模块提供功能,包括环境变量、HTTP、WebSocket、文件系统等。

它还提供对 TypeScript 的开箱即用支持。由于 Bun 在内部转译了每个 JavaScript 或 TypeScript 源文件,因此你可以直接编译和运行 TypeScript 文件,而无需额外的配置或转译。

Bun 随附功能强大的命令行界面 (CLI) 工具,可让你使用以下直接命令 runformatlinttest͏, 和 bundle 代码:

  • bun run — 使用 Bun 运行 JavaScript 或 TypeScript 文件。
  • bun test — 使用 Bun 内置的测试框架运行单元测试。
  • bun fmt — 使用 Bun 内置的代码格式化工具格式化代码。
  • bun lint — 使用 Bun 内置的代码筛选器筛选代码。
  • bun bundle — 使用 Bun 内置的代码捆绑器捆绑代码。

Bun 的另一个突出特点是它的热重载功能,该功能可在保留应用程序状态的同时即时刷新代码更改。这是对 Node.js 的重大改进,在 Node.js 中,类似的功能需要 nodemon 等外部软件包或 --watch 实验标志。相比之下,Bun 使用 --hotflag 简化了这一过程。

除了技术上的优势,Bun 还拥有一个不断壮大的用户社区,他们为 Bun 的开发和改进做出了积极贡献。这个充满活力的社区确保了 Bun 的及时更新和响应,并为学习和故障排除提供了充足的资源。

Bun 的核心功能

除了热重载、对 TypeScript 的原生支持和更快的启动时间外,Bun 还有几个核心特性为其作为 JavaScript 运行时的受欢迎程度和性能做出了贡献:它的捆绑程序、测试运行程序和包管理器。下面让我们详细讨论这些特性。

捆绑程序

捆绑程序将 JavaScript 代码及其依赖关系整合到一个文件中͏,从而优化浏览器或 Node.js 应用程序的加载效率。Node.js 缺乏原生捆绑程序͏,开发人员在处理 JavaScript 代码时需要依赖 Rollup、Webpack 和 ͏Parcel 等第三方捆绑程序。

相比之下,Bun 提供的内置捆绑程序只需最少的配置,并支持不同的模块格式。它还具有内置优化功能,支持更快的捆绑。相比之下,Bun 的捆绑程序优于其他捆绑程序,运行速度比 ͏esbuild 快 1.75 倍,比 Parcel 快 150 倍,比 Rollup + Terser 快 180 倍,比 Webpack 快 220 倍

你可以通过 bun bundle ͏<source>--out-dir<directory> 命令捆绑你的项目。它会在指定的输出目录中生成输出文件:

将项目与 Bun 捆绑

将项目与 Bun 捆绑

测试运行器

测试͏ 是软件开发的重要组成部分,可确保代码的功能性,并在生产前发现潜在问题。Bun 也在其工具包中加入了测试运行程序。

此外,Node.js 开发人员还采用了 Jest 等外部测试框架,这些框架功能强大、灵活,但会给项目带来额外的依赖性和配置开销。

另一方面,Bun 集成了自己的测试运行器,强调速度和兼容性。这种集成方法具有以下优势:

  • 速度 – 由于测试运行程序内置于运行时中,因此可以直接执行测试,而无需加载外部测试框架。因此,测试执行速度更快,这对大型代码库或持续集成环境尤为有利。
  • 兼容性 – 内置测试运行程序可与 Bun 的其他功能无缝配合。它利用 Bun 的快速启动时间和高效内存使用,确保您的测试在模拟生产环境的环境中运行。
  • 简便性 – 有了内置测试运行程序,你就无需担心运行时与测试框架之间的配置和兼容性问题。您可以使用相同的语言功能和应用程序接口,编写与应用程序代码类似的测试。

Bun 中的测试运行程序与各种测试框架完全兼容。运行测试就像执行 bun test 命令一样简单。

此外,由于 Bun 本身支持 TypeScript 和 JSX,因此无需额外的配置或插件。您可以专注于编写高质量的测试,而不是设置测试环境。

软件包管理器

Bun 的 Node.js 兼容包管理器比 npm、yarn 和 pnpm 快得多。它能加快速度、减少磁盘使用量并最大限度地减少内存占用。

Bun 团队对 Bun、ppm、npm 和 Yarn 的基准测试

Bun 团队对 Bun、ppm、npm 和 Yarn 的基准测试

通过使用 symli͏nks,Bun 将每个项目的软件包链接到一个集中的位置,从而省去了为后续项目重新下载模块的麻烦。

Bun 入门

要开始在电脑上使用 Bun,首先要安装它。安装 Bun 有多种方法,包括使用 cURL 命令、npm 或 Homebrew。不过,需要注意的是,Bun 最适合在 macOS 或 Linux 系统上使用。

要通过 cURL 命令安装 Bun,请在终端执行以下命令:

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

安装成功后,请在终端运行 bun --version 进行验证。这将确认 Bun 已准备就绪,可以使用。

现在,你可以探索 Bun 的功能了。你可以使用 bun run 命令来运行 Node.js 项目。此外,要运行名为 index.ts 的 TypeScript 文件,可使用 bun run index.ts –Bun 会转换你的 TypeScript 文件,无需额外的软件包。

Bun 的实用性远不止这些基本功能。它能与 ReactNext.js 等 JavaScript 框架无缝集成。要深入了解 Bun 的功能,请查看官方文档

如何使用 Bun 运行 Node.js 项目

使用 Bun 迁移或运行 Node.js 项目非常简单,只需执行几个 Bun CLI 命令即可。请按照以下步骤使用 Bun 运行 Node.js 项目:

首先,安装 Bun。安装好 Bun 后,导航到包含 Node.js 项目文件(包括 package.json 文件)的目录。在项目的工作目录中,运行此命令:

bun install

通过上述命令,Bun 可以读取 Node.js 项目总监͏y 中的 package.json 文件,查看͏ lock.json 文件(如果存在),并使用内置软件包管理器安装列出的依赖项。

使用 Bun 安装依赖项

使用 Bun 安装依赖项

安装好依赖项后,就可以用 Bun 执行项目了。使用 bun run 命令,然后输入项目的入口点文件:

bun run

例如,如果项目的入口点是一个名为 index.js 的文件,请输入 bun run index.͏js

Bun 会执行指定文件中的 JavaScript 或 TypeScript co͏de。如果项目的 package.json 文件中定义了启动脚本,也可以使用 bun start 运行项目。

在 Visual Studio Code 中执行 Bun 项目

在 Visual Studio Code 中执行 Bun 项目

过渡到新的运行环境可能会带来挑战。不过,Bun 对 Node.js 模块的强大支持、对全局变量的识别,以及对 Node.js 模块解析算法的遵循,都能简化从 Node.js 迁移到 ͏Bun 的过程。

假设您正在开发一个 Node.js 项目,该项目目前使用 dotenv 包管理环境变量。在这种情况下,你可以放心地从项目中移除 dotenv 包及其初始化代码。这是因为 Bun 内置了自动读取 .env 文件的功能,因此不需要 dotenv 包。

请记住,Bun 仍处于开发阶段,因此在迁移过程中最好谨慎行事。

小结

作为 JavaScript 运行时,Bun 因多种原因而变得越来越重要。它的设计注重性能和简洁性,旨在简化开发流程并提高整体效率。它的模块化架构让你可以只选择特定项目所需的组件,减少不必要的开销。

与 Node.js 不同,Bun 占用空间更小,启动时间更短。对于需要快速响应时间和有效利用资源的应用程序来说,这一优势至关重要。Bun 的简单性和模块化方法有助于提供更直接、更可定制的开发体验。

评论留言