Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

example/: kitchen-sink demo cannot be installed, and its Suspense path cannot run

オープン
#784 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
55/100
issue の種類
バグ
明瞭さ
おおむね明確
活発さ
静か
技術スタック
react, typescript

調査の方向性

example/package.json とその lockfile から始め、次に example/index.tsx:45 と example/withSuspense/Firestore.tsx:2,87 を調べます。まず example/ でクリーンインストールを行い、デモで workspace、生成した tarball、公開済みのバージョンのどれを使うべきか判断します。依存関係がインストールされ、Suspense パスが説明されている React 17/18 の失敗なしにビルドおよび実行できれば完了です。

索引モデルが issue の本文から書いたものです。

説明

Two pre-existing defects in example/, both surfaced by @armando-navarro while reviewing #781 and both verified against main. Neither was caused by that PR and neither was fixed by it, so they are filed here rather than left in a review thread on a merged PR.

They are filed together because the fix for the second requires the first: there is no way to check that the Suspense path runs without being able to install the demo.

1. The demo cannot be installed as checked out

example/package.json depends on:

"reactfire": "file:../reactfire-4.0.1.tgz"

That tarball is not in the repository, so npm install inside example/ fails from a clean checkout. Whatever produced it was never committed and no script regenerates it.

Worth deciding rather than patching blindly: the fix could be a file:.. reference to the workspace, a documented npm pack step, or a published version range. They differ in whether the demo is meant to exercise the local working tree or the last release.

2. The Suspense path cannot run, on either the old instructions or the new ones

example/index.tsx ships a commented-out Suspense variant. #781 corrected the comment to say the path does not run as checked in, which is accurate, but the underlying reason is worth recording.

example/package.json pins the runtime to React 17 while the types are already on 18:

"react": "^17.0.0",
"react-dom": "^17.0.0",
"@types/react": "^18.0.15",
"@types/react-dom": "^18.0.6",
"typescript": "^4.7.4"

That skew produces two distinct failures.

  • example/index.tsx:45, the commented ReactDOM.createRoot(rootElement). On react-dom 17 this is undefined at runtime, and under @types/react-dom@18 it is also a type error, because createRoot is declared in client.d.ts and not on the root entry. The example's build is tsc && vite build, so uncommenting it breaks the build as well as the app.
  • example/withSuspense/Firestore.tsx:2, which imports useTransition (used at :87). This one type-checks cleanly because @types/react is already 18, and fails only at runtime on React 17. It is the more dangerous of the two for exactly that reason.

Those are the only React 18 APIs anywhere under example/, which bounds the work:

example/index.tsx:45:                    // ReactDOM.createRoot(rootElement).render(
example/withSuspense/Firestore.tsx:2:    import { useState, useTransition } from 'react';
example/withSuspense/Firestore.tsx:87:   const [isPending, startTransition] = useTransition();

The instructions that #781 replaced did not work either. Verified on react@experimental: createRoot, unstable_createRoot and render are all undefined on the root react-dom entry. So this is long-standing, and #781 regressed nothing.

What the fix involves

  1. Bump react and react-dom to 18 in example/package.json, and the lockfile.
  2. Import createRoot from react-dom/client, not the root entry. It is not on the root entry under @types/react-dom@18 either, so the currently commented specifier would still be wrong after the bump.
  3. Word the comment as replacing the existing ReactDOM.render call, not uncommenting alongside it. Leaving both produces React 18's You are calling ReactDOMClient.createRoot() on a container that was previously passed to ReactDOM.render() warning.
  4. Rename ConcurrentModeApp / NonConcurrentModeApp. "Concurrent mode" has not been the name for this since React 18 shipped, and #781 removed that framing from the surrounding prose but deliberately left the identifiers, since renaming them is not a comments-only change.

#781 also deliberately left the commented ReactDOM.createRoot specifier uncorrected. Fixing it in isolation would make the block look runnable, which is the opposite of what the caveat it sits under is for. It should be corrected as part of the bump, not before.

Not a ReactFire bug

Worth stating explicitly so this is not mistaken for a library problem: ReactFire itself works fine on React 17. @armando-navarro ran useObservable with suspense: true under the legacy render path and it suspends, resolves and keeps updating. The React 18 requirement belongs to the demo, not to the library.

Refs #781.

主要言語
TypeScript
スター
3.6k
フォーク
403
平均マージ
5日 1時間
マージ済み PR(30日)
10

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

FirebaseExtended/reactfire のほかの issue

FirebaseExtended/reactfire の issue をすべて見る

似ている issue

TypeScript の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。