js运行时环境Bun.js介绍与使用

865 阅读4分钟

什么是Bun

Bun 是一个用于 JavaScript 和 TypeScript 应用程序的一体化工具包。它作为一个名为 的单个可执行文件提供bun​
其核心是Bun 运行时,这是一个快速的 JavaScript 运行时,旨在替代 Node.js。它是用 Zig 编写的,并由 JavaScriptCore 提供支持,大大减少了启动时间和内存使用量。

Bun的优点

  • 速度。目前Bun 进程的启动速度比 Node.js 快 4 倍(亲自尝试一下!)
  • TypeScript 和 JSX 支持。可以直接执行.js.tsjsx.tsx文件; Bun 的转译器在执行之前将它们转换为普通 JavaScript。
  • ESM 和 CommonJS 兼容性。世界正在转向 ES 模块 (ESM),但 npm 上的数百万个包仍然需要 CommonJS。 Bun推荐ES模块,但支持CommonJS。
  • Web 标准 API。 Bun 实现了标准 Web API,例如fetchWebSocketReadableStream。 Bun 由 JavaScriptCore 引擎提供支持,该引擎是 Apple 为 Safari 开发的,因此一些 API HeadersURL直接使用Safari 的实现
  • Node.js 兼容性。除了支持 Node 风格的模块解析之外,Bun 的目标是与内置 Node.js 全局变量(processBuffer)和模块(pathfshttp等)完全兼容 。这是一项正在进行的工作,但尚未完成。 请参阅兼容性页面了解当前状态。

安装

macOS 和 Linux

npm install -g bun # the last `npm` command you'll ever need

Windows

powershell -c "irm bun.sh/install.ps1|iex"

runtime

serve.jpg

websocket.jpg

sqlite.jpg

  • bun run可用于执行js/ts文件、package.json脚本和可执行包
    • --wathc支持在监视模式下运行文件
  • 支持的文件类型有 js\ts\jsx\tsx\txt\json\toml\wasm\sqlite,可以使用插件支持更多
  • bun自动读取.env文件,并提供以编程方式读写环境变量的惯用方法通过process.env或者Bun.env或者import.meta.env
  • bun的目标是完全兼容Node.js API。目前已经支持七八成支持度
  • 插件系统,用于扩展运行时和bundler
import { plugin, type BunPlugin } from "bun";

const myPlugin: BunPlugin = {
  name: "Custom loader",
  setup(build) {
    // implementation
  },
};

plugin(myPlugin);

package manager

看起来确实快 第二次安装更快 pkg manager.jpg

  • bun install 安装项目依赖,执行{pre|post}install脚本,将包信息写入bun.lockb文件中该文件位于项目根目录下
  • bun add 添加指定包等同于pnpm i xxx
    • --dev作为开发依赖
    • --global安装全局依赖
  • bun remove 删除依赖项
  • bun update 将所有的依赖项更新到与指定的版本范围兼容的版本
    • --force 正常情况下遵循package.json定义的版本范围,想要忽略并更新到最新版本,可以传入该表示
  • bun link 在本地目录中将当前包注册为可链接包
  • 下载的所有包都位于全局缓存中~/.bun/install/cache。它们存储在名为 like 的子目录中${name}@${version},因此可以缓存包的多个版本
  • 在package.json中,"workspaces"选项用于指示哪些子目录应被视为 monorepo 中的包/工作区

bundler

bunler.jpg

  • 为什么需要bundler
    • 减少 HTTP 请求。。单个包可能包含数百个文件,使用单独的HTTP请求加载每个文件不太行,因此bunler用于将应用程序的源代码转换为数量较小的包,可以通过单个请求加载。
    • 代码转换。例如ts、jsx、tsx都必须要转换为纯js,然后才能被浏览器使用。
  • Watch mode --watch bundler支持监听模式
  • Bun bundler实现了一组默认的loaders,支持.js .cjs .mjs .ts .cts .mts .tsx .jsx .toml .json .txt .wasm .node文件

test runner

  • Bun 附带了一个快速、内置、兼容 Jest 的测试运行器
  • 支持ts和jsx
  • 支持生命周期hooks
  • 快照测试
  • UI和DOM测试
  • --wathc监听模式
  • --preload脚本预加载
  • 运行 bun test
import { expect, test } from "bun:test";

test("2 + 2", () => {
  expect(2 + 2).toBe(4);
});
  • 测试文件如下
    • *.test.{js|jsx|ts|tsx}
    • *_test.{js|jsx|ts|tsx}
    • *.spec.{js|jsx|ts|tsx}
    • *_spec.{js|jsx|ts|tsx}

api

  • Bun.serve()用于启动HTTP服务器
  • Worker允许在单独线程上运行新的js实例并与之通信,同时与主线程共享I/O资源
  • 支持使用二进制数据提供了 ArrayBuffer Blob等api
  • streams是处理二进制数据的重要抽象,无需将其全部加载到内存中。通常用于读写文件、发送和接受网络请求以及处理大量数据。 还有很多api请参考官网这就不一一举例了