Nuxt3のruntimeConfigで環境変数を設定する

code on a screen NuxtJS
Photo by Markus Spiske on Pexels.com
この記事は約4分で読めます。

はじめに

nuxt3には、実行時に設定値をロードするための仕組みとしてruntimeConfigというものがある。コンポーネント内からはuseRuntimeConfigや$configで値にアクセスすることができる。サーバサイド(private)、クライアントサイド(frontend)で公開範囲を区別することもできる。本記事では、runtimeConfigの設定方法と使い方についてざっと整理する。

privateとpublic configuration

runtimeConfigの下に定義されているプロパティはprivate、publicやappブロックに定義された値はfrontendに公開される。

import { defineNuxtConfig } from "nuxt";

export default defineNuxtConfig({

  runtimeConfig: {
    apiKey: process.env.API_KEY, // private
    public: {
      frontendConfig: process.env.PUBLIC_FRONTEND_CONFIG, // frontendに公開
    },
    // app: { } // 内部nitro rendererで自動定義 frontendに公開
  },
});

.envからの定義を渡す

nuxt.config.tsのruntimeConfigに定義することで利用できるが、よくやる方法として、.envに定義した値をruntimeConfigにセットするというアプローチがあるだろう。以下のような感じだ。

import { defineNuxtConfig } from "nuxt";

export default defineNuxtConfig({
  runtimeConfig: {
    apiKey: process.env.API_KEY,
    public: {
      frontendConfig: process.env.PUBLIC_FRONTEND_CONFIG,
    },
  },
});

この方法でも問題ないが、毎回.envの値をruntimeConfigにセットしない方法もある。次に、.envの特定の値を動的にruntimeConfigに反映する例を見てみる。

.envからの定義を動的に渡す

.envに特定のプリフィックスNUXT_またはNITRO_をつけた値は、runtimeConfigに定義されていればruntimeConfigに動的に設定されるようになっている。なお、この際runtimeConfigのjson構造の階層と合わせてやる必要がある。具体的な例を見てみる。

NUXT_API_KEY=nuxtApiKey
NUXT_PUBLIC_FRONTEND_CONFIG=nitroFrontendConfig

この定義を動的に読み込むためのnuxt.config.tsは以下のようになる。

import { defineNuxtConfig } from 'nuxt'

// https://v3.nuxtjs.org/docs/directory-structure/nuxt.config
export default defineNuxtConfig({
  runtimeConfig: {
    apiKey: '',  // 定義していると上書きされる
    public: {
      frontendConfig: '' // 定義していると上書きされる
    }
  }
}

コンポーネントでは以下のようにアクセスできるだろう。

<template>
  <div>
    {{ $config.apiKey }}
    {{ $config.public.frontendConfig }}
  </div>
</template>

apiKeyはprivateなので見えない。frontendConfigはpublicのためフロントエンドで見える。ssrのレスポンスを見るとwindow.__NUXT__の定義のruntimeConfigプロパティとし見えるのが分かる。

NITRO_とNUXT_の両方が定義されている場合

NITRO_の優先順位が高くなっているので、両方定義されている場合はNITRO_の定義が勝つ。

NUXT_APP_API_KEY=nuxtApiKey

# NUXT_よりもNITRO_の方が優先度が高い
NITRO_PUBLIC_FRONTEND_CONFIG=nitroFrontendConfig
NUXT_PUBLIC_FRONTEND_CONFIG=nuxtFrontendConfig

独自のprefixを指定したい

NUXT_でなく、MYAPP_のような独自のprefixをつけたい場合は、以下のようにnitroのenvPrefixを書き換える。

import { defineNuxtConfig } from "nuxt";

export default defineNuxtConfig({
  runtimeConfig: {
    apiKey: process.env.API_KEY,
    public: {
      frontendConfig: "",
    },
    nitro: {
      envPrefix: "MYAPP_",
    },
  },
});

参考リンク

 

コメント

タイトルとURLをコピーしました