Skip to content

ERR_PACKAGE_PATH_NOT_EXPORTED エラーの解決

この記事では、Node.js アプリケーションで発生する ERR_PACKAGE_PATH_NOT_EXPORTED エラーの原因と解決策について詳しく説明します。

問題の内容

Node.js v17以降でReactアプリケーションを実行しようとすると、以下のエラーが発生することがあります:

bash
Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath './lib/tokenize' is not defined by "exports" in /path/to/node_modules/postcss-safe-parser/node_modules/postcss/package.json

このエラーは、パッケージの内部モジュールへのパスが、そのパッケージのpackage.jsonexportsフィールドで明示的にエクスポートされていない場合に発生します。

主な原因

このエラーの主な原因は以下の3つです:

  1. Node.jsのバージョン互換性: Node.js v17以降で導入されたES Modulesの厳格なエクスポート検証
  2. パッケージの古いバージョン: 互換性のない古いバージョンの依存パッケージ
  3. 不正なインポートパス: 非公開APIへの直接的なインポート

解決策

1. Node.jsのバージョンダウングレード(一時的な解決策)

Node.js v17+ から v16 LTS(長期サポート版)に変更する:

bash
# 現在のNode.jsをアンインストール
nvm uninstall <current-version>

# Node.js v16 LTSをインストール
nvm install --lts

# または特定のバージョンをインストール
nvm install 16.18.0

# インストールしたバージョンを使用
nvm use 16.18.0
bash
# 現在のNode.jsをアンインストール
brew uninstall --ignore-dependencies node

# Node.js v16をインストール
brew install node@16

# リンクを設定
brew link node@16 --force
bash
# nをインストール
npm install -g n

# Node.js v16 LTSをインストール
sudo n 16

WARNING

バージョンダウングレードは一時的な解決策です。長期的には最新のNode.jsに対応した解決策を実施してください。

2. 依存関係のクリーンインストール

node_modulesとロックファイルを削除して再インストール:

bash
# キャッシュのクリーン
npm cache clean --force

# node_modulesとpackage-lock.jsonを削除
rm -rf node_modules package-lock.json

# 依存関係を再インストール
npm install
bash
# node_modulesとyarn.lockを削除
rm -rf node_modules yarn.lock

# 依存関係を再インストール
yarn install

3. パッケージの更新

問題のあるパッケージを最新バージョンに更新:

bash
# react-scriptsを最新版に更新
npm install react-scripts@latest

# または特定のパッケージを更新
npm install postcss@latest resolve-url-loader@^5.0.0

4. レガシーOpenSSLプロバイダーの有効化

Node.js v17+ でOpenSSL関連の問題が発生する場合:

bash
# 環境変数を設定して実行
export NODE_OPTIONS=--openssl-legacy-provider
npm start

または、package.jsonのスクリプトを変更:

json
{
  "scripts": {
    "start": "NODE_OPTIONS=--openssl-legacy-provider react-scripts start"
  }
}

根本的な解決策

1. インポートパスの修正

非公開APIへの直接インポートを避け、公開APIを使用する:

js
// 非公開パスへの直接インポート
import { log, error } from 'firebase-functions/lib/logger';
import { renderToString } from 'react/server.js';
import { Kysely } from 'kysely/dist/esm';
js
// 公開APIを使用
import { log, error } from 'firebase-functions/logger';
import { renderToString } from 'react-dom/server';
import { Kysely } from 'kysely';

2. 依存関係の最新化

プロジェクトの主要依存関係を更新:

bash
# Reactプロジェクトの場合
npm install react@latest react-dom@latest react-scripts@latest

# Next.jsプロジェクトの場合
npm install next@latest react@latest react-dom@latest

予防策

  1. Node.jsのLTSバージョンを使用: プロダクション環境では常にLTSバージョンを使用する
  2. 定期的な依存関係更新: npm outdatedで古いパッケージを定期的に確認
  3. CI/CD環境の統一: 開発環境と本番環境で同じNode.jsバージョンを使用
  4. .nvmrcファイルの使用: プロジェクトごとに使用するNode.jsバージョンを明示
bash
16.18.0

まとめ

ERR_PACKAGE_PATH_NOT_EXPORTEDエラーは、主にNode.jsのバージョン互換性問題によって発生します。一時的な解決策としてNode.jsのバージョンダウングレードも有効ですが、長期的にはパッケージの更新と正しいインポート方法の使用が推奨されます。

最新の開発環境では、Node.jsのLTSバージョンを使用し、依存関係を定期的に更新することで、このような問題を予防できます。