2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Nuxt3:pluginsで.env(環境変数)の値を参照する方法

Last updated at Posted at 2024-01-09

目次

1. 記事概要

この記事はvercelでNuxt3のプロジェクトをデプロイした時に、
/pluginsにある.tsから環境変数を参照することができなかった時に調べたメモです。

2. 結論

/pluginsから環境変数を参照したい場合は以下のことを行ってください。
※確証はないですがvercelだからではなくどの本番環境でも同じだと思います。

nuxt.config.tsに以下のコードを加える
※当たり前のことですが、.NEXT_PUBLIC_CONTENTFUL_SPACE_IDの部分は自由です!

nuxt.config.ts
export default defineNuxtConfig({
  runtimeConfig: {
    public: {
      contentfulSpaceId: process.env.NEXT_PUBLIC_CONTENTFUL_SPACE_ID,
      contentfulAccessToken: process.env.NEXT_PUBLIC_CONTENTFUL_ACCESS_TOKEN,
    },
  },
  // ここから下は省略
.env
NEXT_PUBLIC_CONTENTFUL_ACCESS_TOKEN='sample'
NEXT_PUBLIC_CONTENTFUL_SPACE_ID='testtest'

puluginsからは次のように呼び出す

/plugins/contentful.ts
export default defineNuxtPlugin(() => {
    const configContentful = useRuntimeConfig();
    
    const test: CreateClientParams = {
        space: configContentful.public.contentfulSpaceId,
        accessToken: configContentful.public.contentfulAccessToken,
        // publicはなくても大丈夫、configContentful.contentfulAccessToken
    };
});

3. 疑問解消の調査

process.env.で実行するとlocalでもvercel上でも500エラーがでるはずです。
なので環境変数を別の方法で参照する必要があります。

/plugins/contentful.ts
// エラー
const test: CreateClientParams = {
    space: process.env.NEXT_PUBLIC_CONTENTFUL_SPACE_ID, 
    accessToken: process.env.NEXT_PUBLIC_CONTENTFUL_ACCESS_TOKEN, 
};

実行したときの画面
qiita_500エラー.png

疑問解消の1つ目の参考文献としてStackOverflow[1]に解決に至った質問がありました。
ここからさらにいくつか[2][3][4]のサイトをたどりなんとなく疑問がはれたことを書いていきます。

まず最初に、pluginsが呼ばれるのがライフサイクル的にだいぶはやそうなのがポイントだと思いました。

1 v-pnTrIP-Kq29k52BIGp8g.png

pluginsにある.tsはライフサイクル中(ビルド中)に環境変数を参照する必要がありそうです。
ただ公式[2]にこのような記述がありました。

In production runtime, you should use platform environment variables and .env is not used.

本番のランタイムでは.envは直接参照できないということですかね?
なので本番ランタイム中に環境変数を参照するには、nuxt.config.tsruntimeConfigにpluginsで使用する環境変数を設定しておく必要があるという認識で落ち着きました。

4. 最後に

とりあえずのメモとして記事にしただけなのでまだ理屈などは分かってない状態です。
分かっていないこととして下記部分、privateと書くとserver側しか参照することができなくなりAPI tokenなどを保存するにはよさそうです。
しかし、pluginsからprivateの値を参照するとエラーがでてしまいました。
ここら辺の方法もわかり次第追記していきたいと思います。

nuxt.config.ts
export default defineNuxtConfig({
  runtimeConfig: {
    public: {
      // クライアントとサーバー側で参照できる
    },
    private: {
      // サーバー側でしか参照できない
      contentfulSpaceId: process.env.NEXT_PUBLIC_CONTENTFUL_SPACE_ID,
      contentfulAccessToken: process.env.NEXT_PUBLIC_CONTENTFUL_ACCESS_TOKEN,
    }
  },
  // ここから下は省略

5. 参考文献

  1. "How to use .env variables in Nuxt 2 or 3?,"https://stackoverflow.com/questions/67703133/how-to-use-env-variables-in-nuxt-2-or-3/67705541#67705541 , (Access. 2024-01-09).
  2. "useRuntimeConfig," https://nuxt.com/docs/api/composables/use-runtime-config#useruntimeconfig , (Access. 2024-01-09).
  3. "Runtime Config," https://nuxt.com/docs/guide/going-further/runtime-config , (Access. 2024-01-09).
  4. "nuxt-community/gtm-module," https://github.com/nuxt-community/gtm-module#runtime-config , (Access. 2024-01-09).
2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?