環境変数
Next.js は環境変数をサポートしており、次のようなことができます:
環境変数のロード
Next.jsには、環境変数を .env.local
から process.env
にロードするためのサポートが組み込まれています。
DB_HOST=localhost
DB_USER=myuser
DB_PASS=mypassword
注: Next.jsは
.env*
ファイル内のマルチライン変数もサポートしています:# .env.local
# 改行して書くことができます
PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----
...
Kh9NV...
...
-----END DSA PRIVATE KEY-----"
# または二重引用符で囲んで `\n` をつけます。
PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nKh9NV...\n-----END DSA PRIVATE KEY-----\n"
注:
/src
フォルダを使用している場合、Next.js は親フォルダから のみ .env ファイルを読み込み、/src
フォルダからは読み込まないことに注意してください。 これにより、process.env.DB_HOST
、process.env.DB_USER
、process.env.DB_PASS
が自動的に Node.js 環境にロードされ、Route Handlers で利用できるようになります。
例えば:
export async function GET() {
const db = await myDB.connect({
host: process.env.DB_HOST,
username: process.env.DB_USER,
password: process.env.DB_PASS,
})
// ...
}
他の変数の参照
Next.js は、.env*
ファイル内の $VARIABLE
など、$
を使って他の変数を参照する変数を自動的に展開します。
これにより、他のシークレットを参照できるようになります。例えば:
TWITTER_USER=nextjs
TWITTER_URL=https://twitter.com/$TWITTER_USER
上記の例では、process.env.TWITTER_URL
は https://twitter.com/nextjs
となります。
Good to know: 実際の値に
$
が含まれる変数を使用する必要がある場合は、$
をエスケープする必要があります。例えば、\$
です。
ブラウザ用環境変数のバンドル
NEXT_PUBLIC_
以外の環境変数は Node.js 環境でのみ利用可能で、ブラウザからはアクセスできません(クライアントは別の 環境 で実行されます)。
ブラウザから環境変数の値にアクセスできるようにするために、Next.js はビルド時にクライアントに配信される js バンドルに値を "インライン" し、
process.env.[variable]
への参照をすべてハードコードされた値に置き換えることができます。
これを行うには、変数の前に NEXT_PUBLIC_
を付けるだけです。例えば:
NEXT_PUBLIC_ANALYTICS_ID=abcdefghijk
これにより、Node.js 環境の process.env.NEXT_PUBLIC_ANALYTICS_ID
への参照をすべて、next build
を実行した環境の値に置き換えるよう Next.js に指示します。これは、ブラウザに送信されるすべての JavaScript にインライン化されます。
注: ビルド後、アプリはこれらの環境変数の変更に反応しなくなります。例えば、Herokuパイプラインを使用して、 ある環境でビルドされたスラッグを別の環境にプロモートする場合や、単一のDockerイメージをビルドして複数の環境にデプロイする場合、 すべての
NEXT_PUBLIC_
変数はビルド時に評価された値で凍結されるため、プロジェクトのビルド時にこれらの値を適切に設定する必要があります。 実行環境の値にアクセスする必要がある場合は、独自のAPIをセットアップしてクライアントに提供する必要があります(オンデマンドまたは初期化中に)。
import setupAnalyticsService from '../lib/my-analytics-service'
// 'NEXT_PUBLIC_ANALYTICS_ID'は、先頭に'NEXT_PUBLIC_'が付くので、ここで使用することができます。
// これはビルド時に `setupAnalyticsService('abcdefghijk')` に変換されます。
setupAnalyticsService(process.env.NEXT_PUBLIC_ANALYTICS_ID)
function HomePage() {
return <h1>Hello World</h1>
}
export default HomePage
動的検索はインライン化され ない ことに注意してください:
// これはインライン化されません。
const varName = 'NEXT_PUBLIC_ANALYTICS_ID'
setupAnalyticsService(process.env[varName])
// これはインライン化されません。
const env = process.env
setupAnalyticsService(env.NEXT_PUBLIC_ANALYTICS_ID)
ランタイム環境変数
Next.jsは、ビルド時と実行時の両方の環境変数をサポートできます。
デフォルトでは、環境変数はサーバーでのみ利用可能です。 環境変数をブラウザに公開するには、その前に NEXT_PUBLIC_
を付けなければなりません。
しかし、これらの公開環境変数は next build
時に JavaScript バンドルにインライン化されます。
実行時の環境変数を読み取るには、getServerSideProps
を使用するか、App Routerを段階的に採用することを推奨します。
App Routerを使えば、動的レンダリング中にサーバ上の環境変数を安全に読み取ることができます。
これにより、異なる値を持つ複数の環境を通して昇格させることができる単一のDockerイメージを使用することができます。
import { unstable_noStore as noStore } from 'next/cache'
export default function Component() {
noStore()
// cookies()、headers()、およびその他の動的関数も動的レンダリングを選択するため、
// このenv変数は実行時に評価されます。
const value = process.env.MY_VALUE
// ...
}
Good to know:
- register 関数を使えば、サーバー起動時にコードを実行できます。
- スタンドアロン出力モードでは動作しないため、runtimeConfig オプションの使用は推奨しません。代わりに、App Routerを段階的に採用することを推奨します。
デフォルトの環境変数
通常、必要なのは .env.local
ファイル1つだけです。しかし、開発環境(next dev
)や本番環境(next start
)でいくつかのデフォルト値を追加したい場合もあるでしょう。
Next.jsでは、.env
(すべての環境)、.env.development
(開発環境)、.env.production
(本番環境)にデフォルトを設定できます。
.env.local
は常に設定されたデフォルトを上書きします。
Good to know:
.env
、.env.development
、.env.production
ファイルはデフォルトを定義しているので、リポジトリに含めるべきです。.env*.local
は.gitignore
に追加してください。 これらのファイルは無視されることを意図しています。.env.local
はシークレットを保存する場所です。