
在 Vultr 上使用 Bun:一个更优秀的 Node.js 替代方案
Bun 是一种 JavaScript 运行时,旨在作为 Node.js 的直接替代品。它是一个一体化解决方案:它包含捆绑器、测试运行器和 Node.js 兼容的包管理器。由于内置的 API 和使用 JavaScriptCore 引擎,它提供了比 Node.js 和 Deno 等运行时更快的速度改进。
在本文中,我们将讨论 Bun 功能,包括其与 ECMAScript 模块、CommonJS 和 Node.js 的兼容性,以及它作为包管理器和捆绑器的用途。我们将看看 Bun 独有的内置 API,这些 API 使其有别于 Node.js 和 Deno 等同类产品。我们还将演示如何使用 Vultr 云计算 服务器上的 Bun 市场应用程序 运行一个示例 Bun 应用程序。
探索 Bun 功能
JavaScript 引擎
Bun 使用 JavaScriptCore (JSC),一个为 Safari 开发的开源 JavaScript 引擎,而 Node.js 和 Deno 都使用在 Chrome 中找到的 V8 JavaScript 引擎。这两个引擎都有自己的优势。JSC 优先考虑更快的启动时间,并使用三个优化编译器,使其更复杂但更快,并且它消耗更少的内存。另一方面,V8 专注于快速执行,并具有两个优化编译器,使其不那么复杂且易于使用;但是,由于更多的运行时优化,它需要更多内存。这些引擎之间的差异导致 Bun 比 Node.js 快三到四倍。
Bun 与 ES 模块和 CommonJS 的兼容性
Bun 最方便的功能之一是它简化了模块系统,支持在同一个文件中同时支持 ES 模块和 CommonJS,而 Node.js 无法做到这一点。
const fs = require("fs");
const path = require("path");
import { add, subtract } from "./math";
console.log(fs.readFileSync(path.join(__dirname, "file.txt"), "utf8"));
console.log(add(5, 3));
console.log(subtract(10, 7));
无需任何额外配置,就可以在同一个文件中使用 import
和 const
。
Bun 与 Node.js 的兼容性
- **内置模块支持**:作为 Node.js 的直接替代品,Bun 支持重要的 Node.js 内置模块,例如
fs
(文件系统)、path
(路径操作)和net
(网络),从而保留预期的行为。 - **全局变量识别**:Bun 还支持 Node.js 中常用的全局变量,例如
__dirname
(表示当前模块的目录名)和process
(提供有关当前 Node.js 进程的信息)。这确保了依赖这些变量的 Node.js 代码将在 Bun 环境中按预期工作。 - **遵守 Node.js 模块解析算法**:Bun 遵循 Node.js 模块解析算法,这是 Node.js 用于定位和加载程序中模块的一组规则。这包括遵守
node_modules
目录的熟悉结构,外部依赖项通常存储在该目录中。
Bun 作为包管理器和捆绑器
除了运行时之外,Bun 还带有一个包管理器,它比替代方案快得多。这可以归因于这样一个事实,即在安装模块之后,Bun 会将其下载到全局模块缓存中。如果稍后再次需要该模块,Bun 会先检查缓存以避免冗余安装。
以下是几个常用的 Bun 命令
- 安装所有依赖项bash
bun install
- 将新包添加到项目bash
bun add <package>
- 添加新的开发专用包bash
bun add <package> --dev
- 从项目中删除包bash
bun remove <package>
- 将特定包更新到最新版本bash
bun update <package>
- 执行指定脚本bash
bun run <script>
Bun 不仅是一个运行时,还是一个捆绑器,旨在捆绑 JavaScript 和 TypeScript。它包含一个可以针对浏览器、Node.js 和其他平台代码进行缩小的缩小器。这使 Bun 有别于其他运行时,这些运行时依赖于 WebPack、Rollup 和 Parcel 等第三方工具进行捆绑。
要捆绑 index.tx
文件,请使用以下命令
bun build ./index.tsx --outdir ./build
此命令将捆绑包写入磁盘上的 ./build
目录。
Bun 中的热重载
在常用的运行时 Node.js 中,nodemon
是用于硬重启的工具。该工具负责监控文件中的更改并在检测到更改时重启整个 Node.js 进程。这种方法有时会导致中断,例如断开 HTTP 和 WebSocket 连接。
为了解决这个问题,Bun 使用 --hot
标志增强了热重载。该标志在不进行完全重启的情况下就地重新加载代码。使用这种方法,现有的 HTTP 连接不会受到干扰,这使得热重载几乎是瞬时的。最终,这会导致更快速、更高效的开发。
以下是使用 Bun 热重载命令的方法
bun --hot run index.ts
了解 Bun 的 API
Bun 提供了几个内置的、优化的原生 API,主要用于服务器端任务,例如使用 Bun 全局对象启动 HTTP 服务器。以下描述了其中的一些 API。
- **Bun.serve()**:您可以使用 Bun 的 API 设置 HTTP,这些 API 速度更快,并且能够处理大量的请求。Bun 中的 HTTP 服务器使用
Bun.serve
启动,如下所示jsBun.serve({ fetch(req) { return new Response("Bun!"); }, });
- **Bun.file()**:此 API 延迟加载文件并访问其内容,这比其他同类产品快得多。js
const file = Bun.file("package.json"); await file.text();
- **Bun.write()**:此 API 用于将数据写入磁盘。js
await Bun.write("index.html", "<html></html>");
在 Vultr 上部署服务器
- 注册并登录 Vultr 客户门户。
- 导航到**产品**页面。
- 从侧边菜单中选择**计算**。
- 单击中心处的**部署服务器**按钮。
- 选择**云计算**作为服务器类型。
- 在**服务器位置**部分,选择您选择的区域。
- 在**市场应用程序**部分,选择**Bun**。
- 在**服务器大小**部分,选择您选择的服务器大小。
- 根据需要在**附加功能**部分选择任何其他功能。
- 单击右下角的**立即部署**按钮。
运行 Bun 应用程序
在按照上述说明设置 Vultr 服务器后,本节将指导您使用 Vultr 的 Bun 市场应用程序创建示例 Bun HTTP 应用程序。
- 使用以下命令验证 Bun 安装bash
bun --version
- 创建一个 JavaScript 文件。这里我们使用 Nano 文本编辑器。bash
nano demo.js
- 将以下代码复制粘贴到文件中js
const port = 8080; console.log(`Server started on port ${port}`); Bun.serve({ port: port, fetch(request) { return new Response("Hello world"); }, });
- 保存文件(Ctrl + O,Enter)并退出编辑器(Ctrl + X)。
- 允许传入连接到端口
8080
。bashufw allow 8080
- 使用以下命令启动 Bun 服务器输出将如下所示bash
bun demo.js
Server started on port 8080
- 您可以访问以下链接处的 Bun 应用程序
http://SERVER_IP:8080
结论
在本文中,我们深入了解了 Bun 运行时,了解了它的功能以及它与替代运行时的区别。我们探讨了如何使用 Bun 作为 Node.js 的直接替代品。此外,我们还看到了如何使用 Vultr 的 Bun 市场应用程序和 Bun 的内置 API 功能设置 Bun HTTP 服务器,使该过程更快、更高效、更可靠。
这是一篇由 Vultr 赞助的文章。Vultr 是全球最大的私营云计算平台。Vultr 是开发人员的宠儿,已经为 185 个国家/地区的超过 150 万客户提供了灵活、可扩展的全球云计算、云 GPU、裸机和云存储解决方案。了解更多关于 Vultr 的信息。