Bun 包含一个内置的包管理器,用于处理 JavaScript 依赖项的安装、更新和管理。本文档解释了 Bun 包管理器的架构和功能。有关如何作为最终用户使用包管理器,请参阅官方文档。
Bun 的包管理器是 npm、yarn 和 pnpm 的快速、即插即用替代品。它直接集成到 Bun 运行时中,并提供与现有 Node.js 项目的兼容性,同时提供显著提高的性能。包管理器支持 npm 兼容的命令,如 install、add、remove,并包含工作区、链接和锁定文件管理等功能。
来源
包管理器由几个协同工作的关键组件构成,用于解析、下载和安装软件包。
来源
结构体 PackageManager 是协调包安装过程的核心组件。它管理锁定文件、调度网络任务、处理安装任务以及构建 node_modules 目录结构。
主要职责
来源
结构体 Lockfile 管理已安装包及其依赖项的记录。Bun 支持二进制锁定文件格式 (bun.lockb),该格式针对性能进行了优化,以及一种文本格式 (bun.lock),该格式更易于人类阅读且对 Git 更友好。
主要功能
来源
依赖项解析是通过组合组件来处理的
Dependency 代表一个具有以下特征的软件包依赖项:
Resolution 代表具有特定版本信息的已解析依赖项
用于不同依赖项来源的各种解析器
来源
Bun 的包管理器通过以下方式实现高效的网络操作:
--network-concurrency 进行配置来源
包安装过程遵循以下主要步骤:
来源
Bun 的包管理器支持各种依赖项类型:
| 依赖类型 | 格式 | 描述 |
|---|---|---|
| npm | package-name@version | 从注册表安装的标准 npm 包 |
| git | git://github.com/user/repo.git | Git 仓库 URL |
| github | user/repo#commitish | GitHub 简写格式 |
| tarball | https://example.com/pkg.tgz 或 file.tgz | 远程或本地 tarball |
| folder | file:./path/to/folder | 本地文件夹 |
| workspace | workspace:packages/name | 工作区包 |
| symlink | 不适用 | 符号链接的包(来自 bun link) |
依赖项解析遵循基于类型的特定规则:
来源
Bun 有两种锁定文件格式:
二进制锁定文件(bun.lockb)
文本锁定文件(bun.lock)
锁定文件存储:
Bun 还可以从其他锁定文件格式迁移
来源
Bun 允许通过 --network-concurrency 标志来配置并发网络请求的数量。默认是 64 个并发请求,可以根据网络状况或代理需求进行调整。
$ bun install --network-concurrency=10
来源
Bun 的包管理器支持基于工作区的 monorepos
workspace: 协议引用其他工作区包来源
包管理器会自动将包的二进制文件链接到 .bin 目录
bin 字段来源
Bun 支持为本地开发链接包
$ bun link # Register current package
$ bun link package # Link a registered package into current project
$ bun unlink package # Remove a linked package
这会在包之间创建符号链接,以便于本地开发。
来源
Bun 使用以下方式验证包的完整性
来源
Bun 的包管理器提供了一组与 npm 功能相似的命令
| 命令 | 描述 |
|---|---|
bun install | 安装所有依赖项 |
bun add <pkg> | 添加依赖 |
bun remove <pkg> | 移除依赖 |
bun update [pkg] | 更新依赖 |
bun link [pkg] | 链接包以进行本地开发 |
其他标志包括
--production: 跳过开发依赖--frozen-lockfile: 防止锁文件更新--no-save: 安装时不更新 package.json--network-concurrency=N: 设置最大网络请求数--registry=URL: 使用自定义 npm 注册表来源
Bun 的包管理器注重性能
默认情况下,Bun 使用 64 个并发网络请求,这在大多数情况下都能提供良好的性能。可以通过 --network-concurrency 标志进行调整。
来源