TypeError: Failed to fetch dynamically imported module
Viteでデプロイ後に動的インポートが失敗するエラー
概要
Viteでビルドしたアプリケーションをデプロイした後、ユーザーがページを開いたままの状態で新しいデプロイが行われると発生するエラーです。動的インポートされるチャンクファイルのハッシュが変わり、古いファイルが存在しなくなることが原因です。
エラーメッセージ
TypeError: Failed to fetch dynamically imported module: https://example.com/assets/Page-abc123.js
原因
- デプロイによるファイルハッシュ変更: Viteはコンテンツベースのハッシュをファイル名に付与するため、コード変更時にファイル名が変わる
- 古いチャンクファイルの削除: 新しいデプロイで古いチャンクファイルが削除される
- ブラウザキャッシュ: クライアントが古いマニフェストを保持している
- 動的インポートのタイミング: ユーザーがページ遷移時に存在しないファイルをリクエスト
解決策
1. エラーバウンダリでリロードを促す(React)
| |
2. 動的インポートをリトライする
| |
3. Service Workerでキャッシュ管理
| |
4. バージョンチェックを実装
| |
5. 古いチャンクを一定期間保持
| |
6. Vue Routerでのエラーハンドリング
| |
よくある間違い
- エラーを無視してユーザーに白い画面を見せてしまう
- リロードループを引き起こす実装(リトライ回数を制限すべき)
- すべての動的インポートエラーを同じ方法で処理(ネットワークエラーと区別すべき)
関連エラー
参考リンク
JavaScript の他のエラー
この記事は役に立ちましたか?