💬

app directoryで「HTML」を忘れてもビルドが通るが動かないぞ(v13.1.6)

2023/02/15に公開約2,900字

Next.jsのapp directoryがどんどん更新され、v13.2ではSEO用にmetadataが設定可能になるなど、ワクワクなことが沢山だ!

しかし、まだまだエラーの対処法の情報が少ない。筆者は、ルートのHTMLタグを忘れるという根本的なミスを犯してしまったのに、ビルドが通ってしまい、原因にたどり着けず時間を浪費してしまった。

状況

  • Next.js v13.1.6

問題のファイルがこちら

app/layout.tsx (間違っているので真似するな)
import Footer from '@/components/Footer';
import Header from '@/components/Header';
import { ReactNode } from 'react';
import '@/styles/globals.css';

export default async function Layout({ children }: { children: ReactNode }) {
  return (
    <>
      <Header />
      <div className="container">{children}</div>
      <Footer />
    </>
  );
}

これは app/layout.tsx なので、何もしなければ全ページで使われるレイアウトである。

v13.1.6現在、ローカルでは表示できるし、ビルドも通ってしまう。だが、根本的に間違えている。

正解

app/layout.tsx
import Footer from '@/components/Footer';
import Header from '@/components/Header';
import { ReactNode } from 'react';
import '@/styles/globals.css';

export default async function Layout({ children }: { children: ReactNode }) {
  return (
+    <html lang="ja">
+      <body>
        <Header />
        <div className="container">{children}</div>
        <Footer />
+      </body>
+    </html>
  );
}

htmlbodyを忘れていた。

https://beta.nextjs.org/docs/routing/pages-and-layouts#root-layout-required

The root layout must define <html> and <body> tags since Next.js does not automatically create them.

ドキュメントには「必ず書くように」と書いてあるので、忘れていた俺が悪いのだが...

指摘と現状

https://github.com/vercel/next.js/issues/41896#issuecomment-1292643524

We could however provide a better warning for this type of error, so we are keeping this issue to track.

HTMLとBODYが無いですよというイシューが立っていて、「layout.tsxがそれらを返さないといけないんですよ」「でも、より良い警告が出せるだろうから」とオープンのままになっている。

エラーでググれるように経緯を書くぜ

もし英語のエラーでググってもこの記事がヒットするように、経緯を書こうと思う。

ビルド語のエラー

ビルド結果を動かすと、一切の描画に失敗する現象に遭遇した。エラー内容:

とにかくハイドレーションに失敗している。この手のエラーは主に以下の原因が多い。

  • HTML構造に誤りがある
  • サーバーとクライアントで齟齬が生じるロジックがある
    • もっぱらDateに関するミスが多い

開発用サーバーでのエラー

そういえば、表示できているからと、コンソールをしっかり読まずにビルドしていた。

ちゃんとローカルのコンソールを見ると、invariant expected app router to be mounted という警告が出ていた。

https://stackoverflow.com/a/74601107

このエラーで調べることで、ようやく htmlbodyを忘れている事に気づいたのだった。

Discussion

ログインするとコメントできます