Backブログに戻る

Next.js 9.1.7

Next.js 9.1.7 は堅実な基盤をさらに改善し、エンタープライズ対応の 9.1 リリースチャネルを強化しました。クライアントサイド JavaScript バンドルの小型化、CLI 出力の再設計、FCP/TTI の高速化などを実現するためにアップグレードしましょう!

Next.js 9 は6ヶ月前に、Next.js 9.1 は3ヶ月前にリリースされました。

これら2つのリリースでは、ベースラインのクライアントランタイムサイズを増やすことなく、Next.js に非常に強力な新機能が追加されました。

それ以来、フレームワーク全体の洗練と改善に注力してきました: 9.1.1, 9.1.2, 9.1.3, 9.1.4, 9.1.5, 9.1.6, そして 9.1.7

これらのリリースで改善された点を見ていきましょう!

これらの利点はすべて非破壊的で完全な後方互換性があります。更新するには次のコマンドを実行するだけです:

Terminal
npm i next@latest react@latest react-dom@latest

3% - 8%以上のクライアントサイド JavaScript サイズ削減

Google Chrome チームとの協力により、すべての Next.js アプリケーションで 7.5kB以上 のサイズ削減が実現されます。

基本的なアプリケーションでは3-4%のアプリケーションサイズ削減が期待でき、より高度なアプリケーションでは6-8%以上(またはそれ以上)の削減が見込めます!

9.0.x9.1.x差分
基本アプリケーション68.9kB66.1kB4.1% 削減

この削減は、url パッケージのクライアントサイドバージョンURL API 上に構築されたものに置き換えたことにも一部起因しています。

さらに、よく使用されるパッケージ向けの組み込み小型ポリフィルを提供することでサイズ削減を実現しました。これらのポリフィルについて詳しくはこちらをご覧ください

最後に、JSX 出力を最適化したため、アプリケーション内の JSX 量に比例してサイズ削減が得られます。

再設計されたプロダクションビルド CLI 出力

CLI のプロダクションビルド出力は明確さのために再設計されました。Next.js はハイブリッドアプリケーションフレームワークであるため、各ページは異なる特性を持つ可能性があります。

新しい出力では各ページを次のいずれかに分類します:

  • サーバーサイドレンダリング (Server): ページは実行時にサーバーサイドレンダリングされ、getInitialProps または getServerProps (提案) を使用することを意味します
  • 自動静的最適化 (Static): ページはビルド時に静的 HTML としてレンダリングされ、静的ファイルとして提供されます(初期 props を使用しません)
  • 計算データを使用した静的生成 (SSG): ページはビルド時に静的 HTML/JSON として生成され、静的ファイルとして提供されます(getStaticProps (提案) を使用します)

さらに、新しい出力では各ページの Gzip 圧縮サイズが表示されます — これらのサイズはすべてのページで共有されるファイル(別途表示)を除いています。

各ページのサイズはユーザー体験に応じて色分けされます:

新しい Next.js プロダクション CLI 出力

新しい Next.js プロダクション CLI 出力

新しいビルド出力についてのフィードバックをお待ちしています。

近い将来、Next.js にはページが特定のサイズ範囲内にあることを確認するのに役立つサイズバジェットも導入される予定です。

新たな組み込みポリフィル: fetch(), URL, Object.assign

多くのユーザーのアプリケーションとサンプルを調査した結果、ほとんどが同様のポリフィルセットを出荷していることがわかりました。場合によっては、同じ機能に対して重複したポリフィルを持つアプリケーションもありました。

これを改善するため、Google Chrome チームと協力して、最も一般的な3つの API 向けのポリフィルを組み込みました。

差分読み込みを使用することで、これらのポリフィルはグローバルなウェブトラフィックの 83% では読み込まれません。つまり、ほとんどのユーザーはこれらのポリフィルに関連するバイトをダウンロードせず、必要な場合にのみダウンロードされます。

さらに、組み込まれた既知のポリフィルはプロダクションビルドから完全に排除されます。つまり、これらの API のポリフィルを誤ってインポートする依存関係があっても、その代償を支払う必要がなくなります。

組み込まれた API とそれらが不要にするポリフィルのリストは次のとおりです:

サーバー上で fetch() を使用する場合は、引き続き isomorphic-fetch または isomorphic-unfetch をインポートする必要があります。

この変更は完全に非破壊的であり、すべてのポリフィルは利用可能な最も仕様に準拠したバージョンで作成されています。結果として、モダンブラウザではプロダクションバンドルから最大 18kB の JavaScript が削除 されます。

ページ読み込みの最適化: FCP と TTI の改善

Next.js はプリロード実装を最適化し、FCP と全体的な TTI を削減しました。

ブラウザのバグを回避することで、CSS(使用時)が JavaScript よりも正しく優先されるようになりました。これにより First Contentful Paint が高速化され、エンドユーザーにとって視覚的に完成したウェブサイトが大幅に高速化されます。

さらに、ページプリフェッチを低優先度のネットワークリクエストを使用するように最適化しました。

また、これらのリクエストはブラウザのアイドル時間中にのみ発生するため、インタラクティブになるまでの時間が短縮されます。これはブラウザが楽観的なプリフェッチよりもアプリケーションをインタラクティブにすることを優先するためです。

最適化前後の FCP/TTI

最適化前後の FCP/TTI

最新 JavaScript 機能のサポート

Next.js には高度で高度に最適化されたコンパイルパイプラインがあり、最新の JavaScript 機能を使用できます。最近導入した最適化は直接 3-8%の削減 に貢献しました。

これらの JavaScript 機能は、ブラウザの互換性を気にせずに活用できます。私たちは自動的にコードをコンパイルしてすべてのブラウザ(サポート終了バージョンを除く)をサポートします。これには async/await (ES2017)Object Rest/Spread Properties (ES2018)Dynamic import() (ES2020) などの ES6+ 機能が含まれます!

このリリースでは、Optional Chaining (Stage 4)Nullish Coalescing (Stage 4) のサポートを発表できることを嬉しく思います。

pages/index.js
function Page(props) {
  return (
    <p>{props?.deeply?.nested?.value}</p>
    /* ⬆ deeply.nested.value が利用できない場合はレンダリングされません */
  );
}
 
export default Page;

Optional chaining 演算子 (?.)

pages/index.js
function Page(props) {
  return (
    <p>{props.something ?? 'デフォルト値'}</p>
    /* ⬆ "デフォルト値" になります */
  );
}
 
export default Page;

Nullish coalescing 演算子 (??)

将来的には、自動 module / nomodule ビルド を通じてさらに最適化されたバンドルを出力する予定です。

next export アプリケーション向けゼロコンフィグデプロイサポート

Next.js の next export コマンドは、Vercel の ゼロコンフィギュレーション でそのまま動作するようになりました。この変更以前は、next export を利用するユーザーはカスタムの now.json を作成する必要がありました。

Vercel で Next.js のエクスポートモードを利用するには、package.json に次の build スクリプトを記述するだけです:

package.json
{
  "scripts": {
    "build": "next build && next export"
  }
}

その後、Next.js アプリケーションを Vercelたった1つのコマンドで デプロイできます。Vercel をまだインストールしていない場合は、Vercel CLI をインストールしてください。

Terminal
now

React Strict Mode 準拠とオプトイン

Next.js ランタイム全体が Strict Mode に準拠するようになりました。これには Next.js の head マネージャー (<Head>)、next/dynamic、その他のコア機能の更新が含まれます。つまり、ランタイムはフックを利用するか、非推奨のライフサイクルを排除し、React の新しい Context API を使用しています。

また、アプリケーション全体で Strict Mode を有効にする便利なオプトインオプションも追加しました。

有効にするには、next.config.js で次のオプションを設定します:

next.config.js
module.exports = {
  reactStrictMode: true,
};

あなたやチームがアプリケーション全体で Strict Mode を使用する準備ができていない場合でも問題ありません!<React.StrictMode> を使用して、ページごとに段階的に移行できます。

必須ではありませんが、Strict Mode は将来的に多くの最適化を可能にします。そのため、早めに検討することをお勧めします!

Nightly React ビルドに対する自動テスト

React コアチームとの緊密な連携 により、Next.js は12時間ごとに React の next チャネルに対してテスト されるようになりました。

これらのテストは、React の将来のリリースに対して準備が整い互換性があることを確認するのに役立ちます。互換性は Next.js が非常に重視しているもので、Next.js の長期的な API 安定性に取り組んでいます。

このプロセスは React コアチームによって文書化され、React エコシステムの他のプロジェクトも同様の取り組みを行うことを期待しています。

コミュニティ

今後の変更により、すべての Next.js アプリケーションのサイズとパフォーマンスが改善されることを楽しみにしています。

さらに、Next.js コミュニティはまだ拡大しています:

  • 865人以上 の独立したコントリビューターが参加しています。
  • GitHub では、プロジェクトが 43,700回以上 スターされています。
  • examples ディレクトリ には 220以上の例 があります。

Next.js コミュニティには現在 13,600人以上 のメンバーがいます。ぜひ参加してください!

このリリースを形作るのに役立ったコミュニティとすべての外部フィードバックと貢献に感謝します。