react-hot-loaderを最新版にアップデートしようとして右往左往したメモ
完全に右往左往した時のメモなので脈絡がないです.
Appコンポーネントが別ファイルに分けられてなくて警告が出ていました. それを直したかったのです.
gaearon/react-hot-loader: Tweak React components in real time. を読んで, どうせ構造を変えるなら最新版準拠にしたいなと思いました.
react-hot-loaderを4.8.4にして,
import { hot } from 'react-hot-loader/root';
import { connect } from 'react-redux';
import Routing from 'Routing';
const App = connect(Routing);
export default hot(App);
と書いて,
(なんかconnectをdefaultでimport
しててそれ忘れて1時間ぐらいハマりました…)
エントリーポイントに
import App from 'App';
として読み込みます.
Uncaught Error: You must pass a component to the function returned by connect. Instead received {}
で動きません.
patchがreact-domに当たってないという警告は
yarn add react-dom@npm:@hot-loader/react-dom
で解決しました.
公式ドキュメントやネットの情報は4のmodule
を使う方法どころか3のAppContainer
を使うことを前提の情報で全く参考にならない.
公式ドキュメントが参考にならないってどうなんですか…
公式サンプルもmodule
を使う方法で参考になりません.
3
に書かれている
or import 'react-hot-loader' in your main file (before React)
を試してもうまくいきません.
App
をユーザのコンポーネントだから最後にimport
しているのが良くないのか?
と思ったので一番上に持っていきます.
関係なくダメですね.
2番めの
or have at least one variable in the same file (babel/webpack plugin would import react-hot-loader then)
を試してみましょう. ダメでした.
or prepend your webpack entry point with react-hot-loader/patch, which will import 'react-hot-loader', and nothing more.
を試してみましょう.
エラーも表示されなくなりましたが, 何も表示されなくなりましたね.
わからないのでソースを見ます.
react-hot-loader/hot.dev.js at master · gaearon/react-hot-loader
hot
も結局内部でAppContainer
を使っていることがわかりました.
よくわかりませんがこれが
Keep in mind - the same rule is applied to react-dom, as long as it would (since 16.8.6) import react internally. React-hot-loader, to prevent dependency cycles(#1209), caused by the code it injects, should be imported first.
というやつなんですかね.
しかし対処はimport
を最初にするなどでしていると思うんですが…
各エントリーポイントにimport
を配置するのではなく,
webpackのrulesに書き加える方法を試してみましょう.
なんかreact-hot-loaderが発狂して
TypeError: Cannot read property 'indexOf' of undefined
とかいうのが出てきましたね.
原因はconnectの再定義がアプリケーションでされてることでした. ずっとハマっていて再定義されていないものを読み込んでいました. これを正しくimportすることで無問題になりました.