bun install 使用的缓存相同)。
"foo" 并缓存它。下次运行脚本时,将使用缓存的版本。
版本解析
要确定安装哪个版本,Bun 遵循以下算法:- 检查项目根目录中是否存在 [bun.lock] 文件。如果存在,使用锁文件中指定的版本。
- 否则,向上扫描树形结构,寻找包含
"foo"作为依赖项的 [package.json]。如果找到,使用指定的 semver 版本或版本范围。 - 否则,使用
latest。
缓存行为
一旦确定了版本或版本范围,Bun 将:- 检查模块缓存中是否存在兼容版本。如果存在,则使用它。
- 解析
latest时,Bun 将检查过去 24 小时内是否已下载并缓存了package@latest。如果是,则使用它。 - 否则,从
npm注册表下载并安装适当的版本。
安装
包被安装并缓存到<cache>/<pkg>@<version> 中,因此同一包的多个版本可以同时缓存。此外,还会在 <cache>/<pkg>/<version> 下创建一个符号链接,以便更快地查找缓存中存在的包的所有版本。
版本说明符
通过在导入语句中直接指定版本或版本范围,可以绕过整个解析算法。优势
这种自动安装方法有几个好处:- 空间效率 — 每个依赖项的每个版本只存在于磁盘的一个位置。相比于每个项目重复安装,这在空间和时间上都有巨大节省。
- 便携性 — 要共享简单脚本和代码片段,您的源文件是自包含的。无需将包含代码和配置文件的目录压缩成 zip。由于在
import语句中使用版本说明符,甚至不需要 [package.json]。 - 便捷性 — 在运行文件或脚本之前无需运行
npm install或bun install。只需bun run即可。 - 向后兼容性 — 因为如果存在 [package.json],Bun 仍然遵循其中指定的版本,您可以使用单个命令切换到 Bun 风格的解析:
rm -rf node_modules。
局限性
- 无智能感知。IDE 中的 TypeScript 自动补全依赖于 [node_modules] 内部的类型声明文件的存在。我们正在研究此问题的各种解决方案。
- 不支持 patch-package
常见问题
这与 pnpm 有何不同?
这与 pnpm 有何不同?
使用 pnpm,您必须运行
pnpm install,它会创建一个包含符号链接的 [node_modules] 文件夹供运行时解析。相比之下,Bun 在您运行文件时动态解析依赖项;无需预先运行任何 install 命令。Bun 也不会创建 [node_modules] 文件夹。这与 Yarn Plug'N'Play 有何不同?
这与 Yarn Plug'N'Play 有何不同?
使用 Yarn,您必须在运行脚本之前运行
yarn install。相比之下,Bun 在您运行文件时动态解析依赖项;无需预先运行任何 install 命令。Yarn Plug’N’Play 还使用 zip 文件存储依赖项。这使得依赖加载在运行时变慢,因为对 zip 文件的随机访问读取往往比等效的磁盘查找要慢。这与 Deno 有何不同?
这与 Deno 有何不同?
Deno 需要在每个 npm
import 前加上 npm: 说明符,不支持通过 [tsconfig.json] 中的 compilerOptions.paths 的导入映射,并且对 [package.json] 设置的支持不完整。与 Deno 不同,Bun 目前不支持 URL 导入。