Next.jsと同じドメインで異なるフレームワークを使っているときの注意
パスベースのルーティングで、一部はNext.js、一部はVue、一部はRails…といった感じで異なるWebフレームワークが同じドメインの中で混在するときの注意点です。
Next.jsから、Next.jsじゃないページへのリンクには <Link>
を使わない
これだけです。
何が起こるのか?
next/link
が提供する <Link>
コンポーネントで、Next.jsじゃない例えばRailsのページへリンクを作ったとします。このリンクをクリックすると、Next.jsは fetch
で遷移先のコンテンツを取得しようとします。
しかし、遷移先のRailsページはAjax的に fetch
されたとしても単なるHTMLコンテンツを返すだけです(実装方法によってはエラー)。Next.jsではパフォーマンスのために遷移時にHTMLを部分的に書き換える挙動をします。いわゆるSoft Navigationと言われるもので、RailsだとTurboですし、SPA的な体験を得られます。
話を元に戻すと、Next.jsは fetch
で遷移先コンテンツを取得しますが、レスポンス内容からHTMLの書き換えはできないと判断し、通常のHard Navigationに切り替えます。
つまり、リンクをクリックすると 2回、遷移先にリクエストします。はっきり言って無駄なリクエストです。さらにHTMLだけでなくアセットのリクエストもするので余計に遅くなります。
対応方法
ということで、同じドメインの中で、遷移先がNext.jsじゃない場合は <Link>
ではなく <a>
を使うようにしましょう。
ちなみに、 <Link>
コンポーネントに限らず useRouter
の router.push()
の遷移も同様です。こちらは location.href
という古のやり方で遷移させると良いでしょう。
Discussion