Bun.Archive 提供了一个快速的本地实现,用于操作 tar 归档文件。它支持从内存数据创建归档,解压归档到磁盘,以及读取归档内容而不进行解压。
快速开始
从文件创建归档:创建归档
使用new Bun.Archive() 从一个对象创建归档,该对象的键是文件路径,值是文件内容。默认情况下,归档是不压缩的:
- 字符串 - 文本内容
- Blob - 二进制数据
- ArrayBufferView(例如
Uint8Array)- 原始字节 - ArrayBuffer - 原始二进制数据
写入归档到磁盘
使用Bun.write() 将归档写入磁盘:
获取归档字节数据
获取归档数据为字节或 Blob:解压归档
从现有归档数据创建
从现有的 tar/tar.gz 数据创建归档:解压到磁盘
使用.extract() 将所有文件写入目录:
/、Windows 的驱动器字母如 C:\ 或 C:/,以及 UNC 路径如 \\server\share)。路径遍历组件 (..) 会被规范化移除(例如 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()会抛错 - 路径无效 - 路径格式错误时,操作会抛错
extract() 返回的计数包含所有成功写入的条目(文件、目录及 POSIX 系统上的符号链接)。
安全提示:Bun.Archive 在解压时自动验证路径。拒绝绝对路径(POSIX /、Windows 驱动器字母、UNC 路径)和不安全的符号链接目标。路径中的遍历组件 (..) 会被规范化移除,防止目录逃逸。
对于不可信的归档,可以先枚举并验证路径:
files(),如果没有匹配,返回空的 Map:
使用 Glob 模式过滤
传入 glob 模式来筛选要返回的文件:*- 匹配除/外的任意字符**- 匹配包括/在内的任意字符?- 匹配单个字符[abc]- 匹配字符集{a,b}- 匹配多个选项!pattern- 排除匹配的文件(取反),必须配合正向模式使用;只用负向模式匹配不到任何文件
压缩
Bun.Archive 默认创建未压缩的 tar 归档。可通过{ compress: "gzip" } 启用 gzip 压缩:
- 不传或
undefined- 默认未压缩 tar { compress: "gzip" }- 启用 gzip 压缩,默认等级 6{ compress: "gzip", level: number }- gzip 压缩,自定义等级 1-12(1 为最快,12 为最小)
示例
打包项目文件
解压并处理 npm 包
从目录创建归档
参考
注意:以下类型签名为文档简化版。完整类型定义请查看 packages/bun-types/bun.d.ts。