Error occurred prerendering page の読み方
実際に出るエラー
ビルドのときにページを描いている途中で例外が起きると出る文言です。
読むのは次の行
実機で、ビルドのときに描くページの中で例外を投げると、出力はこう並びました。
Error occurred prerendering page "/about". Read more: https://nextjs.org/docs/messages/prerender-error
Error: cms-timeout ← 本当の原因
at c (app\about\page.tsx:1:31) ← どのファイルの何行目か
digest: '3666236157'
Export encountered an error on /about/page: /about, exiting the build.
- Build1行目: どのページで止まったか
Error occurred prerendering page のあとの "/about"。原因はここには無い。
- Build次の行: 本当の原因
この文言で検索する。
- Buildその下: ファイルと行
どこで起きたかが分かる。
1行目の文言だけで検索しても、原因は分かりません。ビルドのときにページを描く途中で、何かの例外が起きた、という意味しかないからです。
原因の文言ごとの直し方
実機で確かめた文言です。一緒に出た文言がこのどれかなら、それぞれの記事に直し方があります。
| 一緒に出る文言 | 原因 |
|---|---|
| ReferenceError: window is not defined | ブラウザにしかない値をサーバーで読んだ |
| ReferenceError: document is not defined | 同上 |
| ReferenceError: localStorage is not defined | 同上 |
| useSearchParams() should be wrapped in a suspense boundary | Suspense で囲んでいない |
| NextRouter was not mounted. | App Router で next/router を使った |
| used "updateTag …" during render | 描く途中で updateTag を呼んだ |
| 自分で throw した文言 | ページの中の読み込みが失敗した |
- window / document / localStorage:window・document is not defined の直し方
- useSearchParams:useSearchParams の suspense エラー
- NextRouter:NextRouter was not mounted の直し方
- updateTag:revalidateTag の第2引数と updateTag
自分の読み込みが失敗しているとき
Cookie もクエリ文字列も使っていないページは、ビルドのときに描かれます(キャッシュの解説)。中で呼んだデータの読み込みも、ビルドのときに動きます。
だから、ビルドのときにつながらない相手(止まっている外部のサービス、ビルドする場所から見えないデータベース)から読むページは、ビルドを止めます。
ビルドのときに描く
export default async function Page() { const body = await load() return <p>{body}</p> }
読み込みの失敗で、ビルドが止まる。
開かれたときに描く
import { connection } from 'next/server' export default async function Page() { await connection() const body = await load() return <p>{body}</p> }
ビルドは通る。失敗は開いたときに起き、error.tsx が受け止める。
実機で、await connection() を足すとビルドが通り、そのページは一覧で ƒ(開かれたときに描く)になりました。
ビルドする場所で確かめる
手元ではビルドが通るのに、CI や Docker の中でだけこのエラーになることがあります。考えられるのは、ビルドする場所から読み込み先に届かないときと、ビルドのときに環境変数が無いときです(環境変数はいつ読まれるのか)。
出典
このページの内容は上記の一次情報を基準に書いています。個人ブログや二次情報を根拠にしていません。