はじめに
フロントエンドエンジニアのryoです。今回は 既にdeprecatedとされているRuntime configについて、個人的になぜdeprecatedになったのか気になったので、 主にgithubのissueやPRを見てみて、その経緯をまとめようと思います。
v5.1.0: Runtime config のリリース
v5.1でリリースされた様です。こちらがその時のリリースノートのEnvironment configurationの項目です。 読むと、以下の様なことが書いてあります。
- 一般的なNode.jsで動くアプリケーションは環境変数をどこでも扱えるがNext.jsでは一部参照が出来なかった
- Next.jsはクライアント側でも動作するため
- クライアント側でも環境情報を参照出来るように以下の4つの方法が提供された
publicRuntimeConfig
serverRuntimeConfig
next.config.js
next/config
現在多機能なnext.config.jsは、この機能のために実装された事が伺えます。
補足
- next.config.jsが追加されたPR
- runtime configの定義が追加されたPR
v9.1.7: Next.jsの公式ドキュメントが刷新される
https://github.com/vercel/next.js/releases/tag/v9.1.7 でドキュメントが刷新されたようです。
- この時点の https://github.com/vercel/next.js/blob/v9.1.7/docs/api-reference/next.config.js/runtime-configuration.md を見るに、Automatic Static Optimization と互換性がなく、若干利用を推奨しない感じが既にあります。
v9.4.7: NEXT_PUBLIC_*のリリース
https://github.com/vercel/next.js/releases/tag/v9.4.0 では環境変数周りの変更が多く含まれており、そのうちの1つにNEXT_PUBLIC_ env var
の追加がありました。
環境変数に関する変更はこの議論によってスタートしたようで、publicRuntimeConfig
と NEXT_PUBLIC_ env var
についての議論も行われていました。
ざっくり以下のような雰囲気でした。
publicRuntimeConfig
はもう不要ではないか、とこの時点で言っている方もいるが、半数以上はpublicRuntimeConfig
はまだ用途があるというスタンスで好意的な意見を持っている印象- 具体的には、複雑なオブジェクトはNEXT_PUBLIC_* よりもpublicRuntimeConfigが良いという意見が見受けられた
私としては環境変数をクライアントでも利用できるようにと実装された機能が、ユースケースに応じて拡張されていたような印象を受けました。
v12.2.3 Output File Tracing のドキュメントに runtime configは legacyであると記載される
https://github.com/vercel/next.js/releases/tag/v12.2.3 でOutput File Tracingのドキュメントにruntime configがlegacyであると記載されました。 ドキュメントの更新PRはこちらです。 この更新がされたきっかけはこの standaloneモードでruntimeConfigが機能しないというissueのようです。
補足
- 現行のstandaloneモードのドキュメント
- 印象的なメンテナーのコメント
v13.0.6 runtime config のドキュメントに legacyが記載される
https://github.com/vercel/next.js/releases/tag/v13.0.6 でruntime configのドキュメントにもlegacyな機能である事が明記されました。 PRはこちらです。内容を見るとこのPR作成者もstandaloneモード利用時にruntimeConfigで困り、ドキュメントの更新PRを作成した様子でした。
v14.0.2: runtime config はdeprecatedであると明記される
https://github.com/vercel/next.js/releases/tag/v14.0.2 で This feature is deprecated
と記載されました。RSCの機能とも相性が悪かった事も、背景の1つに見えます。
まとめ
今回はNext.jsのRuntime configが実装されてからdeprecatedになるまでをgithubのissueやPRを見て振り返りました。 リリースを追っているだけでは見えてこなかった背景が見えて、とても勉強になりました。また、Decision Recordが残っていたためとても調べやすかったです。 私自身普段からドキュメントは残すように心がけているのですが、改めてその重要性を感じました。ここまで読んでいただき、ありがとうございました。