@effected/runtimes

中文文档
0.19.1发布于 2026/11/12MITTypeScriptES Module构建来源已验证近 30 天下载 3508

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

中文使用文档
文档目录8 节
  1. 为什么 @ 受影响/ 运行时间
  2. 安装
  3. 快开始
  4. 作为图层的缓存策略
  5. 解决
  6. 错误
  7. 特征
  8. 许可证

@ 受影响/ 运行时间

npm License: MIT Node.js %3E%3D24.11.0 TypeScript 7.0

解析从活版放出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。 。 。 .

稳定:不稳定. 此软件包的 API 表面尚未考虑 完成并可能改变 0.x 释放 定一个确切的版本——甚至 标记软件包 稳定 在此之前 1.0.0 可以引入突破性更改 和精确的针 变成一个类型检查错误 而不是一个 跑步时间惊喜。 完全政策: 释放策略。 。 。 .

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

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

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

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

安装

npm install @effected/runtimes effect
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。 。 。 .

快开始

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 不能失败;通过它可以解决.

这并非意外:

解析器种子要求数
NodeResolvernodejs.org的发布索引和 nodejs/Release 附表——均为未经认证的HttpClient
BunResolverGitHub 释放 oven-sh/bunGitHubClient
DenoResolverGitHub 释放 denoland/denoGitHubClient

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

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 范围、 组合颗粒性和可选默认范围。 此外,节点还采用生命周期阶段来接受这些阶段,并在以下日期进行评估:

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交给你.
FreshnessErrorA 类 resolve 下级 layerFresh 无法到达种子 。 卡莉丝 runtime 结构 cause。 。 。 .重试解析度( 失败的获取没有被记住) , 或返回到 layer 并接受一个快照.
RateLimitErrorGitHub的利率极限已经用尽. 卡莉丝 limit, (中文(简体) ), remaining 和,当吉特赫布说, retryAfter 在几秒钟.认证或退后 retryAfterA级 403 从反应头被分类, 从来没有猜测 从身体.
AuthenticationErrorGitHub拒绝了证书. 卡莉丝 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载荷.
  • 一直标出错误,每个错误都带有其原因的结构.

许可证

麻省理工学院

版本与发布记录

@effected/runtimes 共发布 57 个版本,首次发布于 2026/07/17;过去 12 个月发布了 57 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.19.1latest2026/11/121 天前
0.19.02026/11/102 天前
0.18.32026/11/103 天前
0.18.22026/11/094 天前
0.18.12026/11/067 天前
0.18.02026/11/0310 天前

关于 @effected/runtimes 的常见问题

@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 和提交记录判断。