ESMのNode環境でのdotenvの扱い方📝

dotenvをinstallしているのに、エラーが発生する問題の解決方法
// Error発生
// モジュール '"/server/node_modules/dotenv/lib/main"' に既定エクスポートがありません。
import dotenv from "dotenv";
Node.js (またはTypeScript) の環境によっては、 dotenv が CommonJS 形式で書かれていることから「デフォルトエクスポートがありません」というエラーが発生する場合があります。
これは、ESM (ECMAScript Modules) や TypeScript の設定によって import dotenv from 'dotenv' という書き方がそのままでは使えないことが原因です。
解決策1: dotenv を最新バージョンにアップデートする
まずは、dotenvが古いバージョンのままになっていないかを確認してください。
dotenvの v16.x 以降では、export default
が使えるようになっています。
npm install dotenv@latest
もし古いバージョンを使っていると、default export が定義されていないためにエラーが出ることがあります。
import * as dotenv from 'dotenv'
と書く
解決策2: TypeScript や ESM で "default export が無い" と警告される場合には、名前付きのすべてのエクスポートを読み込む形にするとエラーを回避できることが多いです。
import * as dotenv from 'dotenv';
dotenv.config();
上記のようにすることで、dotenv
オブジェクトをまるごと読み込み、その上で dotenv.config()
を呼び出すことができます。
import 'dotenv/config'
を使う
解決策3: dotenv には、設定を自動的に読み込むためのショートハンドがあります。
モジュールを「まるごと」ではなく「設定用スクリプト」として読み込むイメージです。
import 'dotenv/config';
// これだけで .env が読み込まれ、
// process.env.XXX にアクセスできるようになる
追加の変数宣言なしで使えるので、簡易的な用途やちょっとしたスクリプトには便利です。
解決策4: TypeScript の設定を変更する
TypeScript を使っている場合に、import dotenv from 'dotenv'
をそのまま利用したい場合は、tsconfig.json で次のオプションを有効化します。
{
"compilerOptions": {
"esModuleInterop": true, // <-- これを true にする
"allowSyntheticDefaultImports": true // <-- またはこれを true にする
// ...その他の設定
}
}
上記の設定が有効になっていないと、default export のない CommonJS モジュールを import x from '...'
の形で読み込めずにエラーが出てしまいます。
まとめ
- まずはdotenvを 最新版 (v16.x 以降) にアップデートする。
- それでもエラーが出る場合は、
import * as dotenv from 'dotenv'
とするか、import 'dotenv/config'
を使う。 - TypeScript 環境なら
esModuleInterop
とallowSyntheticDefaultImports
を有効にしておくとスムーズ。
このあたりの対応を行うと、エラーなく dotenv を ESM/TypeScript で利用できるようになります。