RxJS
RxJS 是一个用于使用 Observable 值组合异步和基于事件的程序的库。此仓库包含基于平台的下一代 RxJS,计划发布为 RxJS 9。
RxJS 9 是正在开发中的预发布版本。计划的首个 beta 版本是
9.0.0-beta.0,但尚未发布到 npm。next标签仍然 指向早期的 RxJS 8 预发布版本,而 RxJS 7 仍然是生产latest版本并继续得到维护。
为什么是 RxJS 9?RxJS 8 发生了什么?
RxJS 8 是实际的工作,并非跳过的版本。开发几年前就已开始, 并在 Web Platform Observable 提案定稿期间暂停。新的 实现是基于平台的新一代,而非该暂停的 RxJS 8 分支的延续,因此从版本 9 开始,以明确架构 的断裂,并避免将旧的 RxJS 8 工作呈现为已发布的 产品。
RxJS 9 有什么不同?
- RxJS 在存在原生 web 平台
Observable时使用它,仅在需要时安装一个符合规范的后备方案。 - RxJS 操作符和工厂是精确的、模块拥有的 Symbols。它们不会向平台 API 添加字符串命名的 RxJS 方法。
- 平台 Observable 行为和每个订阅的生产者行为是明确的、独立的契约。当每个直接订阅必须创建自己的生产者时,请使用
ColdObservable。 - 取消机制基于
AbortSignal和平台 Subscriber 生命周期构建。 - 发布的 JavaScript 仅支持 ESM。当前 Node 可以将
require()桥接到相同的 ESM 文件;没有重复的 CommonJS 构建。
预览 RxJS 9 API
以下示例展示了计划中的 beta API。在 9.0.0-beta.0 发布之前,请勿使用 npm 的 next 标签来安装 RxJS 9。
import { ColdObservable } from 'rxjs';
import { map } from 'rxjs/map';
const source = new ColdObservable<number>((subscriber) => {
subscriber.next(1);
subscriber.next(2);
subscriber.complete();
});
source[map]((value) => value * 2).subscribe(console.log);
导入 Symbol 并使用括号语法调用它。诸如
observable.map(project) 这样的平台方法仍然是平台契约;
observable[map](project) 是独立版本化的 RxJS 契约。
包和文档
| 包 | 用途 | 文档 |
|---|---|---|
rxjs | Symbol 扩展和有意设计的 RxJS 原语 | 包指南 · API · RxJS 7 迁移 |
@rxjs/observable-polyfill | 条件性平台 Observable 回退 | 包指南 |
@rxjs/test | 与实现无关的虚拟时间和大理石测试 | 包指南 |
@rxjs/migrate | 确定性迁移引擎和规范代理 Skill | 包指南 |
发布支持、预算以及精确的环境门槛记录在
rxjs 包中。不可逆的 npm
发布流程是公开的安全发布操作手册。
RxJS 9 安全保证文档
在上下文中解释了发布证据、验证命令、单一维护者模型
以及 OpenSSF Scorecard。
整个仓库的设计记录位于
docs/rxjs-next。
支持的环境
计划中的 beta 版本将 Node 22.13+ 和 Node 24 作为阻塞性通道,Node 26 作为建议性通道。当前版本的 Chrome、Firefox、桌面版 Safari、移动版 Safari、 Deno、Bun 和 Webpack 5 均为阻塞性。所有受支持的消费者都接收 相同的 ESM 实现,因此 Deno 和 Bun 支持不会增加任何运行时特定的 包或应用捆绑代码。
贡献
需要 Node 22.13+ 和 pnpm 10.34.5。请在仓库根目录运行命令。
pnpm install
pnpm --filter rxjs exec vitest --run src
pnpm --filter rxjs run test:package
pnpm run release:check
从仓库贡献指南和
rxjs 包贡献指南开始。当前
执行队列是 PROJECT_PLAN.md。
完整的源固定 RxJS 7 语料库有意保留了已审查的 生命周期和兼容性差异,因此它是迁移证据,而非 全面的 RxJS 9 兼容性门槛。聚焦的源、包、运行时、 浏览器、性能和 WPT 命令是发布门槛。