環境変数に型を付与しよう!
はじめに
皆さんは、Next.js で env ファイルを使用していて、process.env
の後に env ファイルの環境変数を候補として出してほしいと感じたことはありませんか?
型を付与する方法を調べていたら、良さげなライブラリを見つけたので紹介します。
こちらの記事でおすすめされていました。
問題点
まずなにも使わずに、env ファイルを使用した際の問題点を挙げていきます。
- 型が
string | undefined
になるこのように定義した環境変数に string のメソッドを使用します。NEXT_PUBLIC_TITLE=hoge
となってしまいます。const hoge = process.env.NEXT_PUBLIC_TITLE; console.log(hoge.toUpperCase()); // 'test' は 'undefined' の可能性があります。
- タイポに気づけない
process.env.NEXT_PUBLIC_TITL
とタイポをしてしまった場合に、気づくことができません。 - env ファイルに間違った値を設定してしまう
例えば、http://localhost
とたいのにhttp//localhost
と:
を忘れてしまっていても、気づくことができません。
解決方法
これらの問題を解決するために、T3 Envというライブラリを使用します。
使い方
まずはインストールをします。
yarn add @t3-oss/env-nextjs zod
他にも@t3-oss/env-core zod
でもインストールができるのですが、Next.js
で使いやすいように設定された@t3-oss/env-nextjs
というものが存在するのでそちらをインストールします。そして、同時にzod
もインストールしています。
zod とは
zod
とは TypeScript ファストのスキーマ宣言、バリデーションライブラリです。
使い方としては、
import { z } from "zod";
const name = z.string();
このようにスキーマを宣言し、
name.parse("tanaka");
name.parse(1);
バリデーションを行います。name は string 型としてスキーマを宣言したので、number 型を渡すとエラーになります。
とりあえず○○.string()
や○○.number()
でバリデーションができると思っておけばよいです。
説明に戻ります。
まずは env ファイルを作成します。
DATABASE_URL=http://localhost3000
NEXT_PUBLIC_NAME=tanaka
次に env ファイル用のスキーマを作成しましょう。
import { createEnv } from "@t3-oss/env-nextjs";
import { z } from "zod"
export const env = createEnv({
// serverで使用するための環境変数
server: {
// urlかをバリデーションする
DATABASE_URL: z.string().url()
},
// clietnで使用するための環境変数
// Next.jsの場合NEXT_PUBLICから始める必要がある
client: {
// stringで1文字以上10文字以下
NEXT_PUBLIC_NAME: z.string().min(1).max(10),
},
// envファイルと紐づける
runtimeEnv: {
DATABASE_URL: process.env.DATABASE_URL,
NEXT_PUBLIC_NAME: process.env.NEXT_PUBLIC_NAME
}
})
それでは、使用してみましょう
import { env } from '@/env'
const Home = () => {
const name = env.NEXT_PUBLIC_NAME
console.log(name.toUperCase()) // TANAKA
return (
<h1>view</h1>
)
}
export default Home
env.
と入力した時点でenv.ts
で設定した環境変数が候補として出ています。
さらに、型が string となっています。
ためしに、env ファイルのNEXT_PUBLIC_NAME
を 10 文字より多くしたり、DATABASE_URL
の値を変えてみると、エラーとなります。
また、エラーの際、ログに詳細なエラーメッセージが表示されます。
例:NEXT_PUBLIC_NAME=tanakasatouyamada(文字数がオーバーしている)
Invalid environment variables: { NEXT_PUBLIC_NAME: [ 'String must conta in at most 10 character(s)' ] }
まとめ
以上が、T3 Env の使用方法です。
候補を出すだけでなく、url の形式に制限するなどできるので、積極的に使用していきたいですね。
使用ライブラリとそのバージョン
"@t3-oss/env-nextjs": "^0.2.2",
"zod": "^3.21.4"
参考
Discussion