# @aigne/uuid 中文文档

规范地址：https://npmcn.com/package/%40aigne/uuid/

版本：13\.0\.1
npm 元数据更新时间：2026-01-21T06:21:31.722Z
中文译文更新时间：2026-11-06T22:17:17.857Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40aigne/uuid
原文对照：https://npmcn.com/package/%40aigne/uuid/?lang=original
项目主页：https://github.com/uuidjs/uuid#readme
源码仓库：https://github.com/uuidjs/uuid

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：122 kB，144 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：包内自带
- 运行依赖：0 个
- 首次发布：2025-10-01T14:00:56.776Z
- 最新版本发布：2025-10-01T14:22:44.708Z
- 近 30 天下载量：2270（2026-10-05 至 2026-11-03，npm 官方下载统计）
- 已发布版本数：2（近 12 个月 0 个）

## 中文简介

RFC9562 铀浓缩物

## 安装

```sh
npm install @aigne/uuid
```

也可以使用：`pnpm add @aigne/uuid`、`yarn add @aigne/uuid`、`bun add @aigne/uuid`

## README

# 乌伊德 [![CI](https://github.com/uuidjs/uuid/workflows/CI/badge.svg)](https://github.com/uuidjs/uuid/actions?query=workflow%3ACI) [![Browser](https://github.com/uuidjs/uuid/workflows/Browser/badge.svg)](https://github.com/uuidjs/uuid/actions/workflows/browser.yml)

为创建 [RFC9562 (法语)](https://www.rfc-editor.org/rfc/rfc9562.html) (原为 [RFC4122 导弹](https://www.rfc-editor.org/rfc/rfc4122.html)用户识别码

-   **完成** - 支持所有RFC9562UUID版本
-   **跨平台** - 支持...
    -   [字体](https://npmcn.com/package/%40aigne/uuid/#readme-support)
    -   [克罗姆、萨法里、火狐和边缘](https://npmcn.com/package/%40aigne/uuid/#readme-support)
    -   [节点JS](https://npmcn.com/package/%40aigne/uuid/#readme-support)
    -   [反应原生/博览会](https://npmcn.com/package/%40aigne/uuid/#readme-react-native--expo)
-   **安全** - 现代用途 `crypto` 随机值的 API
-   **压缩** - 零依赖性, [可动摇的树](https://developer.mozilla.org/en-US/docs/Glossary/Tree_shaking)
-   **国 际** - 说吧 [`uuid` 命令行](https://npmcn.com/package/%40aigne/uuid/#readme-command-line) 工具

> \[注\]
> 
> 从开始 `uuid@12` CommonJS不再被支持. 见 [影响](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c) 财务报告和审定财务报表 [动机](https://github.com/uuidjs/uuid/issues/881) 详细情况.

## 快速启动

**1\. 安装**

```shell
npm install uuid
```

**2\. 创建UUID**

```javascript
import { v4 as uuidv4 } from 'uuid';

uuidv4(); // ⇨ '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'
```

对于时间戳UUID,命名空间UUID,以及其他选项读取在.

## API 总结

|  |  |  |
| --- | --- | --- |
| [`uuid.NIL`](https://npmcn.com/package/%40aigne/uuid/#readme-uuidnil) | 无 UUID 字符串( 全部为零) | 新建于 `uuid@8.3` |
| [`uuid.MAX`](https://npmcn.com/package/%40aigne/uuid/#readme-uuidmax) | 最大 UUID 字符串( 全部) | 新建于 `uuid@9.1` |
| [`uuid.parse()`](https://npmcn.com/package/%40aigne/uuid/#readme-uuidparsestr) | 将 UUID 字符串转换为字节数组 | 新建于 `uuid@8.3` |
| [`uuid.stringify()`](https://npmcn.com/package/%40aigne/uuid/#readme-uuidstringifyarr-offset) | 将字节数组转换为 UUID 字符串 | 新建于 `uuid@8.3` |
| [`uuid.v1()`](https://npmcn.com/package/%40aigne/uuid/#readme-uuidv1options-buffer-offset) | 创建版本 1( 时间戳) UUID |  |
| [`uuid.v1ToV6()`](https://npmcn.com/package/%40aigne/uuid/#readme-uuidv1tov6uuid) | 从 1 个版本创建 6 UUID | 新建于 `uuid@10` |
| [`uuid.v3()`](https://npmcn.com/package/%40aigne/uuid/#readme-uuidv3name-namespace-buffer-offset) | 创建版本 3( namespace w/ MD5) UUID |  |
| [`uuid.v4()`](https://npmcn.com/package/%40aigne/uuid/#readme-uuidv4options-buffer-offset) | 创建版本 4 (随机) UUID |  |
| [`uuid.v5()`](https://npmcn.com/package/%40aigne/uuid/#readme-uuidv5name-namespace-buffer-offset) | 创建版本 5 (namespace w/ SHA-1) UUID |  |
| [`uuid.v6()`](https://npmcn.com/package/%40aigne/uuid/#readme-uuidv6options-buffer-offset) | 创建版本 6( 时间戳、 重排) UUID | 新建于 `uuid@10` |
| [`uuid.v6ToV1()`](https://npmcn.com/package/%40aigne/uuid/#readme-uuidv6tov1uuid) | 从 6 个 UUID 版本创建 1 版本 UUID | 新建于 `uuid@10` |
| [`uuid.v7()`](https://npmcn.com/package/%40aigne/uuid/#readme-uuidv7options-buffer-offset) | 创建版本 7 (Unix Epoch 时间) UUID | 新建于 `uuid@10` |
| ~[`uuid.v8()`](https://npmcn.com/package/%40aigne/uuid/#readme-uuidv8)~ | "故意留下空白" |  |
| [`uuid.validate()`](https://npmcn.com/package/%40aigne/uuid/#readme-uuidvalidatestr) | 测试字符串看它是否为有效的 UUID | 新建于 `uuid@8.3` |
| [`uuid.version()`](https://npmcn.com/package/%40aigne/uuid/#readme-uuidversionstr) | 检测 RFC 版本的 UUID | 新建于 `uuid@8.3` |

## API 密码

### u. 尼尔

无 UUID 字符串( 全部为 0) .

示例

```javascript
import { NIL as NIL_UUID } from 'uuid';

NIL_UUID; // ⇨ '00000000-0000-0000-0000-000000000000'
```

### u. 马克

最大 UUID 字符串( 全部) .

示例

```javascript
import { MAX as MAX_UUID } from 'uuid';

MAX_UUID; // ⇨ 'ffffffff-ffff-ffff-ffff-ffffffffffff'
```

### uuid.parse( str) (中文(简体) )

将 UUID 字符串转换为字节数组

|  |  |
| --- | --- |
| `str` | 一个有效的UUID `String` |
| _返回时_ | `Uint8Array[16]` |
| _掷出_ | `TypeError` 若为 `str` 无效的 UUID |

> \[注\] 在使用的字节数组中排列值 `parse()` 财务报告和审定财务报表 `stringify()` 遵循 UUID 字符串中十六进制的左 QQ 右序 。 如下例所显.

示例

```javascript
import { parse as uuidParse } from 'uuid';

// Parse a UUID
uuidParse('6ec0bd7f-11c0-43da-975e-2a8ad9ebae0b'); // ⇨
// Uint8Array(16) [
//   110, 192, 189, 127,  17,
//   192,  67, 218, 151,  94,
//    42, 138, 217, 235, 174,
//    11
// ]
```

### uuid.stringify(arr\[,e

将字节数组转换为 UUID 字符串

|  |  |
| --- | --- |
| `arr` | `Array`\- 喜欢收集16个值(从 `offset`0-255之间. |
| \[`offset` = 0 个 | `Number` 在矩阵中开始索引 |
| _返回时_ | `String` |
| _掷出_ | `TypeError` 如果无法生成有效的 UUID 字符串 |

> \[注\] 在使用的字节数组中排列值 `parse()` 财务报告和审定财务报表 `stringify()` 遵循 UUID 字符串中十六进制的左 QQ 右序 。 如下例所显.

示例

```javascript
import { stringify as uuidStringify } from 'uuid';

const uuidBytes = Uint8Array.of(
  0x6e,
  0xc0,
  0xbd,
  0x7f,
  0x11,
  0xc0,
  0x43,
  0xda,
  0x97,
  0x5e,
  0x2a,
  0x8a,
  0xd9,
  0xeb,
  0xae,
  0x0b
);

uuidStringify(uuidBytes); // ⇨ '6ec0bd7f-11c0-43da-975e-2a8ad9ebae0b'
```

### uuid.v1(\[备选案文\[、缓冲\[、冲 )\])

创建 RFC 第 1 版 (时间戳) UUID

|  |  |
| --- | --- |
| \[`options`\[ . \] | `Object` 具有下列一个或多个属性: |
| \[`options.node = (random)` \[ . \] | RFC "节点" 字段为 `Array[6]` 字节值(每 4.1.6个) |
| \[`options.clockseq = (random)`\[ . \] | RFC "时钟序列" 作为 a `Number` 0 - 0x3fff之间 |
| \[`options.msecs = (current time)`\[ . \] | RFC"时间戳"字段(`Number` 毫秒, unix 时代) |
| \[`options.nsecs = 0`\[ . \] | RFC"时间戳"字段(`Number` 纳米秒后加入 `msecs`,应当为0-10 000) |
| \[`options.random = (random)`\[ . \] | `Array` 用于生成其它字段的 16 个随机字节( 0-255) 上方 |
| \[`options.rng`\[ . \] | 备选案文 `options.random`页:1 `Function` 返回一个 `Array` 16个随机字节(0-255) |
| \[`buffer`\[ . \] | `Uint8Array` 或者说 `Uint8Array` 子类型(例如:节点js) `Buffer`) (中文(简体) ). 如果提供了二进制 UUID, 则写入数组, 起始于 `offset` |
| \[`offset` = 0 个 | `Number` 开始写入 UUID 字节的索引 `buffer` |
| _返回时_ | 用户名 `String` 若无 `buffer` 指定,否则返回 `buffer` |
| _掷出_ | `Error` 如果要求超过10MUUID/秒 |

> \[注\] 默认 [节点编号](https://datatracker.ietf.org/doc/html/rfc9562#section-5.1) (UUID中的最后12位数)在进程启动时随机生成一次,然后在进程持续期间保持不变.

> \[注\] `options.random` 财务报告和审定财务报表 `options.rng` 只有第一次呼吁才有意义 `v1()`,可以通过它们来初始化内部 `node` 财务报告和审定财务报表 `clockseq` 字段.

示例

```javascript
import { v1 as uuidv1 } from 'uuid';

uuidv1(); // ⇨ '2c5ea4c0-4067-11e9-9b5d-ab8dfbbd4bed'
```

使用示例 `options`数字 :

```javascript
import { v1 as uuidv1 } from 'uuid';

const options = {
  node: Uint8Array.of(0x01, 0x23, 0x45, 0x67, 0x89, 0xab),
  clockseq: 0x1234,
  msecs: new Date('2011-11-01').getTime(),
  nsecs: 5678,
};
uuidv1(options); // ⇨ '710b962e-041c-11e1-9234-0123456789ab'
```

### uuid.v1TOV6 (uuid) (英语)

将1版的UUID转换为6版

```javascript
import { v1ToV6 } from 'uuid';

v1ToV6('92f62d9e-22c4-11ef-97e9-325096b39f47'); // ⇨ '1ef22c49-2f62-6d9e-97e9-325096b39f47'
```

### uuid.v3(名称、名称空间\[、缓冲\[、冲 ))

创建 RFC 第 3 版 (命名空间 w/ MD5) UUID

API 与 API 相同 `v5()`,但使用"v3"代替.

> \[大 根据《联邦渔业法》, "_如果后向相容性不是一个问题,则首选SHA-1 \[版本5\]_""("史记")

### uuid.v4(\[备选案文\[、缓冲\[、冲 \]\])

创建 RFC 版本 4 (随机) UUID

|  |  |
| --- | --- |
| \[`options`\[ . \] | `Object` 具有下列一个或多个属性: |
| \[`options.random`\[ . \] | `Array` 16个随机字节(0-255) |
| \[`options.rng`\[ . \] | 备选案文 `options.random`页:1 `Function` 返回一个 `Array` 16个随机字节(0-255) |
| \[`buffer`\[ . \] | `Uint8Array` 或者说 `Uint8Array` 子类型(例如:节点js) `Buffer`) (中文(简体) ). 如果提供了二进制 UUID, 则写入数组, 起始于 `offset` |
| \[`offset` = 0 个 | `Number` 开始写入 UUID 字节的索引 `buffer` |
| _返回时_ | 用户名 `String` 若无 `buffer` 指定,否则返回 `buffer` |

示例

```javascript
import { v4 as uuidv4 } from 'uuid';

uuidv4(); // ⇨ '1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed'
```

使用预定义的示例 `random` 值 :

```javascript
import { v4 as uuidv4 } from 'uuid';

const v4options = {
  random: Uint8Array.of(
    0x10,
    0x91,
    0x56,
    0xbe,
    0xc4,
    0xfb,
    0xc1,
    0xea,
    0x71,
    0xb4,
    0xef,
    0xe1,
    0x67,
    0x1c,
    0x58,
    0x36
  ),
};
uuidv4(v4options); // ⇨ '109156be-c4fb-41ea-b1b4-efe1671c5836'
```

### uuid.v5(名称、名称空间\[、缓冲\[、冲 ))

创建 RFC 版本 5( namespace w/ SHA-1) UUID

|  |  |
| --- | --- |
| `name` | `String | Array` |
| `namespace` | `String | Array[16]` 命名空间 UUID |
| \[`buffer`\[ . \] | `Uint8Array` 或者说 `Uint8Array` 子类型(例如:节点js) `Buffer`) (中文(简体) ). 如果提供了二进制 UUID, 则写入数组, 起始于 `offset` |
| \[`offset` = 0 个 | `Number` 开始写入 UUID 字节的索引 `buffer` |
| _返回时_ | 用户名 `String` 若无 `buffer` 指定,否则返回 `buffer` |

> \[注\] 皇家金融公司 `DNS` 财务报告和审定财务报表 `URL` 命名空间为 `v5.DNS` 财务报告和审定财务报表 `v5.URL`。 。 。 .

带有自定义命名空间的示例 :

```javascript
import { v5 as uuidv5 } from 'uuid';

// Define a custom namespace.  Readers, create your own using something like
// https://www.uuidgenerator.net/
const MY_NAMESPACE = '1b671a64-40d5-491e-99b0-da01ff1f3341';

uuidv5('Hello, World!', MY_NAMESPACE); // ⇨ '630eb68f-e0fa-5ecc-887a-7c7a62614681'
```

RFC 示例 `URL` 名称空间 :

```javascript
import { v5 as uuidv5 } from 'uuid';

uuidv5('https://www.w3.org/', uuidv5.URL); // ⇨ 'c106a26a-21bb-5538-8bf2-57095d1976c1'
```

### uuid.v6(\[备选案文\[、缓冲\[、冲 )\])

创建 RFC 第 6 个版本( 时间戳、 重排) UUID

这种方法与uuid.v1 () 的参数相同.

```javascript
import { v6 as uuidv6 } from 'uuid';

uuidv6(); // ⇨ '1e940672-c5ea-64c1-9bdd-2b0d7b3dcb6d'
```

使用示例 `options`数字 :

```javascript
import { v6 as uuidv6 } from 'uuid';

const options = {
  node: [0x01, 0x23, 0x45, 0x67, 0x89, 0xab],
  clockseq: 0x1234,
  msecs: new Date('2011-11-01').getTime(),
  nsecs: 5678,
};
uuidv6(options); // ⇨ '1e1041c7-10b9-662e-9234-0123456789ab'
```

### uuid.v6TOV1 (uuid) (英语)

从第6版转换为第1版的UUID

```javascript
import { v6ToV1 } from 'uuid';

v6ToV1('1ef22c49-2f62-6d9e-97e9-325096b39f47'); // ⇨ '92f62d9e-22c4-11ef-97e9-325096b39f47'
```

### uuid.v7(\[备选案文\[、缓冲\[、冲 \]))

创建 RFC 第 7 (随机) UUID

|  |  |
| --- | --- |
| \[`options`\[ . \] | `Object` 具有下列一个或多个属性: |
| \[`options.msecs = (current time)`\[ . \] | RFC"时间戳"字段(`Number` 毫秒, unix 时代) |
| \[`options.random = (random)`\[ . \] | `Array` 用于生成其它字段的 16 个随机字节( 0-255) 上方 |
| \[`options.rng`\[ . \] | 备选案文 `options.random`页:1 `Function` 返回一个 `Array` 16个随机字节(0-255) |
| \[`options.seq = (random)`\[ . \] | 32 位顺序 `Number` 0 - 0xffffff之间. 提供这种技术可以帮助确保在同一毫秒时间间隔内产生的UUID的独特性。 默认=随机值. |
| \[`buffer`\[ . \] | `Uint8Array` 或者说 `Uint8Array` 子类型(例如:节点js) `Buffer`) (中文(简体) ). 如果提供了二进制 UUID, 则写入数组, 起始于 `offset` |
| \[`offset` = 0 个 | `Number` 开始写入 UUID 字节的索引 `buffer` |
| _返回时_ | 用户名 `String` 若无 `buffer` 指定,否则返回 `buffer` |

示例

```javascript
import { v7 as uuidv7 } from 'uuid';

uuidv7(); // ⇨ '01695553-c90c-745a-b76f-770d7b3dcb6d'
```

### ~uuid.v8 () (中文(简体) )~

**_"故意留下空白"_**

> \[注\] 第8版(实验性)UUID为"[用于试验或特定供应商的个案](https://www.rfc-editor.org/rfc/rfc9562.html#name-uuid-version-8)" .. RFC没有为他们定义一个创建算法,这就是为什么这个软件包不提供 `v8()` 方法。 这个 `validate()` 财务报告和审定财务报表 `version()` 然而,方法确实与这些UUID有关.

### uuid.validate(str) (中文(简体) )

测试字符串看它是否为有效的 UUID

|  |  |
| --- | --- |
| `str` | `String` 用于验证 |
| _返回时_ | `true` 如果字符串是有效的 UUID, `false` 否则 |

示例

```javascript
import { validate as uuidValidate } from 'uuid';

uuidValidate('not a UUID'); // ⇨ false
uuidValidate('6ec0bd7f-11c0-43da-975e-2a8ad9ebae0b'); // ⇨ true
```

使用 `validate` 财务报告和审定财务报表 `version` 一起可以进行 per-version 验证,例如只对 v4 UUIds 进行验证.

```javascript
import { version as uuidVersion } from 'uuid';
import { validate as uuidValidate } from 'uuid';

function uuidValidateV4(uuid) {
  return uuidValidate(uuid) && uuidVersion(uuid) === 4;
}

const v1Uuid = 'd9428888-122b-11e1-b85c-61cd3cbb3210';
const v4Uuid = '109156be-c4fb-41ea-b1b4-efe1671c5836';

uuidValidateV4(v4Uuid); // ⇨ true
uuidValidateV4(v1Uuid); // ⇨ false
```

### uuid.version(str) (中文(简体) )

检测 RFC 版本的 UUID

|  |  |
| --- | --- |
| `str` | 一个有效的UUID `String` |
| _返回时_ | `Number` RFC 版本的 UUID |
| _掷出_ | `TypeError` 若为 `str` 无效的 UUID |

示例

```javascript
import { version as uuidVersion } from 'uuid';

uuidVersion('45637ec4-c85f-11ea-87d0-0242ac130003'); // ⇨ 1
uuidVersion('6ec0bd7f-11c0-43da-975e-2a8ad9ebae0b'); // ⇨ 4
```

> \[注\] 此方法返回 `0` 联 合 国 `NIL` UUID,以及 `15` 联 合 国 `MAX` UUID(英语:UUID).

## 命令行

从命令行可以使用 `uuid`。 。 。 .

```shell
$ npx uuid
ddeb27fb-d9a0-4624-be4d-4615062daed4
```

默认生成版本为4 UUIDS,然而其他版本都得到了支持. 类型 `uuid --help` 详细情况:

```shell
$ npx uuid --help

Usage:
  uuid
  uuid v1
  uuid v3 <name> <namespace uuid>
  uuid v4
  uuid v5 <name> <namespace uuid>
  uuid v7
  uuid --help

Note: <namespace uuid> may be "URL" or "DNS" to use the corresponding UUIDs
defined by RFC9562
```

## `options` 处理时间戳 UUID

在此之前 `uuid@11`,这是可能的 `options` 状态,用于干扰用于确保基于时间戳的UUID的独特性的内部状态(即 `v1()`, (中文(简体) ), `v6()`,以及 `v7()` 方法问题。 从开始 `uuid@11`,这一问题已经通过使用联合国 `options` 参数作为在两种可能的行为之间选择的旗:

-   无 `options`:利用内部状态来提高UUID的独特性.
-   与 `options`: 内部状态 **没有** 必要时适用适当的缺省.

## 支助

**浏览器**数字 : `uuid` [建筑物经过测试](https://npmcn.com/uuidjs/uuid/blob/main/wdio.conf.js) 与最新版本的桌面 Chrome、Safari、Firefox和Edge相对应。 这些相同的浏览器的移动版本预计会有效,但目前没有经过测试.

**节点**数字 : `uuid` [建筑物经过测试](https://github.com/uuidjs/uuid/blob/main/.github/workflows/ci.yml#L26-L27) 对节点( e)[LTS 发布](https://github.com/nodejs/Release)),加上一个前. 举个例子 在编写本报告时 `node@20` 是"维护"发行 `node@24` 是"当前"发行,所以 `uuid` 支持 `node@18`\- 说吧`node@24`。 。 。 .

**字体**:支持过去两年内发布的TS版本. [来源](https://github.com/microsoft/TypeScript/issues/49088#issuecomment-2468723715)

## 已知问题

### "获得RandomValues () 不支持"

此错误发生于标准的环境 [`crypto.getRandomValues()`](https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues) API 不支持 。 可以通过增加适当的多填充来解决这一问题:

#### 反应原生/博览会

1.  安装 [`react-native-get-random-values`](https://github.com/LinusU/react-native-get-random-values#readme)
2.  导入 _在此之前_ `uuid`。自 `uuid` 也可能是其他进口商品的过渡依赖性 进口最安全 `react-native-get-random-values` 作为进入点的第一件事:

```javascript
import 'react-native-get-random-values';
import { v4 as uuidv4 } from 'uuid';
```

* * *

从 [读取ME js.md](https://npmcn.com/package/%40aigne/uuid/README_js.md) 以 [![](https://camo.githubusercontent.com/5c7c603cd1e6a43370b0a5063d457e0dabb74cf317adc7baba183acb686ee8d0/687474703a2f2f692e696d6775722e636f6d2f634a4b6f3662552e706e67)](https://github.com/broofa/runmd)

## 常见问题

### @aigne/uuid 是什么？

RFC9562 铀浓缩物

### 如何安装 @aigne/uuid？

在项目目录运行 npm install @aigne/uuid，或使用 pnpm add / yarn add / bun add。它还提供命令行工具 uuid，可以用 npx uuid 直接运行。

### @aigne/uuid 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @aigne/uuid 支持 ESM 还是 CommonJS？

同时提供 ES Module 与 CommonJS 入口，import 和 require\(\) 都可以使用，打包工具会自动选择合适的版本。

### @aigne/uuid 可以商用吗？

@aigne/uuid 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @aigne/uuid 的下载量有多少？

根据 npm 官方下载统计，@aigne/uuid 在 2026/10/05 – 2026/11/03 这 30 天内被下载 2,270 次，日均约 76 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @aigne/uuid 还在维护吗？

最新版本 13\.0\.1 发布于 2025/10/01（1\.1 年前）；至今共发布 2 个版本，其中过去 12 个月发布了 0 个；首次发布于 2025/10/01。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

