Vite: HMR Cannot access before initialization
ViteのHMRで循環依存により変数が初期化前にアクセスされるエラー
概要
ViteのHot Module Replacement(HMR)使用時に、循環依存のあるモジュールでファイルを保存すると「Cannot access ‘xxx’ before initialization」エラーが発生する問題です。通常のページリロードでは動作しますが、HMRによるホットリロード時にのみ発生します。
エラーメッセージ
Uncaught ReferenceError: Cannot access 'store' before initialization
at Module.store (store.js:10:1)
at eval (Component.jsx:5:1)
または:
ReferenceError: Cannot access 'AppContext' before initialization
原因
- 循環依存: モジュールAがモジュールBをインポートし、モジュールBがモジュールAをインポートしている
- HMRのモジュール再評価順序: HMR時のモジュール再評価順序が通常の初期化順序と異なる
- Temporal Dead Zone(TDZ):
constやletで宣言された変数が初期化前にアクセスされる - Reduxのconnect()パターン: コンポーネントとストアの間で循環依存が発生しやすい
解決策
1. 循環依存を解消(推奨)
| |
2. 遅延インポートを使用
| |
3. 依存性注入パターン
| |
4. バレルファイルの見直し
| |
5. HMRを特定モジュールで無効化
| |
6. vite.config.jsでoptimizeDepsを調整
| |
7. Reduxの場合はフック経由でアクセス
| |
デバッグ方法
循環依存の検出
| |
| |
よくある間違い
- 全てのインポートをバレルファイル(index.js)経由にする
- Reduxのストアをコンポーネントから直接インポートする
- 循環依存を放置してページリロードで回避し続ける
関連エラー
参考リンク
JavaScript の他のエラー
この記事は役に立ちましたか?