# @effected/runtimes 中文文档

规范地址：https://npmcn.com/package/%40effected/runtimes/

版本：0\.19\.1
npm 元数据更新时间：2026-11-12T14:43:55.825Z
中文译文更新时间：2026-11-13T13:17:31.793Z
软件包许可：MIT

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

原始 npm 页面：https://www.npmjs.com/package/%40effected/runtimes
原文对照：https://npmcn.com/package/%40effected/runtimes/?lang=original
项目主页：https://github.com/spencerbeggs/effected/tree/main/packages/runtimes#readme
源码仓库：https://github.com/spencerbeggs/effected

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

- 包体积（解压后）：197 kB，23 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- Node.js 要求：\>=24\.11\.0
- 运行依赖：2 个
- peer 依赖：effect ~4\.1\.0
- 首次发布：2026-07-16T17:31:51.551Z
- 最新版本发布：2026-11-12T14:43:55.368Z
- 近 30 天下载量：3508（2026-10-13 至 2026-11-11，npm 官方下载统计）
- 已发布版本数：57（近 12 个月 57 个）

## 中文简介

解析 semver-compatible node.js, Bun和 Deno 运行时版本与下行倒计时.

## 安装

```sh
npm install @effected/runtimes
```

也可以使用：`pnpm add @effected/runtimes`、`yarn add @effected/runtimes`、`bun add @effected/runtimes`

## README

# @ 受影响/ 运行时间

[![npm](https://img.shields.io/npm/v/@effected%2Fruntimes?label=npm&color=cb3837)](https://www.npmjs.com/package/@effected/runtimes) [![License: MIT](https://img.shields.io/badge/License-MIT-4caf50.svg)](https://opensource.org/licenses/MIT) [![Node.js %3E%3D24.11.0](https://img.shields.io/badge/Node.js-%3E%3D24.11.0-5fa04e.svg)](https://nodejs.org/) [![TypeScript 7.0](https://img.shields.io/badge/TypeScript-7.0-3178c6.svg)](https://www.typescriptlang.org/)

解析从活版放出feed中解析出相容的节点.js,Bun和Deno等版本,并用捆绑的离线快照作为回放. 问 `>=20` 输入 `active-lts` 和每场比赛, 最新的第一, 加上LTS选取 和任何你提名的默认。 节点的生命周期阶段来自真实的 `nodejs/Release` 时刻表,并对照时钟进行评估,所以 `current`, (中文(简体) ), `active-lts`, (中文(简体) ), `maintenance-lts` 财务报告和审定财务报表 `end-of-life` 意思是说今天 而不是当套装出版的时候.

> **预`1.0.0`。 。 。 .** 此软件包是 `@effected/*` 在稳定基础上建造的工具包 效应v4(`effect` `~4.1.0`) 并仍在 `0.x` 发展。 稳定效果 制作一个工具箱 `1.0.0` 可能,不是自动的。 为了保持你的 `effect` 财务报告和审定财务报表 `@effect/*` 该工具包在线上构建和测试、安装 [`@effected/pnpm-plugin-effected`](https://www.npmjs.com/package/@effected/pnpm-plugin-effected)。 。 。 .
> 
> **稳定:不稳定.** 此软件包的 API 表面尚未考虑 完成并可能改变 `0.x` 释放 定一个确切的版本——甚至 标记软件包 _稳定_ 在此之前 `1.0.0` 可以引入突破性更改 和精确的针 变成一个类型检查错误 而不是一个 跑步时间惊喜。 完全政策: [释放策略](https://github.com/spencerbeggs/effected#release-strategy)。 。 。 .

## 为什么 @ 受影响/ 运行时间

每一个回答都包含一个诚实 `source`。解析器可以获取实时数据,但无声无息的失败,提供快照和报告 `source: "api"` 比从未有过快照的更糟糕的是,你无法从僵硬的答案中分辨出新的答案,而一个CI工作在它的工具链上接上一个季度将愉快地安装一个当前版本。 这里的字段由实际包含指数的任意策略设置: `"api"` 当时,有食物, `"cache"` 当快照发生时,包括当自动策略倒回它时,倒下记录在路上的警告.

新鲜度政策是一层,不是一面旗帜,层层也懒:建设一号表演不做IO,第一个 `resolve` 获取饲料, 每一个后来的解决方案 共享人口。 类型如下: `layerOffline` 不需要任何东西, 因为快照读取不需要传输 。 下 `layerFresh`, (中文(简体) ), `resolve` 失败 `FreshnessError`因为你选择说一个快照不是可以接受的替代物——并且因为抓取是在决心的时候发生的,那么失败就会到达你能够捕捉,重试或倒回的地方,而不是被地层构造所掩埋.

依赖树中也没有 HTTP 客户端 。 V3图书馆载有Octokit和 `@octokit/auth-app` 以获得两笔资金 `HttpClient` 从 `effect/http` 让你提供运输工具. `@effected/semver` 是唯一的运行时间依赖,而且是第一当事方.

## 安装

```bash
npm install @effected/runtimes effect
```

```bash
pnpm add @effected/runtimes effect
```

需要节点.js~~24.11.0.

全体 `@effected/*` 软件包仅为无害环境管理:只公布出口地图 `import` 条件,所以 `require()` 包括解析 CJS 模式的工具 —— 与节点失败 `ERR_PACKAGE_PATH_NOT_EXPORTED` 而不是装入不存在的 CJS 建筑。 从ES模块导入.

`effect` v4是唯一的对等依赖. `@effected/semver` 是一种正常的依附关系,它自动出现;没有其它东西到达你的树上.

现场解析需要 `HttpClient`边上提供 `FetchHttpClient.layer` 从 `effect/http` 那层没有自己的要求,所以在任何地方都行 `fetch` 已经 如果你只使用过 `layerOffline`您不需要HTTP客户端.

命令行接口船作为单独的包,所以这个包的消费者从来不安装 `@effect/platform-node`。 。 。 .

## 快开始

```ts
import { NodeResolver } from "@effected/runtimes";
import { Effect } from "effect";
import { FetchHttpClient } from "effect/http";

const program = Effect.gen(function* () {
  const node = yield* NodeResolver;
  return yield* node.resolve({ range: ">=20", phases: ["active-lts"] });
});

Effect.runPromise(program.pipe(Effect.provide(NodeResolver.layer), Effect.provide(FetchHttpClient.layer))).then(
  console.log,
);
// ResolvedVersions {
//   source: "api",          // "cache" if the feed was unreachable and the snapshot answered
//   versions: [...],        // every active-LTS Node matching >=20, newest first
//   latest: "...",          // the newest of them
//   lts: "..."              // the newest LTS pick
// }
```

节点不需要任何证书:既输入它读取的- nodejs.org的发布索引,又输入 `nodejs/Release` 附表——未经校正.

## 作为图层的缓存策略

三个解决者都暴露了同一个三层 **常数**数字 :

| 层 | 行为 | `resolve` 失败 | 要求数 |
| --- | --- | --- | --- |
| `layer` | 获取实时; 失败时返回捆绑的快照, 登录警告并报告 `source: "cache"` | 永远 | 解析器的运输 |
| `layerFresh` | 实时数据或无数据 | `FreshnessError` | 解析器的运输 |
| `layerOffline` | 只有捆绑的快照 没有IO. | 永远 | 无 |

每层都是 **懒惰**:建筑它不执行IO,所以合并所有三个解析器都没有任何代价,直到你真正解决一个。 第一个 `resolve` 获取饲料,后来并同时解决一个人口在该地层一生中所占的份额——包括自动战略的快照倒计时,这算作一个成功的人口,而不复出. 仅a _失败_ 人口没有被回忆:a `layerFresh` 解决失败 `FreshnessError` 留下下个决心来重试。 懒惰的时机也是为什么 `FreshnessError` 坐着 `resolve`'错误通道而不是图层'——建筑 `layerFresh` 不能失败;通过它可以解决.

这并非意外:

| 解析器 | 种子 | 要求数 |
| --- | --- | --- |
| `NodeResolver` | nodejs.org的发布索引和 `nodejs/Release` 附表——均为未经认证的 | `HttpClient` |
| `BunResolver` | GitHub 释放 `oven-sh/bun` | `GitHubClient` |
| `DenoResolver` | GitHub 释放 `denoland/deno` | `GitHubClient` |

`GitHubClient.layerDefault` 是包含电池的接线: 环境检测证书结束 `fetch`证书优先是: `GITHUB_PERSONAL_ACCESS_TOKEN`,则 `GITHUB_TOKEN`,然后是匿名的——GitHub允许匿名请求在更低的速率限制下. 自己供应 `GitHubAuth.token(redactedToken)`,或使用 `GitHubClient.layer` 直接带来证书和运输:

```ts
import { BunResolver, DenoResolver, GitHubClient, NodeResolver } from "@effected/runtimes";
import { Layer } from "effect";
import { FetchHttpClient } from "effect/http";

export const ResolversLive = Layer.mergeAll(
  NodeResolver.layer.pipe(Layer.provide(FetchHttpClient.layer)),
  BunResolver.layer.pipe(Layer.provide(GitHubClient.layerDefault)),
  DenoResolver.layer.pipe(Layer.provide(GitHubClient.layerDefault)),
);
```

`GitHubAuth.token` 返回每个呼叫的一新层,所以将它绑在一个康斯特上,而不是将它连上两次——层被引用来记起。 GitHub App认证(JWT 签名加安装-托肯交换)被故意不执行,因为它意味着运行时间依赖: `GitHubAuth` 是一个可插件服务, 以及需要 App auth 供应自己的应用程序 `Layer<GitHubAuth>`。 。 。 .

## 解决

`resolve` 取一个 semver 范围、 组合颗粒性和可选默认范围。 此外,节点还采用生命周期阶段来接受这些阶段,并在以下日期进行评估:

```ts
import { NodeResolver } from "@effected/runtimes";
import { Effect } from "effect";

const program = Effect.gen(function* () {
  const node = yield* NodeResolver;
  return yield* node.resolve({
    range: ">=18",
    phases: ["active-lts", "maintenance-lts"],
    increments: "minor",
    defaultVersion: "^22",
  });
}).pipe(Effect.provide(NodeResolver.layerOffline));
// ResolvedVersions with one entry per minor line, and `default` set to the newest match for ^22.
```

`increments` 组合匹配 : `latest` 保留每个主线的最新版本, `minor` 每个小行的最新补丁, `patch` 每一个匹配的发布. `range` 默认为 `*`, (中文(简体) ), `increments` 改为 `latest`和节点的 `phases` 改为 `["current", "active-lts"]`阶段评价日期来自 `Clock` 通过 `DateTime.now`这样 `TestClock` # 驾车而去 # `date` 把它钉上.

节点时刻表通过发布键入 _线条_而不是通过少校.. `nodejs/Release` 发表 `v0.8`, (中文(简体) ), `v0.10` 财务报告和审定财务报表 `v0.12` 作为三条不同的线, 并把它们都解为主要 `0` 把他们撞倒在先的哪个地方.

## 错误

| 标记 | 手段 | 恢复 |
| --- | --- | --- |
| `InvalidRangeError` | 分解范围不整齐. 升为 `@effected/semver` 从那里进口的. | 在一定范围内的打字是打字,而不是找到. 以一相报. |
| `NoMatchingVersionError` | 范围很好,没有匹配。 卡莉丝 `runtime`, (中文(简体) ), `constraint` 编辑 `phases` 搜索. | 扩大范围,或接受更多的阶段. |
| `UnresolvableDefaultError` | 明确 `defaultVersion` 被问及,没有匹配。 卡莉丝 `runtime` 财务报告和审定财务报表 `defaultVersion`。 。 。 . | 与上述不同,因为Node的默认否则会回到LTS选取中去——默默地放下它会像要求的那样将LTS交给你. |
| `FreshnessError` | A 类 `resolve` 下级 `layerFresh` 无法到达种子 。 卡莉丝 `runtime` 结构 `cause`。 。 。 . | 重试解析度( 失败的获取没有被记住) , 或返回到 `layer` 并接受一个快照. |
| `RateLimitError` | GitHub的利率极限已经用尽. 卡莉丝 `limit`, (中文(简体) ), `remaining` 和,当吉特赫布说, `retryAfter` 在几秒钟. | 认证或退后 `retryAfter`A级 `403` 从反应头被分类, 从来没有猜测 从身体. |
| `AuthenticationError` | GitHub拒绝了证书. 卡莉丝 `method` —— 说 `"token"` 或者说 `"anonymous"`。 。 。 . | 检查标志,或提供1. |
| `NetworkError` | 请求失败, 或返回一个既非认证又非利率限制的状态 。 卡莉丝 `url`,则 `status` 和结构 `cause`。 。 。 . | 允许 `403` 降落在这里,没有再考. |
| `ResponseParseError` | 一个种子响应了,但不能用这个软件包所期望的形状. 卡莉丝 `source` 结构 `cause`。 。 。 . | 一个操作员的信号 上游的饲料改变了。 错误的数据键入失败, 绝不是缺陷 . |

## 特征

-   `NodeResolver`, (中文(简体) ), `BunResolver`, (中文(简体) ), `DenoResolver` ——每跑出一次服务,每跑出一次服务 `layer`, (中文(简体) ), `layerFresh` 财务报告和审定财务报表 `layerOffline`。 。 。 .
-   `ResolvedVersions` —— 说 `source`, (中文(简体) ), `versions`, (中文(简体) ), `latest`,可选择 `lts` 财务报告和审定财务报表 `default`。空匹配是一个错误,而不是空结果,所以 `latest` 总是在场.
-   `NodeSchedule` 编号 : `NodePhase` 编号 : `NodeScheduleEntry` - 那个 `nodejs/Release` 使用寿命周期表,按放行键入 `isLtsPhase` 财务报告和审定财务报表 `nodeReleaseLine` 帮手.
-   `GitHubClient` 编号 : `GitHubAuth` 最小的 GitHub REST 客户端结束 `HttpClient`,带有匿名,显式和被环境检测的认证层. 绑定了边框, 并提供了服务器 `retry-after` 还没睡就封了.
-   `BunRelease`, (中文(简体) ), `DenoRelease`, (中文(简体) ), `NodeRelease` ——解码放出模式,外加 `GitHubTag` 财务报告和审定财务报表 `GitHubRelease` 用于制造REST载荷.
-   一直标出错误,每个错误都带有其原因的结构.

## 许可证

[麻省理工学院](https://npmcn.com/package/%40effected/runtimes/LICENSE)

## 常见问题

### @effected/runtimes 是什么？

解析 semver-compatible node\.js, Bun和 Deno 运行时版本与下行倒计时\.

### 如何安装 @effected/runtimes？

在项目目录运行 npm install @effected/runtimes，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：effect（~4\.1\.0）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### @effected/runtimes 支持 TypeScript 吗？

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

### @effected/runtimes 支持 ESM 还是 CommonJS？

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

### @effected/runtimes 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js \>=24\.11\.0。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### @effected/runtimes 可以商用吗？

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

### @effected/runtimes 的下载量有多少？

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

### @effected/runtimes 还在维护吗？

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

