Skip to main content
Bun.Archive 是 Bun 用于处理 tar 归档文件的原生 API。它可以根据内存中的数据创建归档文件,将归档文件解压到磁盘,并在不解压的情况下读取归档内容。

快速开始

从文件创建归档:
解压归档:
读取归档内容而不解压:

创建归档

使用 new Bun.Archive() 从一个对象创建归档,该对象的键是文件路径,值是文件内容。默认情况下,归档是不压缩的:
文件内容可以是:
  • 字符串 - 文本内容
  • Blob - 二进制数据
  • ArrayBufferView(例如 Uint8Array)- 原始字节
  • ArrayBuffer - 原始二进制数据

写入归档到磁盘

使用 Bun.write() 将归档写入磁盘:

获取归档字节数据

获取归档数据为字节或 Blob:

解压归档

从现有归档数据创建

从现有的 tar/tar.gz 数据创建归档:

解压到磁盘

使用 .extract() 将所有文件写入目录:
extract() 会在目标目录不存在时创建该目录,并覆盖现有文件。返回的计数包括文件、目录和符号链接(在 POSIX 系统上)。 注意:在 Windows 上,无论权限级别如何,Bun 都会在解压时始终跳过符号链接。在 Linux 和 macOS 上,符号链接会正常解压。 安全提示:Bun.Archive 会在解压过程中验证路径。它会拒绝绝对路径(POSIX 的 /、类似 C:\C:/ 的 Windows 驱动器号,以及类似 \\server\share 的 UNC 路径)和不安全的符号链接目标。路径遍历组件(..)会被规范化移除,以防止目录逃逸攻击:dir/sub/../file 会变为 dir/file

过滤解压的文件

使用 glob 模式仅解压特定文件。模式会与归档条目路径进行匹配,路径会被规范化为使用正斜杠(/)。正模式指定要包含的内容,负模式(以 ! 开头)指定要排除的内容。如果只提供负模式,则会包含所有不匹配这些模式的条目:
混合使用正模式和负模式时,条目必须至少匹配一个正模式,且不能匹配任何负模式:

读取归档内容

获取所有文件

使用 .files() 获取归档内容,返回由 File 对象组成的 Map,无需解压到磁盘。与会处理所有条目类型的 extract() 不同,files() 只返回普通文件(不包含目录):
每个 File 对象包含:
  • name - 归档中的文件路径(始终使用正斜杠 / 作为分隔符)
  • size - 文件大小,单位为字节
  • lastModified - 修改时间戳
  • 标准 Blob 方法,例如 text()arrayBuffer()stream()
注意files() 会将文件内容加载到内存中。对于大型归档,请使用 extract() 直接写入磁盘。

错误处理

归档操作可能因数据损坏、I/O 错误或无效路径失败。使用 try/catch 处理这些情况:
常见错误场景:
  • 归档损坏/截断 - new Archive() 会加载归档数据;错误可能延迟到读取/解压时出现
  • 权限不足 - 目标目录不可写时,extract() 会抛错
  • 磁盘空间不足 - 空间不够时,extract() 会抛错
  • 路径无效 - 路径格式错误时,操作会抛错
对于不受信任的归档,可以在解压前枚举并验证路径,以提高安全性:
使用 glob 模式调用时,如果没有文件匹配,files() 会返回一个空的 Map

使用 Glob 模式过滤

传入 glob 模式来筛选要返回的文件:
支持的 glob 模式(基于 Bun.Glob 语法的子集):
  • * - 匹配除 / 之外的任意字符
  • ** - 匹配包括 / 在内的任意字符
  • ? - 匹配单个字符
  • [abc] - 匹配字符集
  • {a,b} - 匹配多个选项中的任意一个
  • !pattern - 排除与模式匹配的文件(否定)。如果只提供否定模式,则会包含所有与这些模式不匹配的文件。
请参阅 Bun.Glob 了解完整的 glob 语法及转义和高级模式。

压缩

Bun.Archive 默认创建未压缩的 tar 归档。可通过 { compress: "gzip" } 启用 gzip 压缩:
options 参数接受:
  • 不传或 undefined - 默认未压缩 tar
  • { compress: "gzip" } - 启用 gzip 压缩,默认等级 6
  • { compress: "gzip", level: number } - gzip 压缩,自定义等级 1-12(1 为最快,12 为最小)。

示例

打包项目文件

解压并处理 npm 包

从目录创建归档

参考

注意:以下类型签名经过简化。完整的类型定义请参见 packages/bun-types/bun.d.ts