@k8ordo/framework

トラブルシューティング

よくある症状の原因と直し方です。エラー文で探すときは、ページの中を検索してください。

このページの内容

this application wants mode: 'server'

原因

staticモードで、リクエストが要るものを使っています。エラーの1行目は拒んだものの種類を示し、その下の行がファイルを挙げます。

直し方

それが必要なら、framework()のmodeを'server'に変えます。paths、site、cspはstaticモードだけのオプションなので外します。CSPはguard.tsでnonce()を使ってヘッダーに書きます。型だけを使っているなら、import typeに書き換えます。staticモードのままで通ります。要らないなら、そのコードを消します。検索や絞り込みのようなGETのフォームなら、Server Actionは要りません。

static build needs pathnames for …

原因

staticモードで、パラメータを持つルートに当てはまるURLがpathsに1つもありません。ビルドはパラメータの値を自分では決められません。

直し方

framework()のpathsで、そのルートのURLを並べます。

the "paths" option supplied pathnames no route wants

原因

staticモードで、pathsが返したURLのどれかがどのルートにも当たりません。多くはURLの打ち間違いです。

直し方

エラーの後ろに並んだURLを直すか、pathsから外します。

the "paths" option supplied pathnames that still hold a parameter, …

原因

staticモードで、pathsが返したパスに:slugのようなパラメータが残っています。locales.pathsでロケールだけを展開したときによく起きます。パラメータを残したパスを受け取れるのは、横にfallback.tsxのあるページだけです。

直し方

残ったパラメータも、pathsの中で値に展開します。ビルドしていない値に答えたいページなら、横にfallback.tsxを置きます。route.tsとredirect.tsには置けません。

… shell locations whose parameter names are not their pattern's

原因

シェルの場所のパラメータの名前が、パターンと違います。/:locale/posts/:idに/en/posts/:slugを返すと、このエラーになります。

直し方

括弧の中のパターンと同じ名前で書きます。

static build needs shell locations for …

原因

fallback.tsxより上のレイアウトが受け取るパラメータを、シェルの場所が埋めていません。レイアウトはシェルでもHTMLとして書くので、その値が要ります。:localeを残した場所を返したときは、… leave out a parameter a layout above their fallback.tsx receivesのエラーになります。

直し方

/ja/posts/:idのように、レイアウトが受け取るパラメータを埋めた場所を返します。locales.pathsの結果を残せば、ロケールごとの場所になります。

… with a segment named !fallback

原因

!fallbackは、ビルドがシェルを書くディレクトリの名前です。pathsの返すパスには使えません。%21fallbackのようにエスケープしても同じです。

直し方

その値の名前を変えるか、pathsから外します。

the shell for … would also answer …

原因

シェルの書き換えのルールが、ルート表で先に試されるルートのURLにも当たります。ホスティングでは、そのURLにもシェルが返ってしまいます。

直し方

先のルートがページなら、そこにもfallback.tsxを置きます。重なるURLが1つだけなら、そのURLをpathsに並べます。どちらでもなければ、そのルートに当たらないシェルの場所を返します。

… shell locations a params schema refused

原因

シェルの場所に埋めた値を、レイアウトのparamsSchemaが拒みました。/fr/posts/:idのように、ロケールの集合に無い値でよく起きます。

直し方

その場所をpathsから外すか、値を直します。

the shell for … called notFound() while it rendered

原因

ビルドがシェルを描く間に、レイアウトかfallback.tsxのServer ComponentがnotFound()を呼びました。シェルには値が無いので、データにあるかどうかは決められません。

直し方

notFound()は、ブラウザで値を読むClient Componentから呼びます。

the shell for … was answered by …

原因

シェルのURL(/posts/!fallback)に、別のルートが答えました。!fallbackを値として受け取ったページか、ルート表で先に試される、同じ位置に別の名前のパラメータを持つfallback.tsxのページです。

直し方

そのルートに当たらないシェルの場所を返します。

static build could not render …

原因

staticモードのビルドで、そのページの描画中にServer Componentがエラーになりました。上にSuspenseの境界が無いClient Componentがエラーになったときも、同じエラー文が出ます。

直し方

元のエラーは、このエラー文より上にページのURLと一緒に出力されています。それを手がかりに直します。

vite devでだけ表示できるページ

原因

staticモードでも、vite devはファイルを書かずにリクエストのたびにページを描画します。pathsに無い値も、fallback.tsxが無ければページで描画します。Server Componentがエラーになっても、500を返して動き続けます。

直し方

公開する前にvite buildを通し、エラーが出たらその文に従って直します。書き出したサイトはvite previewで確かめます。ホスティングと同じように、dist/client/のファイルだけを返します。

200で返る404.html

原因

staticモードでは、404.htmlに付くステータスをホスティングが決めます。ビルドが書けるのはページまでで、応答のステータスは書けません。

直し方

ホスティングの設定で、存在しないURLに404.htmlを404のステータスで返すようにします。

GitHub Pagesで404になるビルドしていない値

原因

GitHub Pagesには書き換えのルールがありません。_redirectsを読まないので、ファイルの無いURLには404.htmlを返します。

直し方

書き換えのできるホスティングに移すか、値をすべてpathsに並べます。

Cloudflareで書き出したページにシェルが返る

原因

Cloudflareが読む_redirectsのルールは、固定のURLが2,000個までです。超えた分は読まれず、書き出したページにもシェルのルールが当たります。ビルドは_redirects has … rules Cloudflare counts as staticの警告を出します。パラメータを含むルールは100個までで、超えると… counts as dynamicの警告になります。

直し方

シェルのあるパターンの下で書き出す値を減らし、残りはシェルに任せます。ファイルを先に返すNetlifyでは、書き出したページにシェルが返ることはありません。

Cloudflareでリダイレクトがループする

原因

Workersの静的アセットで、html_handlingがdrop-trailing-slashになっています。シェルのルールはスラッシュで終わるURLへ書き換えるので、スラッシュを外すリダイレクトとの間でループします。noneでは、シェルが404になります。

直し方

html_handlingを既定のauto-trailing-slashかforce-trailing-slashにします。

_redirects cannot list …

原因

書き出した値に、:bのような:と英字の並びか*が入っています。ホスティングはそれをパラメータとして読むので、そのURLにファイルを返すルールを書けません。Cloudflareでは、そのURLにシェルが返ります。

直し方

URLに:や*が入らない値にします。

public/_redirects line … before its shell's rule

原因

public/_redirectsのルールが、シェルのルールより先にシェルの場所に当たります。/* /index.html 200のようなルールです。

直し方

そのルールを外すか、シェルの場所に当たらないように狭めます。

this build runs on Vercel, which does not read _redirects

原因

Vercelの上のビルドがシェルを書きましたが、vercel()がありません。Vercelは_redirectsを読まないので、どのURLにもシェルは返りません。

直し方

@k8ordo/framework/vercelのvercel()をframework()の隣に足します。

… has "!fallback" in its HTML

原因

レイアウトは、pathnameとしてシェルのURL(/posts/!fallback)を受け取ります。それをリンクやcanonicalに書くと、訪問者のURLと違うものがHTMLに残ります。

直し方

URLから作るものは、ブラウザでusePathname()を読むClient Componentで描きます。

the "csp" option cannot go into a page's <meta> as it is

原因

staticモードのcspオプションに、<meta>では効かないディレクティブか'strict-dynamic'などが入っています。<meta>で効かないのはframe-ancestors、report-uri、sandboxの3つです。1つのエントリに複数のソースを空白区切りで書いた場合も、同じエラーになります。

直し方

<meta>で効かないディレクティブは、ホスティングのヘッダーで設定します。'strict-dynamic'は外します。フレームワークのモジュールのスクリプトは、'self'で許可されます。ソースは1つずつ配列の要素にします。

403になるServer Actionの送信

原因

serverモードで、ハンドラが受け付けるPOSTは、OriginヘッダーのホストがリクエストのURLのホストと一致するものだけです。前に置いたプロキシがHostを書き換えていると、この2つが一致しません。

直し方

プロキシで、元のHostをそのまま渡します。ハンドラを自分で呼ぶ場合は、訪問者がアクセスしたURLでRequestを作ります。

redirect()のあとも移らないページ

原因

serverモードで、redirect()は例外を使って処理を終えます。tryの中で呼ぶと、catchがその例外を受け取ります。

直し方

redirect()はtryの外で呼びます。

… belongs to what answers the request, and a page is a render

原因

serverモードで、ページの描画の中からcookies()やresponseHeaders()、requestHeaders()を呼んでいます。これらはリクエストに応答する処理のためのAPIで、ページの描画からは呼べません。

直し方

リクエストのヘッダーやCookieを読むなら、ページが受け取るrequestを使います。書くなら、guard.tsかServer Actionに移します。

internal errorとだけ表示されるページ

原因

serverモードで、ハンドラが応答を作れず、serve()が500を返しています。上にSuspenseの境界が無い場所でServer Componentがエラーになると、こうなります。

直し方

エラーの内容は、サーバーのログにk8ordo: GET /products/1 failedのような行で出ています。訪問者に自前のエラー画面を見せるなら、error.tsxを置きます。

原因

serverモードのcookies().set()では、secureの既定がtrueです。ブラウザは、HTTPSでないHTTPで受け取ったSecureのCookieを保存しません。既定がfalseになるのは、HTTPでlocalhostか127.0.0.1、[::1]に来たリクエストだけです。

直し方

本番はHTTPSで配信します。それ以外の場所をHTTPで動かすなら、setにsecure: falseを渡します。

a cookie with sameSite "none" has to be secure

原因

serverモードで、sameSite: 'none'のCookieにsecure: falseを渡しています。ブラウザはSecureの無いSameSite=Noneを捨てるので、cookies().set()がその場でエラーにします。

直し方

sameSite: 'none'のCookieはsecureのままにして、HTTPSで配信します。

本番でだけ出るハイドレーションのエラー

原因

ルートレイアウトが描画した文書は、まるごとハイドレーションの対象です。CDNの機能でHTMLが書き換えられると、Reactが描画する内容とHTMLが食い違います。Webフォントの埋め込み、メールアドレスの難読化、スクリプトの遅延読み込みがその例です。

直し方

CDNのその機能を切ります。フォントやスクリプトをサイトと同じオリジンから配信すると、CDNが書き換えるものが無くなります。

型の付かないhref()とparams

原因

tsconfig.jsonのincludeに.k8ordo/が含まれていません。.k8ordoはドットで始まるので、".k8ordo"とディレクトリ名だけを書いても読み込まれません。型はclone直後と同じになります。

直し方

includeに.k8ordo/**/*.tsのようにグロブで書きます。

clone直後のPagePropsの型

原因

.k8ordo/は生成物でgitに入らないので、cloneした直後にはまだありません。ルート表が無いあいだ、PagePropsのparamsは文字列の型になります。mode: 'server'ではrequestとsearchも型から消え、Property 'request' does not existのエラーになります。

直し方

tscの前にvite devかvite buildを一度実行して、.k8ordo/を生成します。

routes/ holds only page.tsx, …

原因

routes/の中に、page.tsxやlayout.tsxのようなルートのファイルでないものがあります。拡張子だけが違うpage.tsや、_parts/のように_で始まるディレクトリの中のファイルも同じです。そのディレクトリにページが無ければ、declares no routeのエラーも出ます。

直し方

部品はsrc/components/へ、それ以外のモジュールはsrc/lib/へ移し、importを書き換えます。ページなら拡張子を.tsxにします。

fallback.tsxの置き場所のエラー

原因

fallback.tsxは、パラメータを持つpage.tsxの横に置くファイルです。そうでない場所にあると、routes/<path>: fallback.tsx …の行がエラーに並びます。どちらのモードでも同じです。

直し方

横にpage.tsxが無いなら、ページのディレクトリへ移します。横のlayout.tsxは、1つ上のディレクトリへ移すか、中身をpage.tsxとfallback.tsxに入れます。パラメータの無いページのfallback.tsxは消します。上のレイアウトがすべてのパラメータを受け取るときも、fallback.tsxを消して値をpathsに並べます。

a params schema must validate synchronously

原因

paramsSchemaが非同期に検証しています。URLに当たるルートは描画の前に決まるので、スキーマの結果を待てません。

直し方

スキーマには値の形の検証だけを書きます。データがあるかどうかはページで確かめ、無ければnotFound()を呼びます。

'server-only' cannot be imported in client build

原因

server-onlyをimportしたモジュールが、Client Componentから読まれています。エラーの2行目から下が、そこに至ったimportの連鎖です。

直し方

Client Componentからは直接importせず、Server Componentで読んだ値をpropsで渡します。

Functions cannot be passed directly to Client Components

原因

Server ComponentからClient Componentへ、関数をpropsで渡しています。propsはシリアライズして送るので、関数は渡せません。

直し方

関数を呼んだ結果の値を渡すか、関数をClient Componentの側へ移します。

useRoute must render inside a matched <Router>

原因

@k8ordo/routerからuseRoute()かuseParams()をimportしています。このフレームワークではブラウザがルート表を持たないので、2つのフックには読むルートがありません。

直し方

ページが受け取ったparamsを、propsでClient Componentに渡します。Client Componentの中では、useMatch()にパターンを渡しても読めます。

k8ordo

Baselineに入った機能を、制限なく使うReactのライブラリ群。

© 2026 k8o — MIT License

組版:Noto Sans JP / M PLUS 2