在 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 等同类产品。我们还将演示如何使用 Bun 市场应用程序在 Vultr 云计算服务器上运行一个示例 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 命令
-
安装所有依赖项
bashbun install -
向项目中添加新包
bashbun add <package> -
添加仅用于开发的包
bashbun add <package> --dev -
从项目中移除包
bashbun remove <package> -
将特定包更新到最新版本
bashbun update <package> -
执行指定的脚本
bashbun 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 可以惰性加载文件并访问其内容,这比其他同类产品要快得多。
jsconst file = Bun.file("package.json"); await file.text(); -
Bun.write():此 API 用于将数据写入磁盘。
jsawait Bun.write("index.html", "<html></html>");
在 Vultr 上部署服务器
-
注册并登录 Vultr 客户门户。
-
导航到产品页面。
-
从侧边菜单中,选择计算。
-
点击中心的部署服务器按钮。
-
选择 **Cloud Compute** 作为服务器类型。
-
在 **Server Location** 部分,选择您选择的区域。
-
在 **Marketplace Apps** 部分,选择 **Bun**。
-
在 **Server Size** 部分,选择您选择的服务器大小。
-
根据需要,在 **Additional Features** 部分选择更多功能。
-
点击右下角的立即部署按钮。
运行 Bun 应用程序
在按照前面描述设置 Vultr 服务器后,本节将指导您使用 Vultr 的 Bun 市场应用程序创建一个示例 Bun HTTP 应用程序。
-
使用以下命令验证 Bun 安装
bashbun --version -
创建一个 JavaScript 文件。我们在这里使用 Nano 文本编辑器。
bashnano demo.js -
将以下代码复制并粘贴到文件中
jsconst 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 服务器
bashbun 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 的信息。