Next.jsで環境変数を使用する方法
Next.jsには環境変数の組み込みサポートがあり、以下のことが可能です:
警告: デフォルトの
create-next-app
テンプレートは、すべての.env
ファイルが.gitignore
に追加されることを保証します。これらのファイルをリポジトリにコミットすることはほとんどありません。
環境変数の読み込み
Next.jsは.env*
ファイルからprocess.env
に環境変数を読み込む組み込みサポートを提供しています。
注記: Next.jsは
.env*
ファイル内の複数行にわたる変数もサポートしています:
注記:
/src
フォルダを使用している場合、Next.jsは親フォルダからのみ.envファイルを読み込み、/src
フォルダからは読み込みません。 これにより、process.env.DB_HOST
、process.env.DB_USER
、process.env.DB_PASS
がNode.js環境に自動的に読み込まれ、Route Handlersで使用できるようになります。
例えば:
@next/env
を使用した環境変数の読み込み
Next.jsのランタイム外で環境変数を読み込む必要がある場合(ORMやテストランナーのルート設定ファイルなど)、@next/env
パッケージを使用できます。
このパッケージはNext.js内部で.env*
ファイルから環境変数を読み込むために使用されています。
使用するには、パッケージをインストールし、loadEnvConfig
関数を使用して環境変数を読み込みます:
その後、必要に応じて設定をインポートできます。例えば:
他の変数の参照
Next.jsは、.env*
ファイル内で$
を使用して他の変数を参照する変数(例:$VARIABLE
)を自動的に展開します。これにより、他のシークレットを参照できます。例えば:
上記の例では、process.env.TWITTER_URL
はhttps://x.com/nextjs
に設定されます。
豆知識: 実際の値に
$
を含む変数を使用する必要がある場合、エスケープする必要があります(例:\$
)。
ブラウザ用の環境変数のバンドル
NEXT_PUBLIC_
がプレフィックスされていない環境変数はNode.js環境でのみ利用可能で、ブラウザからはアクセスできません(クライアントは別の環境で実行されます)。
ブラウザで環境変数の値を利用可能にするために、Next.jsはビルド時に値をJavaScriptバンドルに「インライン化」し、process.env.[variable]
へのすべての参照をハードコードされた値に置き換えます。これを行うには、変数にNEXT_PUBLIC_
をプレフィックスするだけです。例えば:
これにより、Next.jsはNode.js環境内のprocess.env.NEXT_PUBLIC_ANALYTICS_ID
へのすべての参照を、next build
を実行する環境の値で置き換え、コード内のどこでも使用できるようになります。これはブラウザに送信されるJavaScriptにインライン化されます。
注記: ビルド後、アプリはこれらの環境変数の変更に応答しなくなります。例えば、Herokuパイプラインを使用して1つの環境でビルドしたスラグを別の環境にプロモートする場合、または単一のDockerイメージを複数の環境にビルド・デプロイする場合、すべての
NEXT_PUBLIC_
変数はビルド時に評価された値で固定されるため、プロジェクトのビルド時にこれらの値を適切に設定する必要があります。ランタイム環境値にアクセスする必要がある場合は、クライアントに提供する独自のAPIを設定する必要があります(オンデマンドまたは初期化時)。
動的ルックアップはインライン化されないことに注意してください:
ランタイム環境変数
Next.jsはビルド時とランタイムの両方の環境変数をサポートします。
デフォルトでは、環境変数はサーバーでのみ利用可能です。ブラウザに環境変数を公開するには、NEXT_PUBLIC_
をプレフィックスする必要があります。ただし、これらの公開環境変数はnext build
中にJavaScriptバンドルにインライン化されます。
動的レンダリング中にサーバー上で安全に環境変数を読み取ることができます:
これにより、異なる値を持つ複数の環境でプロモートできる単一のDockerイメージを使用できます。
豆知識:
register
関数を使用してサーバー起動時にコードを実行できます。- スタンドアロン出力モードでは動作しないため、
runtimeConfig
オプションの使用は推奨しません。代わりに、この機能が必要な場合はApp Routerを段階的に採用することを推奨します。
テスト環境変数
development
とproduction
環境に加えて、3番目のオプションとしてtest
環境があります。開発や本番環境のデフォルトを設定できるのと同じように、testing
環境用に.env.test
ファイルで設定できます(ただし、これは前の2つほど一般的ではありません)。Next.jsはtesting
環境では.env.development
や.env.production
から環境変数を読み込みません。
これは、jest
やcypress
などのツールでテストを実行する際に、テスト目的のみに特定の環境変数を設定する必要がある場合に便利です。NODE_ENV
がtest
に設定されている場合、テストのデフォルト値が読み込まれますが、通常はテストツールがこれを処理するため手動で行う必要はありません。
test
環境とdevelopment
およびproduction
環境には小さな違いがあります:.env.local
は読み込まれません。これは、テストがすべての人に対して同じ結果を生成することを期待しているためです。これにより、.env.local
(デフォルトセットを上書きすることを意図しています)を無視することで、異なる実行間で同じ環境デフォルトが使用されます。
豆知識: デフォルトの環境変数と同様に、
.env.test
ファイルはリポジトリに含めるべきですが、.env.test.local
は含めるべきではありません。.env*.local
は.gitignore
を通じて無視されることを意図しています。
ユニットテストを実行する際、@next/env
パッケージのloadEnvConfig
関数を活用して、Next.jsと同じ方法で環境変数を読み込むことができます。
環境変数の読み込み順序
環境変数は以下の場所で順番に検索され、変数が見つかると停止します。
process.env
.env.$(NODE_ENV).local
.env.local
(NODE_ENV
がtest
の場合はチェックされません).env.$(NODE_ENV)
.env
例えば、NODE_ENV
がdevelopment
で、.env.development.local
と.env
の両方で変数を定義している場合、.env.development.local
の値が使用されます。
豆知識:
NODE_ENV
に許可される値はproduction
、development
、test
です。
豆知識
/src
ディレクトリを使用している場合、.env.*
ファイルはプロジェクトのルートに残す必要があります。- 環境変数
NODE_ENV
が割り当てられていない場合、Next.jsはnext dev
コマンド実行時にはdevelopment
を、その他のコマンドではproduction
を自動的に割り当てます。
バージョン履歴
バージョン | 変更点 |
---|---|
v9.4.0 | .env とNEXT_PUBLIC_ のサポートが導入されました。 |