🐞
pnpmでModule No exported member や Cannot find moduleが出る場合
Answer
結論から言うと、おそらくですが.npmrcに以下を追記すると解決します。
public-hoist-pattern[]=<package-name>*
あるいは最終方法としてshamefully-hoist=true
を設定します。
これらの設定はパターンにマッチする(あるいは全ての)パッケージをnode_modules直下にリンクするように指定しています。
shamefully-hoist を true に設定するのと public-hoist-pattern を * に設定するのは同じ効果があります
cause
これも推測になるのですが恐らくインストールしようとしてるライブラリがモノレポ構成になっているためだと思われます。
pnpmはpackage.jsonのdependencies(とdevDependencies?)に記載されているものしかnode_modules直下にリンクを張りません。
そのため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