[Next.js13] appディレクトリモードでlayout.tsxにLinkタグを書いて継承するとページロード中の操作でUnhandled Runtime Errorが出る。

Next.jsでいやーな画面がでました。

普通ならエラーからHTML構造のマークアップのミスを疑うのですが、本件はこれで解決できませんでした。
おそらくNext.js13のバグだと思われます。=> Githubでバグ報告しました。

/appはまだbetaだから

appディレクトリは13の目玉機能ですが、ver13.3.2現在まだまだbetaです。

しかし、今後appがデフォルトになることを考えれば、今のうちに予行練習くらいはしておきたいもの。

さっそく試験的に導入してみたところ、特定の条件で、ページロード中にクリック連打などのイベントでエラーが発生することがわかりました。筆者のNext.js歴は浅く、何かの間違いかもしれないと思いつつも、念の為?Githubでバグ報告することにしました。

エラー
コンソールはこんな感じ

Unhandled Runtime Error

Error: Hydration failed because the initial UI does not match what was rendered on the server.

サーバとそっちでレンダリングしたhtmlがちゃうから流し込みでけへんでで。というエラー。

発生状況

  • Next.13をインストール
  • AppDirを有効化
  • layout.tsxにLinkタグを書く。あるいはLinkが含まれるコンポーネントをインポートして呼び出す
  • page.tsxで表示する
  • ロード中にキー操作やクリックイベントを発生させる(連打)
  • エラー表示

SSGページだとロードが早すぎて発生しませんが、SSRやdevモードだとロード中の操作で発生します。

エラー発生の環境

  • Docker
  • Next.js13.0.2(tailwind.css, typeScript)

next.config.js

/** @type {import('next').NextConfig} */
const nextConfig = {
    reactStrictMode: true,
    swcMinify: true,
    experimental: {
      appDir: true,
    },
}

module.exports = nextConfig

layout.tsx

import "../styles/globals.css";
import "tailwindcss/tailwind.css";
import Link from "next/link";

export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <>
      <html lang="ja" className="scroll-smooth">
        <body>
          <Link href="/">sample</Link>
          {children}
        </body>
      </html>
    </>
  );
}

page.tsx

import Link from "next/link";

export default function Home() {
  return (
    <>
      <h1>test</h1>
    </>
  );
}

公開日