什么是Bun
Bun 是一个用于 JavaScript 和 TypeScript 应用程序的一体化工具包。它作为一个名为 的单个可执行文件提供bun。
其核心是Bun 运行时,这是一个快速的 JavaScript 运行时,旨在替代 Node.js。它是用 Zig 编写的,并由 JavaScriptCore 提供支持,大大减少了启动时间和内存使用量。
Bun的优点
- 速度。目前Bun 进程的启动速度比 Node.js 快 4 倍(亲自尝试一下!)
- TypeScript 和 JSX 支持。可以直接执行
.js、.ts、jsx、.tsx文件; Bun 的转译器在执行之前将它们转换为普通 JavaScript。 - ESM 和 CommonJS 兼容性。世界正在转向 ES 模块 (ESM),但 npm 上的数百万个包仍然需要 CommonJS。 Bun推荐ES模块,但支持CommonJS。
- Web 标准 API。 Bun 实现了标准 Web API,例如
fetch、WebSocket和ReadableStream。 Bun 由 JavaScriptCore 引擎提供支持,该引擎是 Apple 为 Safari 开发的,因此一些 APIHeaders、URL直接使用Safari 的实现。 - Node.js 兼容性。除了支持 Node 风格的模块解析之外,Bun 的目标是与内置 Node.js 全局变量(
process、Buffer)和模块(path、fs、http等)完全兼容 。这是一项正在进行的工作,但尚未完成。 请参阅兼容性页面了解当前状态。
安装
macOS 和 Linux
npm install -g bun # the last `npm` command you'll ever need
Windows
powershell -c "irm bun.sh/install.ps1|iex"
runtime
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
看起来确实快 第二次安装更快
- 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
- 为什么需要bundler
- 减少 HTTP 请求。。单个包可能包含数百个文件,使用单独的HTTP请求加载每个文件不太行,因此bunler用于将应用程序的源代码转换为数量较小的包,可以通过单个请求加载。
- 代码转换。例如ts、jsx、tsx都必须要转换为纯js,然后才能被浏览器使用。
- Watch mode
--watchbundler支持监听模式 - 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资源- 支持使用二进制数据提供了
ArrayBufferBlob等api - streams是处理二进制数据的重要抽象,无需将其全部加载到内存中。通常用于读写文件、发送和接受网络请求以及处理大量数据。 还有很多api请参考官网这就不一一举例了