Next.js App Router の RSC/サーバー fetch は instrumentation.ts で MSW setupServer を起動する
Next.js App Router でアプリ全体に MSW を効かせるとき、ブラウザの setupWorker(worker.start)は CSR の fetch しか傍受しない。Server Component やルートでのサーバー側 fetch(RSC)は、client から import する初期化関数(typeof window === 'undefined' で分岐する init 等)では確実に起動できず、実 API へ漏れる。理由は、その init が client コンポーネント経由でしか呼ばれず RSC のサーバー実行時には走らないため。
App Router で RSC を傍受するには instrumentation.ts の register() で setupServer を起動する。register は edge ランタイムでも実行されるため、NEXT_RUNTIME === 'nodejs' のときだけ server.listen() する。CSR は別途、クライアント初期化コンポーネントで worker.start() を起動し、ready まで描画をゲートして hydration 不整合を避ける。
認証ミドルウェア(middleware / proxy。edge ランタイム)は MSW の node 傍受が効かないため、モック時はミドルウェアでフラグ判定して認証チェックを素通しさせる方が、verify をモックするより単純で確実。
失敗時の症状: モックモードのはずなのに一部 fetch が実 API へ飛び、サーバー側で取得するデータだけ取得失敗する(クライアント側は mock が返る)。確認方法: サーバーログとブラウザコンソールの両方で fetch 先・ステータスを見て、サーバー fetch が setupServer を通っているか切り分ける。