2018年6月27日水曜日
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にコンパイルされるトップレベルページを持つことが可能になりました。良い例はTypeScriptで、.ts
および.tsx
を使用します。
pageExtensions
は、Next.jsプラグインがページと見なされるべき拡張子を定義できるようにすることを目的としたnext.config.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
を使用することです。
// old
class Page extends React.Component {
render() {
const { url } = this.props;
return <div>{url.pathname}</div>;
}
}
export default Page;
Next.js 6より前のバージョンで
url
を使用してパス名にアクセスする方法
// new
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
を使用してパス名にアクセスする方法
Next.jsアプリケーションのアップグレードパスをシンプルに保つことに尽力しているため、url
の使用箇所をwithRouter
にアップグレードする簡単な方法を作成することに着手しました。
この取り組みの結果、特定の非推奨機能を新しい使い方に簡単にアップグレードできるコードモッドのライブラリであるnext‑codemodが誕生しました。
私たちが提供する最初のコードモッドはurl-to-withrouter
で、url
が使用されていた多くのケースを自動的にwithRouter
に変換します。
jscodeshift -t ./url-to-withrouter.js pages/**/*.js
これにより、
url
の使用がwithRouter
に変換されます。
Next.jsへの貢献
Next.jsコミュニティは成長しており、すでに450人以上のコントリビューターがNext.jsコアまたは例に少なくとも1つのコミットを行っています。
Next.jsに貢献する方法は多数あります。
-
コミュニティに参加し、GitHubでアドバイスをする
-
一般的なユースケースの例を貢献する: examplesディレクトリ
-
good first issueとhelp wantedのラベルが付いたGitHubのイシューを確認する
good first issueラベルの付いたオープンなイシューが30件あります。これにより、新しいコントリビューターに貢献する機会を提供しています。
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
に移行するための準備を段階的に進めています。このパッケージは、インストールサイズと起動時間に対して大幅に最適化されます。これらの最適化は、アプリケーションの新しいインスタンスがリクエストごと、または数リクエストごとに実行される「サーバーレス」のユースケースに必要です。つまり、アプリケーションの「コールドスタート」を可能な限り高速に最適化する必要があります。