コンテンツにスキップ
ブログに戻る

2024年10月21日月曜日

Next.js 15

投稿者

Next.js 15は正式に安定版となり、本番環境に対応しました。このリリースは、RC1RC2の両方からのアップデートに基づいて構築されています。私たちは安定性に重点を置きながら、皆様に気に入っていただけるような刺激的なアップデートを追加しました。今すぐNext.js 15をお試しください。

ターミナル
# Use the new automated upgrade CLI
npx @next/codemod@canary upgrade latest
 
# ...or upgrade manually
npm install next@latest react@rc react-dom@rc

また、今週木曜日、10月24日に開催されるNext.js Confで、今後の予定についてさらに詳しくお知らせできることを嬉しく思います。

Next.js 15の新機能は以下の通りです

@next/codemod CLIによるスムーズなアップグレード

Next.jsのメジャーリリースごとに、破壊的変更のアップグレードを自動化するためにコードモッド(自動コード変換)が含まれています。

アップグレードをさらにスムーズにするために、強化されたコードモッドCLIをリリースしました

ターミナル
npx @next/codemod@canary upgrade latest

このツールは、コードベースを最新の安定版またはプレリリース版にアップグレードするのに役立ちます。CLIは依存関係を更新し、利用可能なコードモッドを表示し、それらを適用する手順をガイドします。

canaryタグは最新のコードモッドバージョンを使用し、latestはNext.jsのバージョンを指定します。皆様からのフィードバックに基づいてツールの改善を継続的に追加する予定であるため、最新のNext.jsバージョンにアップグレードする場合でも、canaryバージョンのコードモッドを使用することをお勧めします。

Next.js codemod CLIについて詳しくはこちらをご覧ください。

非同期リクエストAPI(破壊的変更)

従来のサーバーサイドレンダリングでは、サーバーはコンテンツをレンダリングする前にリクエストを待機していました。しかし、すべてのコンポーネントがリクエスト固有のデータに依存するわけではないため、レンダリングのためにリクエストを待つ必要はありません。理想的には、サーバーはリクエストが到着する前にできるだけ多くを準備するべきです。これを可能にし、将来の最適化の準備をするために、いつリクエストを待つべきかを知る必要があります。

そのため、headerscookiesparamssearchParamsなどのリクエスト固有のデータに依存するAPIは非同期に移行しています。

import { cookies } from 'next/headers';
 
export async function AdminPanel() {
  const cookieStore = await cookies();
  const token = cookieStore.get('token');
 
  // ...
}

これは破壊的変更であり、以下のAPIに影響します

  • クッキー
  • ヘッダー
  • ドラフトモード
  • layout.jspage.jsroute.jsdefault.jsgenerateMetadatagenerateViewportparams
  • page.jssearchParams

移行を容易にするため、これらのAPIは一時的に同期的にアクセスできますが、次のメジャーバージョンまでは開発環境と本番環境で警告が表示されます。移行を自動化するためのコードモッドが利用可能です。

ターミナル
npx @next/codemod@canary next-async-request-api .

コードモッドでコードを完全に移行できない場合は、アップグレードガイドをお読みください。また、Next.jsアプリケーションを新しいAPIに移行する方法のも提供しています。

キャッシュセマンティクス

Next.js App Routerは、意見を取り入れたキャッシュのデフォルト設定でリリースされました。これらは、必要な場合にオプトアウトできる、デフォルトで最もパフォーマンスの高いオプションを提供するように設計されました。

皆様からのフィードバックに基づいて、私たちはキャッシュのヒューリスティックと、それがPartial Prerendering (PPR)やfetchを使用するサードパーティライブラリとどのように相互作用するかを再評価しました。

Next.js 15では、GETルートハンドラとクライアントルーターキャッシュのデフォルトのキャッシュ設定を、デフォルトでキャッシュからデフォルトでキャッシュなしに変更しています。以前の動作を維持したい場合は、引き続きキャッシュをオプトインできます。

今後数ヶ月でNext.jsのキャッシュを改善し続けており、近日中に詳細をお知らせします。

GETルートハンドラはデフォルトでキャッシュされなくなりました

Next 14では、GET HTTPメソッドを使用するルートハンドラは、動的関数や動的設定オプションを使用しない限り、デフォルトでキャッシュされていました。Next.js 15では、GET関数はデフォルトではキャッシュされません

export dynamic = 'force-static'などの静的ルート設定オプションを使用することで、引き続きキャッシュをオプトインできます。

sitemap.tsopengraph-image.tsxicon.tsxなどの特殊なルートハンドラ、およびその他のメタデータファイルは、動的関数や動的設定オプションを使用しない限り、デフォルトで静的のままです。

クライアントルーターキャッシュは、デフォルトでページコンポーネントをキャッシュしなくなりました

Next.js 14.2.0では、staleTimesという実験的なフラグを導入し、ルーターキャッシュのカスタム設定を可能にしました。

Next.js 15では、このフラグは引き続きアクセス可能ですが、デフォルトの動作を変更し、ページセグメントのstaleTime0に設定しています。これは、アプリ内を移動する際に、クライアントがナビゲーションの一部としてアクティブになるページコンポーネントの最新データを常に反映することを意味します。ただし、重要な動作は変更されていません。

  • 共有レイアウトデータは、部分レンダリングをサポートし続けるため、サーバーから再フェッチされません。
  • 戻る/進むナビゲーションは、ブラウザがスクロール位置を復元できるように、キャッシュから復元されます。
  • loading.jsは5分間(またはstaleTimes.static設定の値)キャッシュされたままになります。

以下の設定を行うことで、以前のクライアントルーターキャッシュの動作をオプトインできます。

next.config.ts
const nextConfig = {
  experimental: {
    staleTimes: {
      dynamic: 30,
    },
  },
};
 
export default nextConfig;

React 19

Next.js 15のリリースの一環として、私たちは今後のReact 19のリリースに合わせることを決定しました。

バージョン15では、App RouterはReact 19 RCを使用し、コミュニティからのフィードバックに基づいて、Pages RouterでReact 18との下位互換性も導入しました。Pages Routerを使用している場合でも、準備ができたときにReact 19にアップグレードできます。

React 19はまだRCフェーズですが、実際のアプリケーションでの広範なテストとReactチームとの緊密な連携により、その安定性に自信を持っています。コアとなる破壊的変更は十分にテストされており、既存のApp Routerユーザーには影響しません。そのため、Next.js 15を安定版として今すぐリリースし、皆様のプロジェクトがReact 19 GAに完全に備えられるようにすることにしました。

移行をできるだけスムーズにするために、移行プロセスを簡素化するコードモッドと自動ツールを提供しています。

Next.js 15アップグレードガイドReact 19アップグレードガイドを読み、React Conf Keynoteを見て詳細を学んでください。

React 18上のPages Router

Next.js 15は、Pages RouterとReact 18の互換性を維持しており、ユーザーはNext.js 15の改善点を享受しながらReact 18を使い続けることができます。

最初のリリース候補(RC1)以降、コミュニティからのフィードバックに基づいてReact 18のサポートを含めることに焦点を移しました。この柔軟性により、Pages RouterとReact 18を使用しながらNext.js 15を採用でき、アップグレードパスをより細かく制御できます。

注: 同じアプリケーションでPages RouterをReact 18で、App RouterをReact 19で実行することは可能ですが、この設定は推奨しません。そうすると、基盤となるAPIとレンダリングロジックが2つのバージョン間で完全に整合しない可能性があるため、予測不能な動作と型の一貫性の問題が生じる可能性があります。

Reactコンパイラ(実験的)

Reactコンパイラは、MetaのReactチームが作成した新しい実験的コンパイラです。このコンパイラは、プレーンなJavaScriptセマンティクスとReactのルールを理解することで、コードを深いレベルで理解し、コードに自動最適化を追加することを可能にします。このコンパイラは、開発者がuseMemouseCallbackなどのAPIを通じて手動で行うメモ化の量を減らし、コードをよりシンプルに、保守しやすく、エラーを起こしにくくします。

Next.js 15では、Reactコンパイラのサポートを追加しました。Reactコンパイラと、利用可能なNext.jsの設定オプションについて詳しくはこちらをご覧ください。

注: Reactコンパイラは現在Babelプラグインとしてのみ利用可能であり、開発時間とビルド時間が遅くなります。

ハイドレーションエラーの改善

Next.js 14.1は、エラーメッセージとハイドレーションエラーを改善しました。Next.js 15は、さらに改善されたハイドレーションエラービューを追加することで、これらをさらに発展させています。ハイドレーションエラーは、エラーのソースコードと、問題に対処するための提案を表示するようになりました。

例えば、これはNext.js 14.1での以前のハイドレーションエラーメッセージです

Hydration error message in Next.js 14.1

Next.js 15では、これが次のように改善されました。

Hydration error message improved in Next.js 15

Turbopack Dev

next dev --turbo安定版となり、開発体験を高速化する準備が整いましたことを発表できることを嬉しく思います。私たちはこれをvercel.comnextjs.orgv0、およびその他すべてのアプリケーションで、素晴らしい結果を得ながら反復開発に活用してきました。

たとえば、大規模なNext.jsアプリであるvercel.comでは、以下のような結果が得られました。

  • ローカルサーバーの起動が最大76.7%高速化
  • Fast Refreshによるコード更新が最大96.3%高速化
  • キャッシュなしの初期ルートコンパイルが最大45.8%高速化(Turbopackにはまだディスクキャッシュがありません)。

Turbopack Devについて詳しくは、新しいブログ記事をご覧ください。

静的ルートインジケータ

Next.jsは開発中に静的ルートインジケータを表示し、どのルートが静的であるか動的であるかを識別するのに役立ちます。この視覚的な合図により、ページのレンダリング方法を理解することでパフォーマンスを簡単に最適化できます。

next buildの出力を使用して、すべてのルートのレンダリング戦略を確認することもできます。

このアップデートは、Next.jsの可観測性を向上させ、開発者がアプリケーションを監視、デバッグ、最適化しやすくするための継続的な取り組みの一環です。また、専用の開発者ツールも開発中であり、詳細については近日中にお知らせします。

無効にできる静的ルートインジケータについて詳しくはこちらをご覧ください。

unstable_afterによるレスポンス後のコード実行(実験的)

ユーザーリクエストを処理する際、サーバーは通常、レスポンスの計算に直接関連するタスクを実行します。ただし、ロギング、分析、その他の外部システムとの同期などのタスクを実行する必要がある場合があります。

これらのタスクはレスポンスに直接関連しないため、ユーザーがそれらの完了を待つ必要はありません。ユーザーへのレスポンス後に作業を延期することは、サーバーレス関数がレスポンスが閉じられるとすぐに計算を停止するため、課題となります。

after()は、レスポンスのストリーミングが終了した後に処理される作業をスケジュールできるようにすることで、この問題を解決する新しい実験的APIです。これにより、セカンダリタスクをプライマリレスポンスをブロックせずに実行できます。

使用するには、next.config.jsexperimental.afterを追加します。

next.config.ts
const nextConfig = {
  experimental: {
    after: true,
  },
};
 
export default nextConfig;

次に、Server Components、Server Actions、Route Handlers、またはMiddlewareで関数をインポートします。

import { unstable_after as after } from 'next/server';
import { log } from '@/app/utils';
 
export default function Layout({ children }) {
  // Secondary task
  after(() => {
    log();
  });
 
  // Primary task
  return <>{children}</>;
}

unstable_afterについて詳しくはこちらをご覧ください。

instrumentation.js(安定版)

register() APIを持つinstrumentationファイルは、ユーザーがNext.jsサーバーのライフサイクルにアクセスして、パフォーマンスを監視し、エラーの原因を追跡し、OpenTelemetryのような可観測性ライブラリと深く統合することを可能にします。

この機能は安定版となり、experimental.instrumentationHook設定オプションは削除できます。

さらに、私たちはSentryと協力して、すべてのサーバーでスローされたエラーに関する重要なコンテキストをキャプチャするために使用できる新しいonRequestErrorフックを設計しました。

  • サーバーでスローされたすべてのエラーに関する重要なコンテキストをキャプチャします。これには以下が含まれます。
    • ルーター:Pages RouterまたはApp Router
    • サーバーコンテキスト:Server Component、Server Action、Route Handler、またはMiddleware
  • エラーを好みのオブザーバビリティプロバイダーに報告します。
export async function onRequestError(err, request, context) {
  await fetch('https://...', {
    method: 'POST',
    body: JSON.stringify({ message: err.message, request, context }),
    headers: { 'Content-Type': 'application/json' },
  });
}
 
export async function register() {
  // init your favorite observability provider SDK
}

onRequestError関数について詳しくはこちらをご覧ください。

<Form>コンポーネント

新しい<Form>コンポーネントは、プリフェッチクライアントサイドナビゲーション、およびプログレッシブエンハンスメントにより、HTML <form>要素を拡張します。

これは、検索フォームが結果ページに移動するような、新しいページに移動するフォームに役立ちます。

app/page.jsx
import Form from 'next/form';
 
export default function Page() {
  return (
    <Form action="/search">
      <input name="query" />
      <button type="submit">Submit</button>
    </Form>
  );
}

<Form>コンポーネントには以下が含まれます。

  • プリフェッチ:フォームがビュー内にある場合、レイアウトローディングUIがプリフェッチされ、ナビゲーションが高速化されます。
  • クライアントサイドナビゲーション: 送信時に、共有レイアウトとクライアントサイドの状態が保持されます。
  • プログレッシブエンハンスメント:JavaScriptがまだロードされていない場合でも、フォームはフルページナビゲーションで動作します。

以前は、これらの機能を実現するには多くの手動のボイラープレートが必要でした。例えば

// Note: This is abbreviated for demonstration purposes.
// Not recommended for use in production code.
 
'use client'
 
import { useEffect } from 'react'
import { useRouter } from 'next/navigation'
 
export default function Form(props) {
  const action = props.action
  const router = useRouter()
 
  useEffect(() => {
    // if form target is a URL, prefetch it
    if (typeof action === 'string') {
      router.prefetch(action)
    }
  }, [action, router])
 
  function onSubmit(event) {
    event.preventDefault()
 
    // grab all of the form fields and trigger a `router.push` with the data URL encoded
    const formData = new FormData(event.currentTarget)
    const data = new URLSearchParams()
 
    for (const [name, value] of formData) {
      data.append(name, value as string)
    }
 
    router.push(`${action}?${data.toString()}`)
  }
 
  if (typeof action === 'string') {
    return <form onSubmit={onSubmit} {...props} />
  }
 
  return <form {...props} />
}

<Form>コンポーネントについて詳しくはこちらをご覧ください。

next.config.tsのサポート

Next.jsはTypeScriptのnext.config.tsファイルタイプをサポートし、自動補完とタイプセーフなオプションのためにNextConfigタイプを提供しています。

next.config.ts
import type { NextConfig } from 'next';
 
const nextConfig: NextConfig = {
  /* config options here */
};
 
export default nextConfig;

Next.jsのTypeScriptサポートについて詳しくはこちらをご覧ください。

セルフホスティングの改善点

アプリケーションをセルフホストする際、Cache-Controlディレクティブをより詳細に制御する必要がある場合があります。

一般的なケースの1つは、ISRページに送信されるstale-while-revalidate期間の制御です。2つの改善を実施しました。

  1. next.configexpireTimeの値を設定できるようになりました。これは以前、experimental.swrDeltaオプションでした。
  2. デフォルト値を1年に更新し、ほとんどのCDNがstale-while-revalidateセマンティクスを意図どおりに完全に適用できるようにしました。

また、カスタムのCache-Control値をデフォルト値で上書きすることもなくなりました。これにより、完全に制御でき、あらゆるCDN設定との互換性が保証されます。

最後に、セルフホスティング時の画像最適化を改善しました。以前は、Next.jsサーバーで画像を最適化するためにsharpをインストールすることをお勧めしていましたが、この推奨事項が見落とされることがありました。Next.js 15では、sharpを手動でインストールする必要がなくなりました。next startを使用したり、スタンドアロン出力モードで実行したりすると、Next.jsが自動的にsharpを使用します。

詳細については、Next.jsのセルフホスティングに関する新しいデモとチュートリアルビデオをご覧ください。

サーバーアクションのセキュリティ強化

サーバーアクションは、クライアントから呼び出せるサーバーサイド関数です。ファイルの先頭に'use server'ディレクティブを追加し、非同期関数をエクスポートすることで定義されます。

サーバーアクションやユーティリティ関数がコードの他の場所でインポートされていない場合でも、それらは公開されているHTTPエンドポイントです。この動作は技術的には正しいですが、そのような関数が意図せずに公開されてしまう可能性があります。

セキュリティを向上させるため、以下の機能強化を導入しました。

  • デッドコード削除: 未使用のサーバーアクションは、そのIDがクライアントサイドのJavaScriptバンドルに公開されなくなり、バンドルサイズが削減され、パフォーマンスが向上します。
  • セキュアなアクションID: Next.jsは、クライアントがサーバーアクションを参照および呼び出すことを可能にする、推測不可能で非決定的なIDを生成するようになりました。これらのIDは、セキュリティ強化のため、ビルド間で定期的に再計算されます。
// app/actions.js
'use server';
 
// This action **is** used in our application, so Next.js
// will create a secure ID to allow the client to reference
// and call the Server Action.
export async function updateUserAction(formData) {}
 
// This action **is not** used in our application, so Next.js
// will automatically remove this code during `next build`
// and will not create a public endpoint.
export async function deleteUserAction(formData) {}

サーバーアクションは引き続き公開HTTPエンドポイントとして扱われるべきです。サーバーアクションのセキュリティについて詳しくはこちらをご覧ください。

外部パッケージのバンドル最適化(安定版)

外部パッケージをバンドルすることで、アプリケーションのコールドスタートパフォーマンスを向上させることができます。App Routerでは、外部パッケージはデフォルトでバンドルされ、新しいserverExternalPackages設定オプションを使用して特定のパッケージをオプトアウトできます。

Pages Routerでは、外部パッケージはデフォルトではバンドルされませんが、既存のtranspilePackagesオプションを使用してバンドルするパッケージのリストを提供できます。この設定オプションでは、各パッケージを指定する必要があります。

App RouterとPages Router間の設定を統一するために、App Routerのデフォルトの自動バンドルに合わせるための新しいオプション、bundlePagesRouterDependenciesを導入します。必要に応じて、serverExternalPackagesを使用して特定のパッケージをオプトアウトできます。

next.config.ts
const nextConfig = {
  // Automatically bundle external packages in the Pages Router:
  bundlePagesRouterDependencies: true,
  // Opt specific packages out of bundling for both App and Pages Router:
  serverExternalPackages: ['package-name'],
};
 
export default nextConfig;

外部パッケージの最適化について詳しくはこちらをご覧ください。

ESLint 9のサポート

Next.js 15は、2024年10月5日のESLint 8のサポート終了に伴い、ESLint 9のサポートも導入しています。

スムーズな移行を確実にするため、Next.jsは下位互換性を維持しており、ESLint 8または9のどちらでも引き続き使用できます。

ESLint 9にアップグレードし、まだ新しい設定形式を採用していないことを検出した場合、Next.jsは移行を容易にするために自動的にESLINT_USE_FLAT_CONFIG=falseというエスケープハッチを適用します。

さらに、—ext—ignore-pathなどの非推奨オプションは、next lintの実行時に削除されます。ESLintは最終的にESLint 10でこれらの古い設定を許可しなくなるため、早めの移行をお勧めします。

これらの変更の詳細については、移行ガイドをご確認ください。

このアップデートの一環として、eslint-plugin-react-hooksv5.0.0にアップグレードしました。これにより、React Hooksの使用に関する新しいルールが導入されます。すべての変更はeslint-plugin-react-hooks@5.0.0の変更ログで確認できます。

開発とビルドの改善

サーバーコンポーネントHMR

開発中、サーバーコンポーネントは保存時に再実行されます。これは、APIエンドポイントまたはサードパーティサービスへのfetchリクエストも呼び出されることを意味します。

ローカル開発のパフォーマンスを向上させ、課金されるAPI呼び出しの潜在的なコストを削減するために、Hot Module Replacement (HMR)が以前のレンダリングからのfetchレスポンスを再利用できるようにしました。

サーバーコンポーネントHMRキャッシュについて詳しくはこちらをご覧ください。

App Routerの静的生成の高速化

静的生成を最適化し、特にネットワークリクエストが遅いページのビルド時間を改善しました。

以前は、静的最適化プロセスでページが2回レンダリングされていました。1回目はクライアントサイドナビゲーション用のデータを生成するため、2回目は初期ページアクセス用のHTMLをレンダリングするためです。現在では、最初のレンダリングを再利用し、2回目のパスをなくすことで、ワークロードとビルド時間を短縮しています。

さらに、静的生成ワーカーは、ページ間でfetchキャッシュを共有するようになりました。fetch呼び出しがキャッシュをオプトアウトしない場合、その結果は同じワーカーによって処理される他のページで再利用されます。これにより、同じデータに対するリクエスト数が削減されます。

高度な静的生成制御(実験的)

より高度な制御から恩恵を受けるような高度なユースケース向けに、静的生成プロセスをより詳細に制御するための実験的サポートを追加しました。

これらのオプションは同時実行性の増加によりリソース使用量の増加やメモリ不足エラーにつながる可能性があるため、特定の要件がない限り、現在のデフォルト設定を維持することをお勧めします。

next.config.ts
const nextConfig = {
  experimental: {
    // how many times Next.js will retry failed page generation attempts
    // before failing the build
    staticGenerationRetryCount: 1
    // how many pages will be processed per worker
    staticGenerationMaxConcurrency: 8
    // the minimum number of pages before spinning up a new export worker
    staticGenerationMinPagesPerWorker: 25
  },
}
 
export default nextConfig;

静的生成オプションについて詳しくはこちらをご覧ください。

その他の変更点

  • [破壊的変更] next/image:オプションの依存関係としてsquooshを削除し、sharpを優先するように変更しました(PR
  • [破壊的変更] next/image:デフォルトのContent-Dispositionattachmentに変更しました(PR
  • [破壊的変更] next/image:srcに先頭または末尾のスペースがある場合にエラーが発生するようになりました(PR
  • [破壊的変更] Middleware:推奨されないReact APIのインポートを制限するためにreact-server条件を適用します(PR
  • [破壊的変更] next/font:外部の@next/fontパッケージのサポートを削除しました(PR
  • [破壊的変更] next/font:font-familyハッシュ化を削除しました(PR
  • [破壊的変更] キャッシュ:force-dynamicがフェッチキャッシュにno-storeデフォルトを設定するようになりました(PR
  • [破壊的変更] Config:swcMinifyPR)、missingSuspenseWithCSRBailoutPR)、およびoutputFileTracingPR)の動作をデフォルトで有効にし、非推奨オプションを削除しました
  • [破壊的変更] Speed Insightsの自動計測を削除しました(今後は専用の@vercel/speed-insightsパッケージを使用する必要があります)(PR
  • [破壊的変更] 動的サイトマップルートの.xml拡張子を削除し、開発環境と本番環境でサイトマップURLを整合させました(PR
  • [破壊的変更] App Routerでのexport const runtime = "experimental-edge"のエクスポートは非推奨になりました。ユーザーはexport const runtime = "edge"に切り替える必要があります。この移行を実行するためのコードモッドを追加しました(PR
  • [破壊的変更] レンダリング中にrevalidateTagおよびrevalidatePathを呼び出すとエラーがスローされるようになりました(PR
  • [破壊的変更] instrumentation.jsおよびmiddleware.jsファイルがベンダー提供のReactパッケージを使用するようになりました(PR
  • [破壊的変更] 最小Node.jsバージョンが18.18.0に更新されました(PR
  • [破壊的変更] next/dynamic:非推奨のsuspenseプロップが削除され、コンポーネントがApp Routerで使用される場合、空のSuspense境界が挿入されなくなりました(PR
  • [破壊的変更] Edge Runtimeでモジュールを解決する際、workerモジュール条件は適用されません(PR
  • [破壊的変更] Server Componentsでnext/dynamicと一緒にssr: falseオプションを使用することが禁止されました(PR
  • [改善] メタデータ:Vercelでホストされている場合のmetadataBaseの環境変数フォールバックを更新しました(PR
  • [改善] optimizePackageImportsによる混合名前空間インポートと名前付きインポートでのツリーシェイキングの修正(PR
  • [改善] 並列ルート:一致しないキャッチオールルートに既知のすべてのパラメーターを提供(PR
  • [改善] Config bundlePagesExternalsが安定版となり、bundlePagesRouterDependenciesに名称変更されました。
  • [改善] Config serverComponentsExternalPackagesが安定版となり、serverExternalPackagesに名称変更されました。
  • [改善] create-next-app:新しいプロジェクトはデフォルトですべての.envファイルを無視します(PR
  • [改善] outputFileTracingRootoutputFileTracingIncludesoutputFileTracingExcludesが実験版から安定版にアップグレードされました(PR
  • [改善] グローバルCSSファイルとツリーのより深いCSSモジュールファイルの結合を回避(PR
  • [改善] キャッシュハンドラはNEXT_CACHE_HANDLER_PATH環境変数で指定できるようになりました(PR
  • [改善] Pages RouterがReact 18とReact 19の両方をサポートするようになりました(PR
  • [改善] エラーオーバーレイに、インスペクターが有効になっている場合、Node.jsインスペクターURLをコピーするボタンが表示されるようになりました(PR
  • [改善] App Router上のクライアントプリフェッチがpriority属性を使用するようになりました(PR
  • [改善] Next.jsがApp RouterでNext.jsの内部エラーを再スローするためのunstable_rethrow関数を提供するようになりました(PR
  • [改善] unstable_afterが静的ページでも使用できるようになりました(PR
  • [改善] SSR中にnext/dynamicコンポーネントが使用された場合、チャンクがプリフェッチされるようになりました(PR
  • [改善] esmExternalsオプションがApp Routerでサポートされるようになりました(PR
  • [改善] experimental.allowDevelopmentBuildオプションを使用して、デバッグ目的でnext buildNODE_ENV=developmentを許可できるようになりました(PR
  • [改善] Server Actionの変換がPages Routerで無効になりました(PR
  • [改善] ビルドワーカーが終了すると、ビルドがハングするのを防ぐようになりました(PR
  • [改善] サーバーアクションからのリダイレクト時、再検証が正しく適用されるようになりました(PR
  • [改善] Edge Runtimeでの並列ルートの動的パラメータが正しく処理されるようになりました(PR
  • [改善] 静的ページが初回ロード後もstaleTimeを尊重するようになりました(PR
  • [改善] vercel/ogがメモリリーク修正で更新されました(PR
  • [改善] タイミングのパッチが更新され、APIモックのためにmswのようなパッケージが使用できるようになりました(PR
  • [改善] プリレンダリングされたページは静的staleTimeを使用するべきです(PR

詳細については、アップグレードガイドをご覧ください。

貢献者

Next.jsは、3,000人を超える個人開発者、GoogleやMetaのような業界パートナー、そしてVercelのコアチームの共同作業の成果です。このリリースは、以下の協力によって実現されました。

@AbhiShake1、@Aerilym、@AhmedBaset、@AnaTofuZ、@Arindam200、@Arinji2、@ArnaudFavier、@ArnoldVanN、@Auxdible、@B33fb0n3、@Bhavya031、@Bjornnyborg、@BunsDev、@CannonLock、@CrutchTheClutch、@DeepakBalaraman、@DerTimonius、@Develliot、@EffectDoplera、@Ehren12、@Ethan-Arrowood、@FluxCapacitor2、@ForsakenHarmony、@Francoscopic、@Gomah、@GyoHeon、@Hemanshu-Upadhyay、@HristovCodes、@HughHzyb、@IAmKushagraSharma、@IDNK2203、@IGassmann、@ImDR、@IncognitoTGT、@Jaaneek、@JamBalaya56562、@Jeffrey-Zutt、@JohnGemstone、@JoshuaKGoldberg、@Julian-Louis、@Juneezee、@KagamiChan、@Kahitar、@KeisukeNagakawa、@KentoMoriwaki、@Kikobeats、@KonkenBonken、@Kuboczoch、@Lada496、@LichuAcu、@LorisSigrist、@Lsnsh、@Luk-z、@Luluno01、@M-YasirGhaffar、@Maaz-Ahmed007、@Manoj-M-S、@ManuLpz4、@Marukome0743、@MaxLeiter、@MehfoozurRehman、@MildTomato、@MonstraG、@N2D4、@NavidNourani、@Nayeem-XTREME、@Netail、@NilsJacobsen、@Ocheretovich、@OlyaPolya、@PapatMayuri、@PaulAsjes、@PlagueFPS、@ProchaLu、@Pyr33x、@QiuranHu、@RiskyMH、@Sam-Phillemon9493、@Sayakie、@Shruthireddy04、@SouthLink、@Strift、@SukkaW、@Teddir、@Tim-Zj、@TrevorSayre、@Unsleeping、@Willem-Jaap、@a89529294、@abdull-haseeb、@abhi12299、@acdlite、@actopas、@adcichowski、@adiguno、@agadzik、@ah100101、@akazwz、@aktoriukas、@aldosch、@alessiomaffeis、@allanchau、@alpedia0、@amannn、@amikofalvy、@anatoliik-lyft、@anay-208、@andrii-bodnar、@anku255、@ankur-dwivedi、@aralroca、@archanaagivale30、@arlyon、@atik-persei、@avdeev、@baeharam、@balazsorban44、@bangseongbeom、@begalinsaf、@bennettdams、@bewinsnw、@bgw、@blvdmitry、@bobaaaaa、@boris-szl、@bosconian-dynamics、@brekk、@brianshano、@cfrank、@chandanpasunoori、@chentsulin、@chogyejin、@chrisjstott、@christian-bromann、@codeSTACKr、@coderfin、@coltonehrman、@controversial、@coopbri、@creativoma、@crebelskydico、@crutchcorn、@darthmaim、@datner、@davidsa03、@delbaoliveira、@devjiwonchoi、@devnyxie、@dhruv-kaushik、@dineshh-m、@diogocapela、@dnhn、@domdomegg、@domin-mnd、@dvoytenko、@ebCrypto、@ekremkenter、@emmerich、@flybayer、@floriangosse、@forsakenharmony、@francoscopic、@frys、@gabrielrolfsen、@gaojude、@gdborton、@greatvivek11、@gnoff、@guisehn、@GyoHeon、@hamirmahal、@hiro0218、@hirotomoyamada、@housseindjirdeh、@hungdoansy、@huozhi、@hwangstar156、@iampoul、@ianmacartney、@icyJoseph、@ijjk、@imddc、@imranolas、@iscekic、@jantimon、@jaredhan418、@jeanmax1me、@jericopulvera、@jjm2317、@jlbovenzo、@joelhooks、@joeshub、@jonathan-ingram、@jonluca、@jontewks、@joostmeijles、@jophy-ye、@jordienr、@jordyfontoura、@kahlstrm、@karlhorky、@karlkeefer、@kartheesan05、@kdy1、@kenji-webdev、@kevva、@khawajaJunaid、@kidonng、@kiner-tang、@kippmr、@kjac、@kjugi、@kshehadeh、@kutsan、@kwonoj、@kxlow、@leerob、@lforst、@li-jia-nan、@liby、@lonr、@lorensr、@lovell、@lubieowoce、@luciancah、@luismiramirez、@lukahartwig、@lumirlumir、@luojiyin1987、@mamuso、@manovotny、@marlier、@mauroaccornero、@maxhaomh、@mayank1513、@mcnaveen、@md-rejoyan-islam、@mehmetozguldev、@mert-duzgun、@mirasayon、@mischnic、@mknichel、@mobeigi、@molebox、@mratlamwala、@mud-ali、@n-ii-ma、@n1ckoates、@nattui、@nauvalazhar、@neila-a、@neoFinch、@niketchandivade、@nisabmohd、@none23、@notomo、@notrab、@nsams、@nurullah、@okoyecharles、@omahs、@paarthmadan、@pathliving、@pavelglac、@penicillin0、@phryneas、@pkiv、@pnutmath、@qqww08、@r34son、@raeyoung-kim、@remcohaszing、@remorses、@rezamauliadi、@rishabhpoddar、@ronanru、@royalfig、@rubyisrust、@ryan-nauman、@ryohidaka、@ryota-murakami、@s-ekai、@saltcod、@samcx、@samijaber、@sean-rallycry、@sebmarkbage、@shubh73、@shuding、@sirTangale、@sleevezip、@slimbde、@soedirgo、@sokra、@sommeeeer、@sopranopillow、@souporserious、@srkirkland、@steadily-worked、@steveluscher、@stipsan、@styfle、@stylessh、@syi0808、@symant233、@tariknh、@theoludwig、@timfish、@timfuhrmann、@timneutkens、@tknickman、@todor0v、@tokkiyaa、@torresgol10、@tranvanhieu01012002、@txxxxc、@typeofweb、@unflxw、@unstubbable、@versecafe、@vicb、@vkryachko、@wbinnssmith、@webtinax、@weicheng95、@wesbos、@whatisagi、@wiesson、@woutvanderploeg、@wyattjoh、@xiaohanyu、@xixixao、@xugetsu、@yosefbeder、@ypessoa、@ytori、@yunsii、@yurivangeffen、@z0n、@zce、@zhawtof、@zsh77、そして@ztannerの皆様に心から感謝いたします!