# @ariakit/test 中文文档

规范地址：https://npmcn.com/package/%40ariakit/test/

版本：0\.8\.2
npm 元数据更新时间：2026-10-14T08:57:29.574Z
中文译文更新时间：2026-11-06T18:48:36.030Z
软件包许可：MIT

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

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

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

- 包体积（解压后）：466 kB，45 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- 运行依赖：2 个
- peer 依赖：react ^18\.0\.0 \|\| ^19\.0\.0，@playwright/test ^1\.27\.0，@testing-library/react ^13\.0\.0 \|\| ^14\.0\.0 \|\| ^15\.0\.0 \|\| ^16\.0\.0
- 首次发布：2022-10-08T02:55:39.005Z
- 最新版本发布：2026-10-14T08:57:29.163Z
- 近 30 天下载量：112336（2026-10-07 至 2026-11-05，npm 官方下载统计）
- 已发布版本数：67（近 12 个月 16 个）

## 中文简介

Ariakit 测试功用

## 安装

```sh
npm install @ariakit/test
```

也可以使用：`pnpm add @ariakit/test`、`yarn add @ariakit/test`、`bun add @ariakit/test`

## README

# Ariakit 测试

**重要内容:** 这个软件包是实验性的,并不遵循语义化的版本,意思是断裂变化可能发生在补丁和小版本中.

Ariakit的单位和端到端测试中模拟用户交互功能.

## 目录

-   [安装](https://npmcn.com/package/%40ariakit/test/#readme-installation)
-   [使用量](https://npmcn.com/package/%40ariakit/test/#readme-usage)
-   [API 参考](https://npmcn.com/package/%40ariakit/test/#readme-api-reference)
-   [反应 API 引用](https://npmcn.com/package/%40ariakit/test/#readme-react-api-reference)
-   [播放作家 API 引用](https://npmcn.com/package/%40ariakit/test/#readme-playwright-api-reference)
-   [核心小组](https://npmcn.com/package/%40ariakit/test/#readme-core-team)
-   [捐款](https://npmcn.com/package/%40ariakit/test/#readme-contributing)

## 安装

```sh
npm i @ariakit/test
```

## 使用量

从软件包根导入助手以模拟用户互动 :

```ts
import { click, press, type } from "@ariakit/test";
```

这个 `@ariakit/test/react` 切入点使反应组件用于测试 `@ariakit/test/playwright` 入口为 Playwright 测试提供查询帮助.

### 测试环境

帮手们希望有一个DOM执行 `PointerEvent`,意思是快乐度,jsdom v27 或后期,或真正的浏览器.

他们仍然运行在jsdom26 `jest-environment-jsdom` 三十取决. 每一次帮助者射击的事件 都带着同样的鼠标 修饰器和指向器成员 随处随地 `clientX`, (中文(简体) ), `button`, (中文(简体) ), `pointerId`,修改器则在浏览器中表示. `click`, (中文(简体) ), `auxclick`,以及 `contextmenu` 是从 `MouseEvent` 而不是说 `PointerEvent`,也使成员保持浏览器计算.

这个 `pointer*` 事件是环境无法从自己的界面建立起来的,所以它们来自 `Event` 却不是 `instanceof MouseEvent`。调度层仍然产生 `pageX`, (中文(简体) ), `pageY`,以及 `which`,但不要依赖布局 `offsetX` 财务报告和审定财务报表 `offsetY` 未定义 。 这个 `PointerEvent` 完全没有全球,所以 `new PointerEvent()` 财务报告和审定财务报表 `event instanceof PointerEvent` 丢出一个 `ReferenceError`。 。 。 .

## API 参考

-   [`blur`](https://npmcn.com/package/%40ariakit/test/#readme-blur)
-   [`click`](https://npmcn.com/package/%40ariakit/test/#readme-click)
-   [`dispatch`](https://npmcn.com/package/%40ariakit/test/#readme-dispatch)
-   [`focus`](https://npmcn.com/package/%40ariakit/test/#readme-focus)
-   [`hover`](https://npmcn.com/package/%40ariakit/test/#readme-hover)
-   [`mouseDown`](https://npmcn.com/package/%40ariakit/test/#readme-mousedown)
-   [`mouseUp`](https://npmcn.com/package/%40ariakit/test/#readme-mouseup)
-   [`press`](https://npmcn.com/package/%40ariakit/test/#readme-press)
-   [`query`](https://npmcn.com/package/%40ariakit/test/#readme-query)
-   [`q`](https://npmcn.com/package/%40ariakit/test/#readme-q)
-   [`rightClick`](https://npmcn.com/package/%40ariakit/test/#readme-rightclick)
-   [`select`](https://npmcn.com/package/%40ariakit/test/#readme-select)
-   [`sleep`](https://npmcn.com/package/%40ariakit/test/#readme-sleep)
-   [`tap`](https://npmcn.com/package/%40ariakit/test/#readme-tap)
-   [`type`](https://npmcn.com/package/%40ariakit/test/#readme-type)
-   [`waitFor`](https://npmcn.com/package/%40ariakit/test/#readme-waitfor)

### `blur`

```ts
function blur(element?: DirtiableElement | null): Promise<void>;
```

从元素中去除焦点,模拟一个真正的用户移动焦点远离它. 当没有元素被传递时,当前聚焦的元素(`document.activeElement`)为被使用. 如果打入自元素被聚焦后改变其值, a `change` 事件会在模糊之前发出.

示例

```ts
await type("hello", q.textbox());
// Dispatches the pending `change` event, then blurs the textbox.
await blur();
```

[回到顶部](https://npmcn.com/package/%40ariakit/test/#readme-api-reference)

### `click`

```ts
function click(
  element: Element | null,
  options?: PointerEventInit,
  tap = false,
): Promise<void>;
```

点击一个元素,模拟一个真正的鼠标点击所产生的事件的顺序——在目标上徘徊,然后 `pointerdown`, (中文(简体) ), `mousedown`, (中文(简体) ), `focus`, (中文(简体) ), `pointerup`, (中文(简体) ), `mouseup`,以及 `click`。 。 。 .

隐藏和被禁用元素的处理方式与浏览器一样,并点击标签, `option` 元素,和形式控件的行为类似本地交互. 过 `options` 以设置修改键等事件属性(例如). `{ shiftKey: true }`) (中文(简体) ).

过 `button` 键。 激活行为持续 `click`所以非主按钮起火 `auxclick` 而不是激活标签或 `option` 元素,次要按钮也起火 `contextmenu` 当它被压住的时候 每个步骤都会产生 `buttons` 从按钮,所以明确 `buttons` 此处被忽略; `mouseDown` 财务报告和审定财务报表 `mouseUp` 接受一个描述 和弦的手势.

示例

```ts
await click(q.button("Submit"));
// With a modifier key held down:
await click(q.option("Item"), { shiftKey: true });
// With the middle mouse button, firing `auxclick`:
await click(q.link("Ariakit"), { button: 1 });
```

[回到顶部](https://npmcn.com/package/%40ariakit/test/#readme-api-reference)

### `dispatch`

```ts
type Target = Document | Window | Node | Element | null;

type EventFunction = (element: Target, options?: object) => Promise<boolean>;

type DispatchEventType = Exclude<EventType, "doubleClick"> | "auxClick";

type EventsObject = {
  [K in DispatchEventType]: EventFunction;
};

const dispatch: typeof baseDispatch & EventsObject;
```

在元素上创建并点出 DOM 事件, 然后等待产生的微任务冲出 。 打电话 `dispatch.<eventName>(element, options)` 用于构建和点燃特定事件(例如:. `dispatch.keyDown`, (中文(简体) ), `dispatch.click`, (中文(简体) ), `dispatch.input`),或打电话 `dispatch(element, event)` 直接带 `Event` 举个例子.

不同于高级助手,如 `click` 财务报告和审定财务报表 `type`,这个点出单个事件而不模拟周围的交互序列. 向元素发射指向和鼠标事件 `pointer-events: none` 被重新发送到已启用指针事件的最近的祖先上, 匹配浏览器如何引导这些事件 .

由名称构建的指针事件报告一个设备的接触大小和转录器角度浏览器报告,所以 `width` 财务报告和审定财务报表 `height` 为: `1` 财务报告和审定财务报表 `altitudeAngle` 是一个正确的角度。 只提供倾斜或球面角度的对从另一对得到. 成员描述一种姿态,例如: `pressure` 财务报告和审定财务报表 `isPrimary`中,保留其默认值;上级帮助者填写。 你构造自己的一个事件 无论建筑师给它什么.

按名称创建的鼠标和指针事件 `pageX` 财务报告和审定财务报表 `pageY` 从客户端坐标和目标窗口滚动中取出 `which` 从 `button`。基于布局的 `offsetX` 财务报告和审定财务报表 `offsetY` 保持环境价值.

`click`, (中文(简体) ), `auxclick`,以及 `contextmenu` 建为 `PointerEvent`,浏览器发送它们的方式,所以它们接受和报告指针属性,例如 `pointerType`。无环境 `PointerEvent` 建为 `MouseEvent` 相反,他们报告 相同的属性在那里.

回归:决心 `false` 当事件默认动作被阻止时 `event.preventDefault()`,以及 `true` 否则.

示例

```ts
await dispatch.keyDown(q.textbox(), { key: "Enter" });
await dispatch.click(q.button());
await dispatch.auxClick(q.link("Ariakit"), { button: 1 });
// Fire a custom event instance directly:
await dispatch(q.textbox(), new Event("selectstart", { bubbles: true }));
```

[回到顶部](https://npmcn.com/package/%40ariakit/test/#readme-api-reference)

### `focus`

```ts
function focus(element: Element | null): Promise<void>;
```

将焦点移动到元素上,模拟一个真正的用户聚焦它. 不聚焦的元素会被忽略,而聚焦已经聚焦的元素则是一个不聚焦. 如果打入自获得焦点以来更改了另一个元素的值,则待处理 `change` 在焦点移动前发送事件.

示例

```ts
await focus(q.textbox());
expect(q.textbox()).toHaveFocus();
```

[回到顶部](https://npmcn.com/package/%40ariakit/test/#readme-api-reference)

### `hover`

```ts
function hover(
  element: Element | null,
  options?: PointerEventInit,
): Promise<void>;
```

将指针移到元素上方,模拟在元素上徘徊的真正用户。 发射相关 `pointer`编号 :`mouse` 输入、 过并移动事件, 并发送先前悬浮元素上的相匹配的休假事件.

隐藏元素和元素 `pointer-events: none` 以浏览器的方式处理。 过 `options` 以设置修改键等事件属性。 指针事件报告 `pressure: 0`,或 `0.5` 当你通过 `buttons` 以描述按住按钮的动作, 如拖动时.

示例

```ts
await hover(q.button("More options"));
expect(q.menu()).toBeVisible();
```

[回到顶部](https://npmcn.com/package/%40ariakit/test/#readme-api-reference)

### `mouseDown`

```ts
function mouseDown(
  element: Element | null,
  options?: PointerEventInit,
): Promise<void>;
```

在元素上按下指针按钮, 开火 `pointerdown` 财务报告和审定财务报表 `mousedown` 并按浏览器的方式移动焦点。 已禁用元素仍然收到指针事件,但没有 `mousedown`,当目标本身不具有可聚焦性时,焦点会回到最接近可聚焦的祖先.

这是满分的一步 `click`;直接用于测试按住行为. 过 `options` 以设置修改键等事件属性,或 `button` 键。 事件报告按下按钮 `buttons`,就像浏览器一样,除非你通过 `buttons` 来形容一个和弦的姿态 当该值显示另一个按钮已被扣住时, 媒体会起火 `pointermove` 改为 `pointerdown`,指针事件引导带和弦的相容性 `mousedown` 仍然开火。 指针事件报告 `pressure: 0.5`,值指针事件定义,而没有压力传感器的设备则按下按钮.

示例

```ts
await mouseDown(q.button("Resize"));
// ...assert the press state, then release:
await mouseUp(q.button("Resize"));
```

[回到顶部](https://npmcn.com/package/%40ariakit/test/#readme-api-reference)

### `mouseUp`

```ts
function mouseUp(
  element: Element | null,
  options?: PointerEventInit,
): Promise<void>;
```

释放元素上的指针按钮,开火 `pointerup` 财务报告和审定财务报表 `mouseup`。残废元素仍然收到指针事件,但没有 `mouseup`。 。 。 .

这是对应的 `mouseDown` 和满分的一步 `click`。通过 `options` 以设置修改键等事件属性,或 `button` 以释放另一个鼠标按钮。 事件报告,没有按钮仍然被扣在 `buttons`,就像浏览器一样,除非你通过 `buttons` 来描述一个和弦手势保持的按钮 当该值显示另一个按钮仍被扣住时,释放会起火 `pointermove` 改为 `pointerup`,指针事件引导和弦释放的方式,以及兼容性 `mouseup` 仍然开火。 指针事件报告 `pressure: 0`,或 `0.5` 和弦的手势保持了扣子.

示例

```ts
await mouseDown(q.button("Resize"));
await mouseUp(q.button("Resize"));
```

[回到顶部](https://npmcn.com/package/%40ariakit/test/#readme-api-reference)

### `press`

```ts
function press(
  key: string,
  element?: Element | null,
  options: KeyboardEventInit = {},
): Promise<void>;
```

按键在一个元素上,模拟真正的用户键盘交互. 火灾 `keydown` 财务报告和审定财务报表 `keyup` 并应用浏览器对该密钥的默认行为——移动焦点 `Tab`,激活按钮并提交表格 `Enter`,单击按钮、复选框和收音机 `Space`带着箭移动护身符 `Home`编号 :`End` 键,并将可打印字符输入文本字段.

当未通过元素时,使用当前聚焦元素. 快捷键, 如 `press.Enter()` 财务报告和审定财务报表 `press.Tab()` 提供通用密钥,以及 `press.ShiftTab()` 向后移动焦点.

使用 `press.down` 财务报告和审定财务报表 `press.up` 只能按键或按键 半个按键。 每个默认到当前聚焦元素,因此焦点移出后释放出的一个密钥——例如,一个在按键下自禁的元素——会到达一个真正的浏览器会提供它的地方.

示例

```ts
await press.Tab();
await press.Enter();
// `press.Enter(element)` is shorthand for `press("Enter", element)`:
await press.Enter(q.button("Submit"));
// Split a press so the keyup lands on whatever is focused at release time:
await press.down.Space();
await press.up.Space();
```

[回到顶部](https://npmcn.com/package/%40ariakit/test/#readme-api-reference)

### `query`

```ts
type Query = ReturnType<typeof createRoleQuery>;

type TextQuery = ReturnType<typeof createTextQuery>;

type RoleQueries = Record<AriaRole, Query>;

interface QueryObject extends RoleQueries {
  text: TextQuery;
  labeled: TextQuery;
  within: (element?: HTMLElement | null) => QueryObject;
}

const query: QueryObject;
```

通过ARIA角色查询DOM,可访问的名称,文本,或标签,建于测试库上. 调用一个角色方法, 如 `query.button(name)` 或者说 `query.dialog()` 以获取匹配元素,通过字符串或 `RegExp` 以匹配其无障碍名称。 找不到匹配元素时进行查询。 使用 `query.text()` 财务报告和审定财务报表 `query.labeled()` 按文本内容或相关标签查询,以及 `query.within(element)` 到子树的瞄准查询.

每一个查询都会曝光 `.lazy` (返回在调用时运行查询的可重用函数), `.all` (返回所有匹配,包括空阵列), `.wait` (一旦元素出现即予解决),和 `.maybe` (返回数) `null` 当取去)变相. 角色查询 `.hidden` 包括隐藏的元素.

示例

```ts
const dialog = query.dialog.maybe.lazy("Settings");
expect(dialog()).not.toBeInTheDocument();
await click(query.button("Open settings"));
expect(dialog()).toBeVisible();
// Wait for an element to appear, or scope a query to a subtree:
await query.alert.wait();
query.within(dialog()).button("Close");
```

[回到顶部](https://npmcn.com/package/%40ariakit/test/#readme-api-reference)

### `q`

```ts
type Query = ReturnType<typeof createRoleQuery>;

type TextQuery = ReturnType<typeof createTextQuery>;

type RoleQueries = Record<AriaRole, Query>;

interface QueryObject extends RoleQueries {
  text: TextQuery;
  labeled: TextQuery;
  within: (element?: HTMLElement | null) => QueryObject;
}

const q: QueryObject;
```

简称: `query`通过ARIA角色,无障碍名称,文本,或标签查询DOM.

示例

```ts
const dialog = q.dialog.maybe.lazy("Settings");
expect(dialog()).not.toBeInTheDocument();
await click(q.button("Open settings"));
expect(dialog()).toBeVisible();
```

[回到顶部](https://npmcn.com/package/%40ariakit/test/#readme-api-reference)

### `rightClick`

```ts
function rightClick(
  element: Element | null,
  options?: PointerEventInit,
): Promise<void>;
```

右键点击一个元素,模拟一个真正的二次鼠标点击产生的事件的顺序——在目标上徘徊,然后右键 `pointerdown`, (中文(简体) ), `mousedown`, (中文(简体) ), `focus`, (中文(简体) ), `contextmenu`, (中文(简体) ), `pointerup`, (中文(简体) ), `mouseup`,以及 `auxclick`。 。 。 .

隐藏元素的处理方式与浏览器相同,没有合成 `click` 事件被解除。 过 `options` 以设置修改键等事件属性.

示例

```ts
await rightClick(q.text("Open menu"));
```

[回到顶部](https://npmcn.com/package/%40ariakit/test/#readme-api-reference)

### `select`

```ts
function select(
  text: string,
  element: Element | null = document.body,
  options?: PointerEventInit,
): Promise<void>;
```

在元素中选择一个文本范围,模拟一个真正的用户拖过它。 在元素上按住,找到给定的 `text` 在其后人文字节点中,设置文档选择以覆盖,再放出.

当元素没有传递时, `document.body` 已使用。 过 `options` 以设置修改键等事件属性。 每个步骤都会产生 `buttons` 从它按的按钮, 所以一个明确的 `buttons` 被忽略.

示例

```ts
await select("hello world");
expect(document.getSelection()?.toString()).toBe("hello world");
```

[回到顶部](https://npmcn.com/package/%40ariakit/test/#readme-api-reference)

### `sleep`

```ts
function sleep(ms = defaultMs): Promise<void>;
```

等待DOM通过在两个动画帧之间产生出结果和短暂的超时,在模拟交互之间和解.

此套件中的其他帮助者在内部调用它, 但是您可以直接等待它让待更新, 过渡, 或效果冲洗在坚持前 。 默认延迟为小而取决于环境; 通过 `ms` 以覆盖它。 在真实的浏览器之外,它也会排出主机调度器,从而同时进行React工作,使得延迟在调用解决之前就解决了过去的问题.

示例

```ts
await click(q.button("Open"));
await sleep();
expect(q.dialog()).toBeVisible();
```

[回到顶部](https://npmcn.com/package/%40ariakit/test/#readme-api-reference)

### `tap`

```ts
function tap(
  element: Element | null,
  options?: PointerEventInit,
): Promise<void>;
```

点击元素而无需短暂延迟 `click` 等待在按下和放出之间, 复制快速水龙头的时间。 它发射相同的指针,鼠标,并单击事件为 `click`。通过 `options` 以设置修改键等事件属性.

示例

```ts
await tap(q.button("Submit"));
```

[回到顶部](https://npmcn.com/package/%40ariakit/test/#readme-api-reference)

### `type`

```ts
function type(
  text: string,
  element?: (DirtiableElement & HTMLElement) | null,
  options: InputEventInit | KeyboardEventInit = {},
): Promise<void>;
```

将文本输入元素,模拟一个真正的用户按下每个键。 聚焦元素, 然后为每个字符起火 `keydown`,通过 `input` 事件(事前为 `keypress` 当插入可打印字符时,并点火 `keyup`。 。 。 .

其密钥的特殊字符映射 : `"\b"` 是后空间, `"\x7f"` 删除, `"\n"` 输入,并且 `"\t"` 为 Tab 。 当未通过元素时,使用当前聚焦元素. 过 `options` 以设置诸如修改键或组成状态等事件属性.

示例

```ts
await type("Hello", q.textbox());
// Delete the last character with a Backspace:
await type("\b");
```

[回到顶部](https://npmcn.com/package/%40ariakit/test/#readme-api-reference)

### `waitFor`

```ts
function waitFor<T>(
  callback: () => T,
  options?: DOMTestingLibrary.waitForOptions,
): Promise<T>;
```

重新运行回调, 直到它停止抛出或超时, 重新导出测试库 `waitFor` 使用此软件包的合成分批处理。 用它来等待一个断言在同步更新后通过. 过 `options` 来配置 `timeout`, (中文(简体) ), `interval`还有其他行为.

示例

```ts
await click(q.button("Close"));
await waitFor(() => expect(q.dialog.maybe()).not.toBeInTheDocument());
```

[回到顶部](https://npmcn.com/package/%40ariakit/test/#readme-api-reference)

## 反应 API 引用

-   [`RenderOptions`](https://npmcn.com/package/%40ariakit/test/#readme-renderoptions)
-   [`render`](https://npmcn.com/package/%40ariakit/test/#readme-render)

### `RenderOptions`

```ts
interface RenderOptions extends Omit<
  ReactTestingLibrary.RenderOptions,
  "queries"
> {
  strictMode?: boolean;
}
```

B. 关于 `render` 函数。 接受测试库的每个选项 `render` (除外) `queries`),加 (中文(简体) ) `strictMode` 在 React 中包裹已渲染的 UI `StrictMode`。 。 。 .

示例

```tsx
const options: RenderOptions = { strictMode: true };
await render(<App />, options);
```

[回到顶部](https://npmcn.com/package/%40ariakit/test/#readme-react-api-reference)

### `render`

```ts
function render(
  ui: ReactNode,
  options?: RenderOptions,
): Promise<{
  unmount: () => void;
  rerender: (newUi: ReactNode) => Promise<void>;
}>;
```

将一个反应元素放入文档中进行测试,等待效果和下一个框架在解析前冲出.

建于测试库 `render`返回时 `unmount` 删除树和自动同步 `rerender` 用新的UI更新它. 过 `strictMode: true` 将元素包裹在 React 中 `StrictMode`,或任何其他测试库选项.

示例

```tsx
const { rerender, unmount } = await render(<Button>Submit</Button>);
await click(q.button("Submit"));
await rerender(<Button>Sent</Button>);
unmount();
```

[回到顶部](https://npmcn.com/package/%40ariakit/test/#readme-react-api-reference)

## 播放作家 API 引用

### `query`

```ts
type RoleQuery = (
  name?: string | RegExp,
  options?: Parameters<Page["getByRole"]>[1],
) => Locator;

type TextQuery = (
  name: Parameters<Page["getByText"]>[0],
  options?: Parameters<Page["getByText"]>[1],
) => Locator;

type RoleQueries = Record<AriaRole, RoleQuery>;

type Queries = RoleQueries & { text: TextQuery };

function query(locator: Page | Locator | FrameLocator): Queries;
```

为 Playwright 创建基于角色和文本的查询助手 `Page`, (中文(简体) ), `Locator`,或 `FrameLocator`。称为角色方法,例如 `query(page).button(name)` 获取一个 `Locator` 从 `getByRole`,或 `query(page).text(name)` 以文本内容匹配.

名称完全对应默认 。 这反映了基于角色的 `query` 从软件包根进行端到端的 Playwright 测试.

示例

```ts
const { button, dialog } = query(page);
await button("Open").click();
await expect(dialog()).toBeVisible();
```

[回到顶部](https://npmcn.com/package/%40ariakit/test/#readme-playwright-api-reference)

## 核心小组

-   [迭戈·哈兹](https://bsky.app/profile/haz.dev)
-   [本·罗德里](https://bsky.app/profile/ben.ariakit.org)
-   [达尼·瓜地罗拉](https://bsky.app/profile/dio.la)

## 捐款

遵守关于 [贡献指南](https://github.com/ariakit/ariakit/blob/main/contributing.md)。 。 。 .

## 常见问题

### @ariakit/test 是什么？

Ariakit 测试功用

### 如何安装 @ariakit/test？

在项目目录运行 npm install @ariakit/test，或使用 pnpm add / yarn add / bun add。

### @ariakit/test 支持 TypeScript 吗？

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

### @ariakit/test 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @ariakit/test 可以商用吗？

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

### @ariakit/test 的下载量有多少？

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

### @ariakit/test 还在维护吗？

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

