# @exodus/replay 中文文档

规范地址：https://npmcn.com/package/%40exodus/replay/

版本：1\.0\.0-rc\.11
npm 元数据更新时间：2026-02-07T19:10:14.832Z
中文译文更新时间：2026-11-14T03:56:23.292Z
软件包许可：MIT

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

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

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

- 包体积（解压后）：31.1 kB，8 个文件
- 模块格式：ES Module
- TypeScript 类型：未声明
- 运行依赖：0 个
- 首次发布：2024-08-07T09:59:58.114Z
- 最新版本发布：2026-02-07T19:10:13.481Z
- 近 30 天下载量：19154（2026-10-14 至 2026-11-12，npm 官方下载统计）
- 已发布版本数：12（近 12 个月 2 个）

## 中文简介

记录/检查/重放获取和WebSocket会话

## 安装

```sh
npm install @exodus/replay
```

也可以使用：`pnpm add @exodus/replay`、`yarn add @exodus/replay`、`bun add @exodus/replay`

## README

# 记录/检查/重放 `fetch` 财务报告和审定财务报表 `WebSocket` 会议

用于离线测试

这些执行工作并非专门针对 `@exodus/test` 并可以单独使用

零依赖性,可捆绑

复制人可以在 V8 / JavaScriptCore / Hermes 中运行, 即使没有执行网络 API

```js
import { fetchRecorder, fetchReplayer, WebSocketRecorder, WebSocketReplayer, prettyJSON } from '@exodus/replay'
```

生成日志 [是人可读](https://npmcn.com/package/%40exodus/replay/#readme-samples)

### `fetchRecorder(log[, { fetch }])`

回返a `fetch` 执行,将所有请求附于提供 `log` 数组

`log` 以附加新请求来变异

如果一个基地 `fetch` 执行没有通过,全球 `fetch` 用作基础

这可以被推翻,例如. `fetchRecorder(log, { fetch: require('node-fetch') })`

### `fetchReplayer(log)`

回返a `fetch` 对所提供请求的答复 `log` 数组

请求通过“ 第一次匹配” 命令得到服务, 从内部日志克隆中丢弃

`log` 是要是数组,而不是变异

### `WebSocketRecorder(log[, { WebSocket }])`

回返a `WebSocket` 执行,将所有会话都附加到所提供的 `log` 数组

`log` 以附加新会话来变异

如果一个基地 `WebSocket` 执行没有通过,全球 `WebSocket` 用作基础

这可以被推翻,例如. `WebSocketRecorder(log, { WebSocket: require('ws') })`

### `WebSocketReplayer(log[, { interval = 0 }])`

回返a `WebSocket` 提供会议的答复 `log` 数组

会话由“ 第一次匹配” 顺序服务, 从内部日志克隆中丢弃

`log` 是要是数组,而不是变异

可以选择, `interval` 可用于控制回放速度:

-   `interval = 0` (默认)
    
-   `interval = Infinity` 匹配原始记录的事件时间
    
-   `interval = number` 事件之间的延迟 `Math.min(number, recorededDelay)`
    

### `prettyJSON(data, { width = 120 })`

用它来打印日志 : `prettyJSON(log)`

喜欢 `JSON.stringify()`,但有相当的印刷 的可读性和方便,如果检查

输出可解析为 `JSON.parse()`

简而言之,装入 `width` 未保证,但输出在运行之间稳定

## 样本

### `fetch` 录音

```json
{
  "request": {
    "resource": "https://jsonplaceholder.typicode.com/users/2",
    "options": { "headers": [["accept", "application/json"]] }
  },
  "status": 200,
  "statusText": "OK",
  "ok": true,
  "headers": [
    ...
    ["connection", "keep-alive"],
    ["content-encoding", "br"],
    ["content-type", "application/json; charset=utf-8"],
    ["date", "Sat, 03 Aug 2024 16:57:51 GMT"],
    ...
  ],
  "url": "https://jsonplaceholder.typicode.com/users/2",
  "redirected": false,
  "type": "basic",
  "bodyType": "json",
  "body": {
    "id": 2,
    "name": "Ervin Howell",
    "username": "Antonette",
    "email": "Shanna@melissa.tv",
    "address": {
      "street": "Victor Plains",
      "suite": "Suite 879",
      "city": "Wisokyburgh",
      "zipcode": "90566-7771",
      "geo": { "lat": "-43.9509", "lng": "-34.4618" }
    },
    "phone": "010-692-6593 x09125",
    "website": "anastasia.net",
    "company": {
      "name": "Deckow-Crist",
      "catchPhrase": "Proactive didactic contingency",
      "bs": "synergize scalable supply-chains"
    }
  }
}
```

### `WebSocket` 录音

```json
{
  "url": "wss://javascript.info/article/websocket/demo/hello",
  "log": [
    { "type": "get readyState", "at": 24, "value": 0 },
    { "type": "open", "at": 426 },
    { "type": "get readyState", "at": 426, "value": 1 },
    { "type": "get bufferedAmount", "at": 427, "value": 0 },
    { "type": "send()", "at": 427, "data": "Hi there" },
    { "type": "get bufferedAmount", "at": 427, "value": 8 },
    { "type": "message", "at": 543, "data": "Hello from server, there!" },
    { "type": "close()", "at": 543 },
    { "type": "get readyState", "at": 543, "value": 2 },
    { "type": "close", "at": 661, "code": 1005, "reason": "", "wasClean": true },
    { "type": "get readyState", "at": 661, "value": 3 }
  ]
}
```

## 常见问题

### @exodus/replay 是什么？

记录/检查/重放获取和WebSocket会话

### 如何安装 @exodus/replay？

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

### @exodus/replay 支持 TypeScript 吗？

该包的 package\.json 没有声明类型入口。需要类型提示时，可以在 npm 上查找社区维护的 @types/exodus\_\_replay 是否存在。

### @exodus/replay 支持 ESM 还是 CommonJS？

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

### @exodus/replay 可以商用吗？

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

### @exodus/replay 的下载量有多少？

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

### @exodus/replay 还在维护吗？

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

