当ホームぺージを移行したところ react-transition-group が動かなくなりました...
動作確認環境
Next.js 15.0.1 (App router)
Next.js 15 系が 10月21日 にリリースされたので、このホームページを Next.js 14 から移行してみました
噂には聞いていましたが、今回もまあまあ破壊的変更が入っているようで、移行しても簡単には動かないかもです 🙄
修正が必要になったり問題になった点をまとめておこうと思います
公式では以下のような案内があったので、それに従ってアップグレードしました
npx @next/codemod@canary upgrade latestyarn の場合は、こんな感じかなと思います
yarn dlx @next/codemod@canary upgrade latest今回の移行で一番困ったのはこれです
このサイトでは CSSTransition を多用してアニメーションを付与していますが、以下のようなエラーになりました
Unhandled Runtime ErrorTypeError: react_dom__WEBPACK_IMPORTED_MODULE_3__.findDOMNode is not a functionCall StackTransition.performEnternode_modules/react-transition-group/esm/Transition.js (254:61)...
どうやら Transition の実装内の ReactDOM.findDOMNode(this) という実装が悪さをしているようでした
ひとまず CSSTransition を自力で再実装して解決することにしました 💪 パワー
一応公開します。気が向いたら npm とかにしてみようかな...
以下、実装です。クリックで開きます 💡
cssTransition.tsx
Transition の実装はないのと、モジュールの組み合わせによってはエラーが出るかもですので、参考程度にお願いします
それと突貫なので汚いです。あと型がガバガバです... orz
React 19 RC にも起因していそうな気もしますし、今後の動向も見守る必要がありそうです
そもそも2022年から更新されていないことも考えると、選定を見直した方が良いかもですね
Next.js では、サーバサイドでリクエストのヘッダーやクッキーを取得することができます
今回のアップデートで、非同期関数へ移行されたため await が必要になりました
import { NextRequest, NextResponse } from 'next/server'import { headers } from 'next/headers'export const runtime = 'edge'export async function GET(_: NextRequest) {const header = await headers()const host = header.get('host')return NextResponse.json({ HostName: host }, { status: 200 })}
ちょこちょこでしたが、変えるの大変でした...
それと export const fetchCache = 'force-cache' の記述を、一番上の layout.tsx に書いたところ、ヘッダやクッキーが取得できなくなりました
原因は不明ですが、取得できなくなったら気をつけてみてください
Cloudflare にデプロイする場合
移行にあたって、静的なデータを返す (結果がヘッダやクエリパラメータに依らない) 場合でも、これまで不要だった runtime = 'edge' の指定が必要になってました
Next.js 15 からキャッシュのデフォルト値が変更されたことに関係していたりするのでしょうかね...
もしかしたら設定で回避できるかもです
ビルドしようとしたところ、クライアント側のコンポーネントで navigator を取得する部分でエラーになりました
'use client'export const Component = () => {const userAgent = navigator.userAgentreturn <div>{userAgent}</div>}
サーバ上で解析が走るのか navigator が存在しないと怒られてしまいます
面倒ですが、静的解析時に navigator が検知されないよう回避が必要のようです (もっと良い方法があるかも)
'use client'import { useEffect, useState } from 'react'export const Component = () => {const [userAgent, setUserAgent] = useState<string>('')useEffect(() => {setUserAgent(navigator.userAgent)}, [])return <div>{userAgent}</div>}
以上になります
ひとまずこれで Next.js 15 への移行が終わったので、しばらく様子見してみます 🎉
おわりに
初のメジャーアップデート対応で、いろいろ疲れました... 🐶