ys memos

Blog

reactのinvalid hook callエラー


react

2021/10/16


コンポーネントを含む自作ライブラリを npm に公開しようとして,ローカルインストールをした.

それを実行しようとしたところ,下に載せるエラーが発生した.

おそらく,ローカルインストールをしておらず同様のエラーが出た場合は,エラー文に記載のとおりにReact 公式ページを参考にするのが良いと思われる.


  1. npm packによりパッケージング
  2. npm installでプロジェクトディレクトリではなくxxx.tgzをインストール

まず前提として,npm intsallでディレクトリパスを指定すると,該当ディレクトリのpackage.jsonにある情報を元にローカルインストールされる.

$ npm install ./dir

このインストール方法を使って,React コンポーネントを含むライブラリをインストールし,アプリを起動しようとしたところ,以下のエラーが出た.

Error: Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:
1. You might have mismatching versions of React and the renderer (such as React DOM)
2. You might be breaking the Rules of Hooks
3. You might have more than one copy of React in the same app
See https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.

「2 つの React」となっていることが問題である.

以下簡単のため,自作したライブラリをライブラリ,ライブラリをインストールして使うアプリをアプリと呼ぶことにする.

「2 つの React」とは,react library が2つ存在していることを意味しているようである.

上述したローカルインストールの方法の挙動を調べてみた.方法としては, 1)通常のインストールの import 元を確認, 2)npm install ./dirの import 元を確認をした.

2点の確認の結果が以下となった.

  1. ~/node_modules/xxx
  2. ./dir/dist (ちなみに,package.jsonには./distをパスにするよう設定してある)

この結果を踏まえると,~/node_modules/以下に直接インストールされるわけではなく,参照しているようである.

この時,./dir/distにあるファイルの import が./dir/node_modulesなのではないか.

以上が,問題点の分析となった.


npm linkという方法もあるようだが,これによる解決が根本的な解決には思えなかったため,別の方法を模索した(参考).

npm linkによって,インストール先をアプリと一致させることで,「2 つの React」問題を解消するという内容であった.


ライブラリを参照じゃないインストールすることが問題解決のための目的となる.

npm packを使うと,xxx.tgzという名前でパッケージングされる.

そして,そのxxx.tgzをインストールする.

$ npm install ./dir/xxx.tgz

package.json内のインストール情報としては,file:./dir/xxx.tgzとなるが,import 元は./node_modules/xxxとなっており,おそらく,xxx.tgz./node_modules/直下にモジュールを展開しているようである.

エラーが出ずに望まれる挙動だったということは,「2 つの React」状態が解消したため,同じreactを import できている事になるようだ.


StackOverflow や Github の React リポジトリの Issue には同じ解放がなかったのだが,npm packにたどり着けてよかった.

これで,npm パッケージ開発が捗りそうである.


関連タグを探す