🐞

pnpmでModule No exported member や Cannot find moduleが出る場合

2023/02/06に公開

Answer

結論から言うと、おそらくですが.npmrcに以下を追記すると解決します。

public-hoist-pattern[]=<package-name>*

https://pnpm.io/npmrc#public-hoist-pattern

あるいは最終方法としてshamefully-hoist=trueを設定します。

これらの設定はパターンにマッチする(あるいは全ての)パッケージをnode_modules直下にリンクするように指定しています。

shamefully-hoist を true に設定するのと public-hoist-pattern を * に設定するのは同じ効果があります

cause

これも推測になるのですが恐らくインストールしようとしてるライブラリがモノレポ構成になっているためだと思われます。

pnpmはpackage.jsonのdependencies(とdevDependencies?)に記載されているものしかnode_modules直下にリンクを張りません。

https://pnpm.io/ja/motivation

そのためnode_modules以下にリンクされたパッケージより更に下にある階層のライブラリ郡が参照できていないためだと思われます。

自分の場合はTypescript+Angular14の構成ですが、例えばpackage.jsonのdepndenciesに以下の様に記載しインポートすると、

package.json
~
~
"dependencies": {
  "firebase": "9.14.0"
}
main.ts
import { initializeApp } from 'firebase/app'

このようなエラーが出ます。

Module '"firebase/app"' has no exported member 'initializeApp'.

この状態でnode_modulesの中を探してみるとfirebaseしかないはずですが、本来npmでインストールした場合や.npmrcに前述のオプションを設定していると@firebaseが存在するはずです。

ls node_modules | grep firebase

おそらくこの問題はフレームワーク関係なくモノリポ構成になっているライブラリであれば出るような気がしています。

Discussion