344 - 《Bun 笔记》
趁着 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