ランタイム設定
Nuxtは、アプリケーション内で設定と秘密情報を公開するためのランタイム設定APIを提供します。
公開
アプリの他の部分に設定と環境変数を公開するには、nuxt.configファイルでruntimeConfigオプションを使用してランタイム設定を定義する必要があります。
export default defineNuxtConfig({
runtimeConfig: {
// サーバーサイドでのみ利用可能な秘密鍵
apiSecret: '123',
// public内のキーはクライアントサイドにも公開されます
public: {
apiBase: '/api'
}
}
})
runtimeConfig.publicにapiBaseを追加すると、Nuxtはそれを各ページのペイロードに追加します。apiBaseはサーバーとブラウザの両方で普遍的にアクセスできます。
const runtimeConfig = useRuntimeConfig()
console.log(runtimeConfig.apiSecret)
console.log(runtimeConfig.public.apiBase)
パブリックランタイム設定は、Vueテンプレート内で$config.publicとしてアクセスできます。
シリアライズ
ランタイム設定は、Nitroに渡される前にシリアライズされます。つまり、シリアライズおよびデシリアライズできないもの(関数、Set、Mapなど)は、nuxt.configに設定しないでください。
シリアライズできないオブジェクトや関数をnuxt.configからアプリケーションに渡す代わりに、このコードをNuxtまたはNitroのプラグインやミドルウェアに配置できます。
環境変数
設定を提供する最も一般的な方法は、環境変数を使用することです。
Nuxt CLIは、開発、ビルド、生成時に.envファイルを読み込むためのサポートを組み込んでいます。しかし、ビルドされたサーバーを実行するときは、.envファイルは読み込まれません。
ランタイム設定の値は、実行時に一致する環境変数によって自動的に置き換えられます。
2つの重要な要件があります:
-
目的の変数は
nuxt.configに定義されている必要があります。これにより、任意の環境変数がアプリケーションコードに公開されないようにします。 -
特別に名前付けされた環境変数のみがランタイム設定プロパティを上書きできます。つまり、
NUXT_で始まり、キーとケースの変更を_で区切る大文字の環境変数です。
runtimeConfigの値のデフォルトを異なる名前の環境変数(例えば、myVarをprocess.env.OTHER_VARIABLEに設定する)に設定すると、ビルド時にのみ機能し、実行時には壊れます。
runtimeConfigオブジェクトの構造に一致する環境変数を使用することをお勧めします。
Alexander Lichterによるランタイム設定の使用における開発者の最も一般的なミスを紹介するビデオを視聴してください。
例
NUXT_API_SECRET=api_secret_token
NUXT_PUBLIC_API_BASE=https://nuxtjs.org
export default defineNuxtConfig({
runtimeConfig: {
apiSecret: '', // NUXT_API_SECRET環境変数で上書き可能
public: {
apiBase: '', // NUXT_PUBLIC_API_BASE環境変数で上書き可能
}
},
})
読み取り
Vueアプリ
NuxtアプリのVue部分内でランタイム設定にアクセスするには、useRuntimeConfig()を呼び出す必要があります。
クライアントサイドとサーバーサイドで動作が異なります:
-
クライアントサイドでは、
runtimeConfig.publicとruntimeConfig.app(Nuxtが内部で使用する)のキーのみが利用可能で、オブジェクトは書き込み可能でリアクティブです。 -
サーバーサイドでは、ランタイム設定全体が利用可能ですが、コンテキストの共有を避けるために読み取り専用です。
<script setup lang="ts">
const config = useRuntimeConfig()
console.log('ランタイム設定:', config)
if (import.meta.server) {
console.log('APIシークレット:', config.apiSecret)
}
</script>
<template>
<div>
<div>開発者コンソールを確認してください!</div>
</div>
</template>
セキュリティ注意: ランタイム設定キーをクライアントサイドに公開しないように注意してください。レンダリングしたり、useStateに渡したりしないでください。
プラグイン
カスタムプラグイン内でランタイム設定を使用したい場合は、defineNuxtPlugin関数内でuseRuntimeConfig()を使用できます。
export default defineNuxtPlugin((nuxtApp) => {
const config = useRuntimeConfig()
console.log('APIベースURL:', config.public.apiBase)
});
サーバールート
サーバールート内でもuseRuntimeConfigを使用してランタイム設定にアクセスできます。
export default defineEventHandler(async (event) => {
const { apiSecret } = useRuntimeConfig(event)
const result = await $fetch('https://my.api.com/test', {
headers: {
Authorization: `Bearer ${apiSecret}`
}
})
return result
})
useRuntimeConfigに引数としてeventを渡すことはオプションですが、サーバールートで実行時に環境変数によってランタイム設定が上書きされるようにするために渡すことをお勧めします。
ランタイム設定の型定義
Nuxtは、提供されたランタイム設定から自動的にTypeScriptインターフェースを生成しようとしますが、unjs/untypedを使用して手動でランタイム設定を型定義することも可能です。
declare module 'nuxt/schema' {
interface RuntimeConfig {
apiSecret: string
}
interface PublicRuntimeConfig {
apiBase: string
}
}
// 型を拡張する際には、何かをインポート/エクスポートすることを常に確認することが重要です
export {}
nuxt/schemaは、エンドユーザーがプロジェクトでNuxtが使用するスキーマのバージョンにアクセスするための便宜として提供されています。モジュールの作成者は代わりに@nuxt/schemaを拡張するべきです。
tips
このセクションは公式ドキュメントの翻訳ではなく、本サイト独自の補足記事です。
はじめに:ランタイム設定がもたらす利便性と課題解決
Nuxtのランタイム設定は、アプリケーションの設定値や秘密情報を安全かつ柔軟に管理できる仕組みです。環境変数を直接コードに埋め込むのではなく、runtimeConfigを使うことで、ビルド時ではなく実行時に設定を切り替えられます。これにより、開発・ステージング・本番環境で異なる設定を簡単に適用でき、セキュリティ面でもクライアントに公開すべきでない情報を守ることが可能です。
しかし、便利な反面、使い方を誤るとクライアントに秘密情報が漏れたり、SSRとCSRの挙動の違いでバグが発生したりすることもあります。この記事では、Nuxtのランタイム設定の基本から実務での活用例、注意すべきポイントまでを丁寧に解説します。
まず結論:ランタイム設定の要点まとめ
runtimeConfigはサーバー専用の秘密情報とクライアントにも公開する設定を分けて管理できる- 環境変数は
NUXT_プレフィックス付きで定義し、nuxt.configのruntimeConfigに対応させる必要がある - クライアント側でアクセスできるのは
runtimeConfig.publicのみで、サーバー側は全体を読み取り専用で利用可能 useRuntimeConfig()を使ってVueコンポーネントやプラグイン、サーバールートから設定を取得できる- シリアライズできない値(関数やMapなど)は設定に含められず、プラグインやミドルウェアで管理するのが望ましい
- 秘密情報を誤ってクライアントに渡さないように注意が必要
いつ使うべきか?使わない方がよいケース
使うべきケース
-
環境ごとに異なるAPIキーやURLを切り替えたいとき
例:開発環境はテストAPI、本番環境は本物のAPIを使う場合など -
秘密情報をクライアントに公開せずサーバー側で安全に扱いたいとき
例:APIのシークレットキーや認証トークン -
ビルド時ではなく実行時に設定を変更したいとき
例:Dockerコンテナの環境変数で設定を差し替える場合
使わない方がよいケース
-
頻繁に変更される動的な設定を管理したい場合
ランタイム設定はアプリ起動時に読み込まれるため、動的な変更には向きません。DBや外部APIから取得する方法が適切です。 -
クライアント側で秘密情報を使いたい場合
セキュリティ上のリスクが高いため、秘密情報はクライアントに渡さない設計が推奨されます。
実務でよくあるユースケースとサンプルコード
1. APIのベースURLを環境ごとに切り替える
// nuxt.config.ts
export default defineNuxtConfig({
runtimeConfig: {
public: {
apiBase: '' // 環境変数 NUXT_PUBLIC_API_BASE で上書き可能
}
}
})
// .env
NUXT_PUBLIC_API_BASE=https://api.example.com
const config = useRuntimeConfig()
const apiUrl = config.public.apiBase
2. サーバー側でAPIシークレットを安全に利用する
// nuxt.config.ts
export default defineNuxtConfig({
runtimeConfig: {
apiSecret: '' // 環境変数 NUXT_API_SECRET で上書き可能
}
})
// server/api/data.ts
export default defineEventHandler(async (event) => {
const config = useRuntimeConfig(event)
const secret = config.apiSecret
const data = await $fetch('https://secure.api.com/data', {
headers: { Authorization: `Bearer ${secret}` }
})
return data
})
3. プラグインでランタイム設定を利用して初期化処理を行う
// plugins/init.ts
export default defineNuxtPlugin(() => {
const config = useRuntimeConfig()
console.log('APIベースURL:', config.public.apiBase)
// ここでAPIクライアントの初期化などを行う
})
よくある落とし穴・注意点
1. クライアントに秘密情報を誤って公開しない
runtimeConfigのpublic以外のキーはクライアントに送られませんが、テンプレートやuseStateに秘密情報を渡すとクライアントに漏れる可能性があります。必ずサーバー側だけで利用してください。
2. SSRとCSRでの挙動の違いに注意
- サーバー側では
runtimeConfig全体が読み取り専用で利用可能 - クライアント側では
runtimeConfig.publicのみが利用可能で、リアクティブかつ書き換え可能
この違いを理解せずにコードを書くと、クライアントで存在しないキーにアクセスしてエラーになることがあります。
3. シリアライズできない値は設定に含めない
関数やMap、SetなどはJSONに変換できないため、runtimeConfigに直接設定できません。こうした値はプラグインやミドルウェアで管理しましょう。
4. 環境変数の命名規則を守る
runtimeConfigの値を環境変数で上書きするには、NUXT_プレフィックスを付け、大文字かつアンダースコア区切りで指定する必要があります。これを守らないと実行時に反映されません。
5. .envファイルはビルド時のみ読み込まれる
開発やビルド時は.envファイルが読み込まれますが、ビルド後のサーバー起動時には読み込まれません。実行環境の環境変数設定が必須です。
まとめ
Nuxtのランタイム設定は、環境ごとに異なる設定や秘密情報を安全に管理できる強力な機能です。runtimeConfigを正しく使うことで、開発効率が上がり、セキュリティリスクも低減できます。ただし、SSR/CSRの違いや環境変数の命名規則、シリアライズ制限などのポイントを理解しないとトラブルの原因になるため、この記事の内容を参考に実務での活用を進めてください。
ランタイム設定はNuxtのコア機能の一つなので、公式ドキュメントと合わせてこの記事のポイントを押さえ、安心して使いこなせるようにしましょう。
※このページは Nuxt.js 公式ドキュメントの翻訳ページです。
公式ドキュメントの該当ページはこちら:
https://nuxt.com/docs/3.x/guide/going-further/runtime-config