Hono + Bun
TypeScriptでアプリケーションを作成する際、環境変数の読み込みについては毎回困るので対応方法についてメモしてみました
フレームワーク | 環境変数 | ファイル | 備考 |
---|---|---|---|
Bun | process.env | .env | - |
Cloudflare Workers | c.env | .dev.vars | - |
Vite | import.meta.env | .env | VITE_ のプレフィックスが必要 |
Node | process.env | .env | dotenvが必要 |
Vite
Viteでの環境変数の読み込みについてのドキュメントによるとViteでは環境変数をimport.meta.env
で読み込み、更にそれぞれの環境変数はVITE_
のプレフィックスがついている必要があります。
内部的にはdotenv
が利用されているらしいので、追加でdotenv
をインストールする必要はありません。
Node.js
Node.jsではそのまま環境変数を読み込むことが出来ないのでdotenv
をインポートする必要があります。
使い方に関してはレポジトリのREADME.mdを読んでください。
Bun
Bunではドキュメントによれば何もしなくても.env
が読み込まれます。Viteのようなプレフィックスも不要です。
process.env
で読み込むことが出来ますがエイリアスがあるのでBun.env
としても読み込めます。
Cloudflare Workers
Cloudflare Workers + Honoの環境ではContext
と呼ばれる仕組みを利用してc.env
で環境変数にアクセスできます。
更にBindings
の仕組みを使うことで本来環境変数を読み込むと型がstring | undefined
になってしまうのですが、値が存在することを保証させることができます。
API_KEY=XXXXXXXX
というような文字列を.dev.vars
に書き込みます。
type Bindings = {
API_TOKEN: string
}
const app = new Hono<{ Bindings: Bindings }>()
のような感じで利用できます。これについてはHonoの公式ドキュメントが充実しているのでそちらを読んでみるとよいでしょう。
結論
で、今回はCloudflare Workersは使わないけどHonoもBunも使う状況でBindings
を利用して環境変数をちゃんと読み込みたいという需要に対する解決策を提案します。
Cloudflare Workersを使っていない場合(bun wrangler dev src/index.ts
のように実行していない場合)は.dev.vars
を読み込まないのでc.env
とやっても環境変数を読み込むことは出来ません。
Bunを使っていればBun.env
で読み込めますがstring | undefined
になってしまいます。
app.use('*', async (c: Context, next) => {
c.env = { ...process.env }
await next()
})
で、早いですが結論から言うと上のコードをsrc/index.ts
に書き込みます。
するとprocess.env
の中身がc.env
にマージされます。
こうしたうえでBindings
を正しく設定することでc.env.API_TOKEN
がundefined
にならずに取得することができます。
最後に
わかってしまえば簡単でした。記事は以上。