1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Next.js 16 のアップデート内容をおさらいをしようと思ったら、16.1 もリリースされていますね

1
Last updated at Posted at 2025-12-19

先日 Next.js 16 が利用できるようになりました。
さらっと内容を理解するためのキャッチアップようにまとめました。

キャッチアップできてなかった!って方のための記事です。

use cache ディレクティブ導入

use cache を利用することでページ、コンポーネント、関数をキャッシュ個別にキャッシュできるようになりました。

機能を有効にするには next.config.ts にオプションを追加する必要があります。

next.config.ts
import type { NextConfig } from 'next'
 
const nextConfig: NextConfig = {
  cacheComponents: true,
}
 
export default nextConfig

ユーザー固有のコンテンツをキャッシュする場合は use cache: private を利用すると良いとのことです。

use cache: private は試験的な機能だとのことなので本番環境での使用はお控えください。

Next.js DevTools MCP

ハイドレーションエラーやアップデートに必要なライブラリの検知などを行ってくれます。
様々なことを自動で最適化していってくれるため開発体験が大幅に向上します。

Turbopack がデフォルトに

安定版として利用可能になり、デフォルトの設定になりました。
Fast Refresh が 5 〜 10 倍高速化されるということで開発体験が上がりそうですね!
dev や build コマンドに webpack オプションをつけることで引き続き webpack でも利用できます。

next dev --webpack
next build --webpack

ルーティングの最適化

レイアウトの重複排除って何かと思いましたが、ネットワークの転送量が削減されるとのことです。

共有レイアウトを使用する複数のURLを事前に読み込む場合、各Linkごとに個別にレイアウトをダウンロードするのではなく、1回のリクエストでまとめて取得します。例えば、50個の商品リンクを含むページでは、従来のように50回レイアウトをダウンロードする必要がなくなり、ネットワーク転送量が大幅に削減されます。

ページ全体ではなく、キャッシュに存在しない部分のみをプリフェッチされます。

  • リンクがビューポートから外れた場合はリクエストをキャンセル
  • リンクにマウスオーバーした時やビューポートに再表示された時は、リンクのプリフェッチを優先
  • データが無効になったリンクについては、再度プリフェッチを実行
  • 今後実装予定の「Cache Components」などの新機能ともシームレスに連携

プリフェッチの仕組みが変わるため、プリフェッチリクエストは増加、ネットワークの転送量が減ります。

記事にはトレードオフであると書かれていましたので今後のパフォーマンスに関しては少し気にしておく必要がありそうだと思いました。

キャッシュ API の改良

revalidateTag() が更新

cacheLifeプロファイルが必須になり、
キャッシュの更新タイミングを明確に制御できるようになりました。

import { revalidateTag } from 'next/cache';

// ✅ Use built-in cacheLife profile (we recommend 'max' for most cases)
revalidateTag('blog-posts', 'max');
 
// Or use other built-in profiles
revalidateTag('news-feed', 'hours');
revalidateTag('analytics', 'days');
 
// Or use an inline object with a custom revalidation time
revalidateTag('products', { expire: 3600 });

updateTag() が追加

updateTag()は、同じリクエスト内で期限切れのデータをすぐに読み取る、書き込み読み取りセマンティクスを提供する新しいサーバー アクション専用 API です。

'use server';
 
import { updateTag } from 'next/cache';
 
export async function updateUserProfile(userId: string, profile: Profile) {
  await db.users.update(userId, profile);
 
  // Expire cache and refresh immediately - user sees their changes right away
  updateTag(`user-${userId}`);
}

これにより、インタラクティブな機能に変更が即座に反映されます。
フォーム、ユーザー設定、そしてユーザーが更新内容を即座に確認したいワークフローなどに最適です。

refresh() の追加

キャッシュされていないデータのみを更新するための、新しいサーバーアクション専用 API です。

'use server';
 
import { refresh } from 'next/cache';
 
export async function markNotificationAsRead(notificationId: string) {
  await db.notifications.markAsRead(notificationId);
  refresh();
}

ページ上の他の場所に表示されているキャッシュされていないデータを更新する必要がある場合に使用します。

破壊的変更

以下アップデート時に修正対応が必要そうな項目です。

  • Node.js 20.9 必須(v18 サポート終了)
  • TypeScript 5.1 必須
  • AMP、next lint、レガシー設定の削除
  • params と searchParams が非同期に(必須変更)
  • すべての並行ルートスロットに default.js ファイルが必須

個人的には過去一世を風靡したと言ってもいい AMP のサポート終了が少し寂しい気持ちになりました。

まとめ

全体としてパフォーマンス関連が大きくアップデートされた印象です。
キャッシュの方法これまでは暗黙的に行われていたことで一部ブラックボックスのように感じられたのがコントロールできるのは良かった気がしています。

ただ、言い換えるならキャッシュ戦略を行わないとパフォーマンスが悪くなっていくことは明白です。
よりパフォーマンスは中止しておく必要がありそうです。

また、16.1 についても発表がありました。

v16 ではベータ版だった 「Turbopack のファイルシステムキャッシュ」の実装によりコンパイル時間の短縮が実現されました。

また、実験的な要素だと書かれていましたが「バンドルアナライザー」が追加されバンドルサイズの最適化が簡単にできるようになりました。

他にも依存関係の修正や MCP へのツール追加なども行われているのでぜひチェックしてみてください!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?