@frondruntime/react

中文文档
0.5.0发布于 2026/10/22MITTypeScriptES Module零依赖近 30 天下载 3691

React adapter for the Effect-powered Frond runtime.

原始使用文档
文档目录10 节
  1. Install
  2. Provider
  3. Read A Node
  4. Read Without Suspense
  5. Publish A Signal
  6. Runtime Lifecycle Hooks
  7. Testing
  8. Migrating
  9. Docs
  10. AI use

@frondruntime/react

React adapter for Frond: provider, Suspense-ready node hooks, preload, controls, error recovery, and React testing helpers.

Install

bun add @frondruntime/core @frondruntime/react effect mobx mobx-react-lite

@frondruntime/react depends on a runtime from @frondruntime/core. effect, mobx, and react are peer-level runtime contracts. Components that read observable node fields should use observer from mobx-react-lite.

Provider

import * as Frond from "@frondruntime/core";
import * as FrondReact from "@frondruntime/react";

const runtime = Frond.createRuntime();

export function App() {
  return (
    <FrondReact.FrondProvider runtime={runtime}>
      <Routes />
    </FrondReact.FrondProvider>
  );
}

Read A Node

import * as FrondReact from "@frondruntime/react";
import { observer } from "mobx-react-lite";

const ProfilePanel = observer(({ userId }: { userId: string }) => {
  const profile = FrondReact.useNode(ProfileNode, { userId });

  return <h1>{profile.displayName}</h1>;
});

useNode suspends while readiness is pending and throws readiness failures to the nearest error boundary. The render path only receives a ready authored node instance.

Read Without Suspense

const ProfileBadge = observer(({ userId }: { userId: string }) => {
  const read = FrondReact.useNodeRead(ProfileNode, { userId });

  switch (read._tag) {
    case "Ready":
      return <h1>{read.result.displayName}</h1>;
    case "Pending":
      return <Spinner />;
    case "Error":
      return <RetryBanner error={read.error} />;
    default:
      return null; // Unwired | Idle
  }
});

useNodeRead never throws to Suspense or an error boundary. It returns the runtime read as a tagged union - Unwired | Idle | Pending | Ready | Error - for components that must render every state inline instead of delegating to a boundary. On Ready, read.result is exactly the declared result type and read.node is the authored class instance. It still drives the same cold-start readiness boot and subscribes to changes, so the node makes progress exactly as it would under useNode/useNodeState.

Publish A Signal

usePublish binds a component to one signal channel, with the names and payloads that channel declares:

const publish = FrondReact.usePublish(Checkout);

<button type="button" onClick={() => void publish("checkout.started", { cartId, total })}>
  Check out
</button>;

The publisher is stable while the runtime and the channel are - a channel is normally a module constant - so it can be a dependency of other hooks. Publish resolves once every subscriber has run, and a subscriber that fails is reported as a runtime event rather than to the publisher, so void at the call site loses no handler failure.

One thing does reject, and void does not cover it: publishing to a stopped runtime fails with FrondRuntimeClosed. That window is reachable wherever a runtime is swapped under a live tree - an HMR reload or a test teardown through createRuntimeCoordinator - because this callback holds the outgoing runtime until React re-renders. Where that applies, end the call with .catch(() => {}) rather than void.

This is the publishing path for a channel published from many call sites, which is what makes the channel constant worth exporting. An app-wide domain-event channel is usually the other case: a single dispatch point, a per-session envelope, and a channel constant deliberately kept unexported, which usePublish cannot reach by construction. That shape is the dispatcher node. Channels, event maps, and what a subscriber sees are in @frondruntime/core.

Runtime Lifecycle Hooks

  • useNode - ready node or Suspense/error.
  • useNodeState - ready node plus operation state, result validity, and last operation failure.
  • useNodeRead - non-throwing tagged read for rendering every state inline.
  • useNodes - keyed map of ready nodes.
  • useNodeControls / useNodesControls - refresh, evict, and release without rendering the node.
  • usePublish - publish typed signals on one channel.
  • Preload - acquire nodes before rendering children.
  • getErrorReport / getErrorRecovery - project runtime read errors into UI error boundaries.

Testing

import * as FrondReactTest from "@frondruntime/react/testing";

The testing subpath exports TestFrondProvider for React tests that need an isolated runtime.

Migrating

Upgrading from 0.4.0? See the core package's MIGRATION-0.5.md for the error-report changes, including the deprecated projection fields.

Upgrading from 0.1.0? See the core package's MIGRATION-0.2.md - it covers the shared authoring changes and the React-facing type shifts.

Docs

AI use

Frond is AI-assisted (mainly Claude and Codex), iterated over months rather than one-shot generated. Full note: https://frondruntime.dev/ai-use

版本与发布记录

@frondruntime/react 共发布 8 个版本,首次发布于 2026/06/27;过去 12 个月发布了 8 个版本。

版本发布日期距今
0.5.0latest2026/10/2224 天前
0.4.02026/08/023 个月前
0.3.02026/07/283 个月前
0.2.02026/07/273 个月前
0.1.02026/07/164 个月前
0.0.32026/06/304 个月前

关于 @frondruntime/react 的常见问题

@frondruntime/react 是什么?

React adapter for the Effect-powered Frond runtime.

如何安装 @frondruntime/react?

在项目目录运行 npm install @frondruntime/react,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:mobx(>=6 <7)、react(>=18)、effect(^4.0.0)、mobx-react-lite(>=4 <5)、@frondruntime/core(0.5.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@frondruntime/react 支持 TypeScript 吗?

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

@frondruntime/react 支持 ESM 还是 CommonJS?

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

@frondruntime/react 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js ^20.19.0 || >=22.12.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@frondruntime/react 可以商用吗?

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

@frondruntime/react 的下载量有多少?

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

@frondruntime/react 还在维护吗?

最新版本 0.5.0 发布于 2026/10/22(24 天前);至今共发布 8 个版本,其中过去 12 个月发布了 8 个;首次发布于 2026/06/27。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。