Backブログに戻る

Next.js 6.1 リリース

Next.js 6.1 では開発時の信頼性と一貫性が向上しました

本日、本番環境対応の Next.js 6.1 をリリースできることを誇りに思います。主な特徴は以下の通りです:

  • ホットリロードの信頼性向上
  • コードベースの改善
  • Next.js コーデモッドの導入

Next.js 6.1 のリリースに加えて、nextjs.orgオープンソース化 されたことも発表できることを嬉しく思います。

ホットリロードの信頼性向上

Next.js 6.1 以前のバージョンでは、Next.js はユーザーの代わりに react-hot-loader を実装していました。このライブラリはホットリロード間で React の状態を保持します。

これにより react-hot-loader は React にいくつかの非標準的な動作を追加します。例えば、shouldComponentUpdate を無視したり、要素の type が実際の React コンポーネントではなくプロキシコンポーネントになってしまうことがありました。

Next.js を標準の React に可能な限り近づけるため、依存関係から react-hot-loader を削除しました。これにより開発モードと本番モードの動作がより近くなります。なお、Next.js のホットリロード機能が削除されたわけではないことに注意してください。ホットリロードは常に Next.js 内部で処理されています。

TypeScript やその他のカスタム拡張子のホットリロード

デフォルトでは、Next.js は pages ディレクトリ内の .js または .jsx ファイルを自動的に探してルートを定義します。

Next.js 5 でユニバーサル webpack が導入されたことで、コンパイル済みの JavaScript トップレベルページを持つことが可能になりました。良い例が .ts.tsx を使用する TypeScript です。

pageExtensionsnext.config.js の設定キーで、Next.js プラグインがページと見なすべき拡張子を定義できるようにするためのものです。例えば @zeit/next-typescript.ts.tsx を定義し、@zeit/next-mdxドキュメントでトップレベルの .mdx ページの使用方法を説明しています。

以前は pageExtensions を実装する際、Next.js プラグインはホットリロードに使用される hot-self-accept-loader を実装する必要がありました。これはもはや必要なくなり、pageExtensions に拡張子を追加すると hot-self-accept-loader が自動的に適用されます。

コードベースの改善

最近、私たちは今後の機能に向けた準備を進めており、これには長期的なコード品質の向上につながる内部的な変更が含まれています。

これらの変更の1つは、server/build ディレクトリをトップレベルの build に移動したことです。これにより、新しいコントリビューターが webpack と babel の設定を見つけやすくなりました。

また、コードベース全体に Flow の型を追加することにも注力しています。

ユーザーにとってより目に見える変更は、.next/dist.next/server に名前変更されたことです。.next ディレクトリはビルド出力を保持します。例えば next build を実行すると、結果は .next に保存されます。

プリレンダリングファイルは現在 server ディレクトリにあります

同じ定数の出現箇所は共通ファイル constants.js に移動されました。

Next.js コーデモッド

Next.js 6.0 がリリースされた際、ページコンポーネントに魔法のように注入されていた url プロパティは非推奨になりました。url が廃止される理由は、物事を非常に予測可能で明示的にしたいからです。どこからともなく魔法のように現れる url プロパティはこの目標に役立ちません。

url プロパティと同じプロパティを取得する推奨方法は withRouter を使用することです:

page.js
// 旧
class Page extends React.Component {
  render() {
    const { url } = this.props;
    return <div>{url.pathname}</div>;
  }
}
export default Page;

Next.js 6 以前のバージョンで url を使用して pathname にアクセスする方法

page.js
// 新
import { withRouter } from 'next/router';
class Page extends React.Component {
  render() {
    const { router } = this.props;
    return <div>{router.pathname}</div>;
  }
}
export default withRouter(Page);

Next.js 6 以降のバージョンで withRouter によって注入される router を使用して pathname にアクセスする方法

私たちは Next.js アプリケーションのアップグレードパスをシンプルに保つことにコミットしているため、url の使用を withRouter にアップグレードする簡単な方法を作成することにしました。

この取り組みの結果が next‑codemod です。これは非推奨の機能を新しい使用方法にアップグレードするコーデモッドのライブラリで、1つのコマンドを実行するだけで簡単にアップグレードできます。

私たちが提供する最初のコーデモッドは url-to-withrouter で、url が使用されていた多くのケースを自動的に withRouter に変換します。

Terminal
  jscodeshift -t ./url-to-withrouter.js pages/**/*.js

これにより url の使用が withRouter に変換されます

詳細はこちら

Next.js への貢献

Next.js コミュニティは成長しており、Next.js コアや例に少なくとも1つのコミットをしたコントリビューターが450人以上います。

Next.js に貢献する方法はたくさんあります:

nextjs.org のオープンソース化

nextjs.orgオープンソース になったことを発表できることを嬉しく思います。これにより、リファレンス Next.js 実装として機能し、イシューや改善点を直接プロジェクトに提出できるようになります。

将来の展望

私たちは信頼性とパフォーマンスを向上させるためのいくつかの新機能に取り組んでいます。以下にいくつかのハイライトを紹介します:

Webpack 4

Webpack 4 には多くの改善点があります: より良いコード分割、デフォルトで必要な設定が少なく、最も重要なのはビルド時間の短縮です。200以上のページを持つアプリで行った初期テストでは、next build の平均時間が100秒から70秒に短縮されました。2回目以降の実行(キャッシュあり)では、next build の平均時間は21秒でした。

サーバーレス Next.js

私たちは next start を独自のパッケージ next-server に移行するための準備を段階的に進めています。このパッケージはインストールサイズと起動時間に重点を置いて最適化されます。これらの最適化は、リクエストごとまたは数リクエストごとにアプリの新しいインスタンスが実行される「サーバーレス」ユースケースに必要です。つまり、アプリケーションの「コールドスタート」を可能な限り高速化する必要があります。