Open1

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 が定義されていないためにエラーが出ることがあります。


解決策2: import * as dotenv from 'dotenv' と書く

TypeScript や ESM で "default export が無い" と警告される場合には、名前付きのすべてのエクスポートを読み込む形にするとエラーを回避できることが多いです。

import * as dotenv from 'dotenv';

dotenv.config();

上記のようにすることで、dotenv オブジェクトをまるごと読み込み、その上で dotenv.config() を呼び出すことができます。


解決策3: import 'dotenv/config' を使う

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 環境なら esModuleInteropallowSyntheticDefaultImports を有効にしておくとスムーズ。

このあたりの対応を行うと、エラーなく dotenv を ESM/TypeScript で利用できるようになります。