react-isのバージョンには要注意


react-isのバージョン管理に失敗して、いろいろなトラブルに巻き込まれてしまいました。

TL; DR

  • react-isのバージョンは、reactのバージョンと一致させる必要あり
  • ただし、自動では保証されない
  • yarnでバージョンダウンを行うのは、想像以上に面倒

react-isって?

自分の記事で以前に触れましたが、あるオブジェクトが「Reactのコンポーネントかどうか」、そして「どのような種類のコンポーネントか」を、オブジェクトの内部構造に直接触らずに判定できるツール群です。

トラブルの状況

React 16.9からdeprecatedの警告が強化されて、ライブラリとして入れているコンポーネントまで警告されるようになってしまったので、いったんreactraect-dom"^16.8.6 <16.9.0"で止めることにしました。一方で、react-isは何の条件もかけずに放置していたら、16.12.0ぐらいまで上がっていました。

その結果、React.memoしたコンポーネントの判定ができない状態に陥ってしまいました。いろいろ調べるうちに、reactreact-isのバージョンの違いが問題だと思いあたりました。特にpeerDependencyなどもかかっていなかったので、ずれても何も警告されませんでした。

戻すのも一苦労

ということで、package.json"react-is": "^16.8.6 <16.9.0"と条件を明記して再インストールしたのですが、すでに16.12.0が入っていて、しかもprop-typesなどreact-isに依存したライブラリがほかにもあったために、依存したライブラリには16.12.0が別途で入ってしまうという、ものすごく面倒な事態に陥ってしまいました。

yarn upgradeを行っても解決せず、結局「yarn.lockの直接書き換え」「node_modulesの全消去」など強引な手段をとって、どうにか全部を16.8.6に統一することに成功しました。