Next.jsにおける環境変数 (env) の取り扱い
個人のメモレベルで公式ドキュメントの環境変数について日本語翻訳した感じにしてます。
環境変数の基本的な設定方法
Next.jsのバージョン9.4以上から取り込まれた機能になります。
This document is for Next.js versions 9.4 and up. If you’re using an older version of Next.js, upgrade or refer to Environment Variables in next.config.js.
Next.js には環境変数の組み込みサポートが付属しており、次のことが可能になります。
-
.env.local
を使用して環境変数の読み込みます。 -
NEXT_PUBLIC_
keyのprefixにすることで、ClientでもServer側でも読み込めるようにする
環境変数の読み込み
Next.jsは、環境変数を.env.local
からprocess.env
に読み込むことが可能です。
たとえば以下のように.env.local
に書いた場合
DB_HOST=localhost
DB_USER=myuser
DB_PASS=mypassword
これにより、process.env.DB_HOST
、process.env.DB_USER
、および process.env.DB_PASS
がNode.js環境に自動的に読み込まれ、Next.jsのData Fetching MethodとAPI Routerで利用できるようになります。
たとえばgetStaticPropsメソッドで利用する場合はこのように書きます。
export const getStaticProps = async ()=> {
const db = await myDB.connect({
host: process.env.DB_HOST,
username: process.env.DB_USER,
password: process.env.DB_PASS,
})
// ...
}
Note
Next.jsは.env*
の変数($VAR)を自動的に展開します。これにより、次のように他のシークレットを参照できます。.envHOSTNAME=localhost PORT=8080 HOST=http://$HOSTNAME:$PORT
実際の値に
$
を含む変数を使用しようとしている場合は、\$
のようにエスケープする必要があります。例えば
.envA=abc # becomes "preabc" WRONG=pre$A # becomes "pre$A" CORRECT=pre\$A
Note
/src
フォルダーを使用している場合、Next.jsは/src
ディレクトリからではなく、親ディレクトリからのみ.env
を読み込むことに注意してください。
ブラウザへの環境変数の公開
デフォルトでは、環境変数はNode.js環境でのみ使用できます。つまり環境変数はブラウザーに公開されません。
変数をブラウザに公開するには、変数の前にNEXT_PUBLIC_
を付ける必要があります。
NEXT_PUBLIC_ANALYTICS_ID=abcdefghijk
これは process.env.NEXT_PUBLIC_ANALYTICS_ID
を自動的にNode.js環境に読み込み、コード内の任意の場所で使用できるようにします。
この値は、NEXT_PUBLIC_
というprefixがあるため、ブラウザに送信されるJavaScriptにインライン化されます。
このインライン化はビルド時に行われるため、様々なNEXT_PUBLIC_環境はプロジェクトのビルド時に設定される必要があります。
import setupAnalyticsService from '../lib/my-analytics-service'
// 'NEXT_PUBLIC_ANALYTICS_ID'はprefixに`NEXT_PUBLIC_`がついているためここで使用可能です。
// ビルド時にsetupAnalyticsService('abcdefghijk')に変換んされます。
setupAnalyticsService(process.env.NEXT_PUBLIC_ANALYTICS_ID)
const HomePage = () =>(<h1>Hello World</h1>)
export default HomePage
Note
次のように変数を利用した場合のインライン化されません。// 変数を使用した指定はインライン化されない const varName = 'NEXT_PUBLIC_ANALYTICS_ID' setupAnalyticsService(process.env[varName]) // 変数を使用した指定はインライン化されない const env = process.env setupAnalyticsService(env.NEXT_PUBLIC_ANALYTICS_ID)
defaultの環境変数
通常、必要な.env.local
は1つですが、環境ごと(develop(next dev)
やproduction(dev start)
)に.env
を切り替えたい場合があります
Next.jsでは、.env(すべての環境)
、.env.development(開発環境)
、および.env.production (実稼働環境)
を利用して各環境のdefaultを設定できます。
優先順位としては.env.local
が上になるので常にdefaultの設定を上書きします。
Note
.env
、.env.development
、.env.production
についてはdefault定義なのでgitに含めたほうが良いです。
.env*.local
については役割としてはシークレットキーなどを書く事を想定しているため、git管理の対象から外すために.gitignore
に追加しましょう
環境変数の読み込み順
環境変数は次の順番に検索して最初に見つかった値を使います
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
の値が優先されます。
Note
NODE_ENV
に利用できるのはproduction
、development
、test
の3つです。
まとめ
今回は自分が現状使う部分だけを翻訳して書き残しました。
Vercelの場合の設定や、テスト環境での使い方に関してはまた別途時間のあるときに
Discussion