Logo of nanotar

nanotar

适用于任何 JavaScript 运行时的微小快速 Tar 工具!

小巧快速的 tar 工具,适用于任何 JavaScript 运行时!

🌳 小巧(所有工具精简并 Gzip 压缩后约为 1KB)且支持摇树优化!

✨ 采用现代 TypeScript 和 ESM 格式编写

✅ 适用于任何 JavaScript 运行时:Node.js (18+), Bun, Deno, 浏览器和 Edge Workers

🌐 兼容 Web 标准

🗜️ 内置压缩和解压缩支持

安装

安装包

# npm
npm install nanotar

# yarn
yarn add nanotar

# pnpm
pnpm install nanotar

# bun
bun install nanotar

导入

// ESM
import {
  createTar,
  createTarGzip,
  createTarGzipStream,
  parseTar,
  parseTarGzip,
} from "nanotar";

// CommonJS
const { createTar } = require("nanotar");

创建 tar 归档文件

使用 createTar 工具,轻松创建新的 tar 归档文件。

第一个参数是要归档的文件数组

  • name 字段是必需的,你可以使用 / 来指定子目录中的文件。
  • data 字段对于目录是可选的,可以是 StringArrayBufferUint8Array 之一。
  • attrs 字段对于文件属性是可选的。

第二个参数是归档选项。你可以使用 attrs 为所有文件设置默认属性(仍可按文件覆盖)。

可能的属性有

  • mtime:最后修改时间。默认为 Date.now()
  • uid:所有者用户 ID。默认为 1000
  • gid:所有者组 ID。默认为 1000
  • user:所有者用户名。默认为 ""
  • group:所有者用户组。默认为 ""
  • mode:文件模式(权限)。文件默认为 664 (-rw-rw-r--),目录默认为 775 (-rwxrwxr-x)

示例

import { createTar } from "nanotar";

const data = createTar(
  [
    { name: "README.md", data: "# Hello World!" },
    { name: "test", attrs: { mode: "777", mtime: 0 } },
    { name: "src/index.js", data: "console.log('wow!')" },
  ],
  { attrs: { user: "js", group: "js" } },
);

// Data is a Uint8Array view you can send or write to a file

压缩

你可以选择使用 createTarGzipcreateTarGzipStream 来创建压缩的 tar 数据流(返回值是 Promise<Uint8Array> 或通过管道连接到 CompressionStreamReadableStream

import { createTarGzip, createTarGzipStream } from "nanotar";

createTarGzip([]); // Promise<Uint8Array>

createTarGzipStream([]); // RedableStream

解析 tar 归档文件

使用 parseTar 工具,轻松解析 tar 归档文件。

示例

import { parseTar } from "nanotar";

// Read tar data from file or other sources into an ArrayBuffer or Uint8Array

const files = parseTar(data);

/**
[
  {
    "type": "file",
    "name": "hello.txt",
    "size": 12,
    "data": Uint8Array [ ... ],
    "text": "Hello World!",
    "attrs": {
      "gid": 1750,
      "group": "",
      "mode": "0000664",
      "mtime": 1702076997,
      "uid": 1750,
      "user": "root",
    },
  },
  ...
]
 */

解析后的文件数组有两个额外属性:size 文件大小和 text,这是一个惰性 getter,用于将 data 视图解码为字符串。

解压缩

如果输入是压缩的,你可以改用 parseTarGzip 工具来解析它(它内部使用 DecompressionStream 并返回一个 Promise<Uint8Array> 值)

import { parseTarGzip } from "nanotar";

parseTarGzip(data); // Promise<Uint8Array>

开发

  • 克隆此仓库
  • 安装最新 LTS 版本的 Node.js
  • 使用 corepack enable 启用 Corepack
  • 使用 pnpm install 安装依赖项
  • 使用 pnpm dev 运行交互式测试

许可

用心制作 💛

灵感来源于 ankitrohatgi/tarballjs

发布于 MIT 许可证下。