344 - 《Bun 笔记》

发布于 2023年9月14日

趁着 Bun 正式版发布之际,翻了下 Bun 的文档,做下笔记。

1、我其实已经有 1 年 Bun 的使用经验,从 Bun 内测时就开始用。但是基本上只用 bun run 命令来跑 package.json script,我为此还设了个 br 的 alias,alias br=“bun run”。相比 npm run 明显感觉会更快,6ms vs. 170ms 这个对比量级,虽然每次都只快个毫秒级,但对于每天跑几十次的命令来说,加起来也应该是有省了一些时间的。另外,速度可以带来 DX(开发体验的提升)。

2、Bun 包含多个功能或角色,比如 Runtime、Package manager、Test runner、Bundler 和 Package runner。


Runtime

3、作为 Runtime Bun 可以做两件事,1)执行文件,2)执行 package.json script。命令都是 bun run,前者比如 bun run foo.ts,后者比如 bun run dev。执行文件有不少附加功能。比如支持加前置 --watch flag 启用监听模式,bun --watch run foo.ts 文件变更时会自动 reload;比如支持 ts、tsx 甚至 wasm;比如内置 Bun API,可以做 serve、build、io、child process、tcp、sqlite、ffi 等;比如支持非 BOM 的 Web API;比如兼容 node,但还有大量工作未完成。

4、Bun 支持插件。插件可以扩展 Runtime 或 Bundler。扩展 Bundler 的接口看着和 esbuild 有点像,最常见的需求应该是用来加 loader 支持某个 Bun 内置不支持的文件类型。

import { plugin } from "bun";
plugin({ name: 'foo', async setup(build){
  build.onLoad();
  build.onResolve();
  build.config.minify = true;
} });

Package Manger

5、作为 Package Manger,官方数据是 bun install 在有缓存的场景下比 npm install 快 25 倍。我早上试过用 bun install 安装 umi 项目的依赖,然后在用 node runtime 跑 umi,可以正常跑。除了 install,相关的命令还有 add、remove、link。有个特别的功能是,bun install 出于安全考虑默认不会执行依赖的 lifetime script,但除非把依赖到到 trustedDependencies 里,这是新搞的概念,和现有生态不兼容,感觉不一定是件好事。

6、install 有全局缓存,默认在 ~/.bun/install/cache 里。Bun 会优先用 Cache 中匹配的依赖,所以会快。注意,是用匹配的,而不是最优的,比如依赖写了 ^1,如果缓存里有 1.1

内容预览已结束

此内容需要会员权限。请先登录以查看完整内容。