Windows 11 の最新 Microsoft Edge だけで「読み込みが途中で止まる」「一部が欠ける」。他のブラウザーでは再現せず、キャッシュ削除でも解決しない――そんな時に、サイト実装が悪いのか Edge 側の不具合なのかを短時間で切り分け、実務で使える対処・回避・再発防止までを通しで解説します。今日から運用現場でそのまま使える手順とチェックリストを用意しました。
現象の特徴とよくある誤解
相談で多いのは次のようなサインです。どれか一つでも当てはまれば、本記事の手順での切り分けが有効です。
- Windows 11 の Microsoft Edge(Stable)のみでレイアウト崩れやコンテンツ欠落、ロード中断が発生する。
- 同 URL を Chrome / Firefox / Safari で開くと正常に表示される。
- ハードリロード(キャッシュ削除)や拡張機能無効化、シークレットモードでも改善しない。
- 特定ページや特定コンポーネントだけが不安定(トップは正常、詳細ページだけ症状など)。
「他ブラウザーでは正常=サイトは正しい」とは限りません。仕様ギリギリの実装やヘッダーの微妙な不一致、Service Worker のキャッシュ汚染、Edge の実装差や回帰のいずれでも似た症状が起きます。最短ルートは、ブラウザー起因かサイト起因かの切り分けから始めることです。
最初に行う環境整理(再現性を高める初動)
- 新規ユーザープロファイルを作成して再現を確認(拡張・設定・Cookie の影響を排除)。
- InPrivateで再度テスト(サードパーティ Cookie ブロックの影響も観察)。
- ハードウェア アクセラレーションの一時無効化で再現性比較(設定 > システム)。GPU 周りの不具合切り分けに有効。
- ネットワークを固定(VPN/プロキシ/セキュリティ製品を一時的にオフ)して中間装置の介入を排除。
- 起動オプションを使った実験(検証端末限定):
"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --disable-quic "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --disable-gpuHTTP/3/QUIC や GPU 絡みの影響切り分けに役立ちます。恒常運用には使わないでください。
Insider 版での再現確認(切り分けの最短コース)
Stable のみか、Beta/Dev/Canary でも起きるかを比較します。
- Insider 版でも再現:サイト依存の不具合(実装/配信/ヘッダー/キャッシュ)か、Chromium コア由来の広範な問題の可能性が高い。
- Insider 版では再現せず:既に修正が取り込まれている見込み。次期 Stable で解消される可能性があるため、一時回避と情報発信を優先。
Insider 版は Stable と共存できます。症状が顧客環境でのみ再現する場合は、顧客に「Insider 版での再現有無」を一度確認してもらうと、障害の見立てが大きく進みます。
Microsoft への効果的なフィードバック(開発チームが動きやすい情報)
Edge 右上の「…」 > [ヘルプとフィードバック] > [フィードバックの送信] から報告します。次のセットを揃えると解析が速くなります。
- 問題ページの正確な URL(ログインが必要な場合はテスト用アカウントの提供を検討)。
- 再現手順(キーボード操作・クリック順・スクロール位置・表示倍率まで具体的に)。
- スクリーンショット/短い動画(DevTools を開いた状態だと更に良い)。
- DevTools の HAR(Network > 右クリック > Save all as HAR)。
edge://versionの出力、edge://gpuの一部(GPU/Driver/ANGLE情報)。edge://net-exportで取得したネットログ(難しければ HAR のみでも可)。
貼り付け例(そのまま使えます):
[現象]
Windows 11 Edge Stable のみでページが「読み込み途中」で止まる/一部ウィジェットが表示されない
[発生URL]
[https://example.com/path](https://example.com/path)
[再現手順]
1. ログイン後、ダッシュボードに遷移
2. フィルターを選択してスクロール
3. 20〜30秒後に一覧の下半分が表示されない
[期待結果]
一覧が最後まで表示され、操作できる
[実際の結果]
Edge のみ途中で描画が停止し、コンソールにエラー X が出力される
[添付]
* スクリーンショット/動画
* HAR(DevTools Network)
* edge://version のテキスト
* 必要に応じ net-export のログ
[環境]
Windows 11 23H2 / Edge 版本号 / GPU 名称 + ドライバー版
拡張機能:なし / 新規プロファイル / InPrivate で再現 </code></pre>
<h2>DevTools での実地切り分けフロー(現場ですぐ使える)</h2>
<ol>
<li><strong>Network</strong>:<em>Disable cache</em> と <em>Preserve log</em> を有効にし、失敗/保留(pending)/キャンセルのリクエストを特定。<br>「<em>from ServiceWorker</em>」「<em>Provisional headers are shown</em>」「<em>stalled</em>」などの痕跡を観察。</li>
<li><strong>Console</strong>:赤エラーだけでなく、<em>UnhandledPromiseRejection</em>、<em>Cross-origin</em>、<em>MIME タイプ</em>警告を確認。イベントハンドラを追加して取りこぼしを拾います。
<pre><code>window.addEventListener('error', e => console.log('error', e.filename, e.message));
window.addEventListener('unhandledrejection', e => console.log('unhandled', e.reason));
Application:Service Worker の Update on reload を有効にし、Clear storageで一括削除。登録解除のワンライナーは次の通り。
navigator.serviceWorker.getRegistrations()
.then(rs => Promise.all(rs.map(r => r.unregister())));
Performance:スクリーンショットを含めて記録し、Long Task・メインスレッドのスタックを確認。描画停止が GC やレイアウトスラッシングに由来するかを判断。
Rendering/Experiments:Paint Flashing・Layer Borders で再描画の有無を可視化。
Coverage:JS/CSS の未使用率が極端に高い場合、defer/async や dynamic import の競合、または条件分岐の誤判定を疑う。
サイト側チェックポイント(重点)
| チェック項目 | 確認ポイント・対処例 |
|---|---|
| 非同期/遅延スクリプト | <script async> や type="module" + dynamic import() の依存関係が崩れていないか。Critical な初期化は defer に寄せ、import() 失敗時のフォールバックを実装。import('./app.mjs').catch(() => import('./app-legacy.js')); |
| HTTP レスポンスヘッダー | X-Content-Type-Options: nosniff を有効にした上で、.mjs は text/javascript、.wasm は application/wasm など MIME を正確化。型不一致は Edge が厳密にブロックし、内容欠落の主因になります。 |
CSS 新仕様 / Houdini / content-visibility | content-visibility: auto は実測高さがないと「見えないまま」になることがあります。必ず contain-intrinsic-size を併用し、要所はフォールバックを指定。@supports (content-visibility: auto) { .card { content-visibility: auto; contain-intrinsic-size: 600px 1px; } } |
| Service Worker | 古い SW による stale キャッシュで差分が反映されないケース。登録解除・updateViaCache の見直し、バージョニング、skipWaiting()/clients.claim() の適切化。 |
| Web コンポーネント / Shadow DOM | 古いカスタム要素ポリフィル(EdgeHTML 時代)混在や delegatesFocus 周辺の挙動差。最新のポリフィルか、可能ならネイティブ実装前提に整理する。 |
| トラッキング防止と 3rd パーティ Cookie | Edge の追跡防止が iframe 内の Cookie や識別子を止め、見えない依存が壊れる場合があります。Storage Access API の導入や、同一サイト化・トークン化で依存を減らす。 |
| HTTP/3 (QUIC) と中間装置 | 特定 CDN/プロキシとの相性で stalled が発生する例。検証用に --disable-quic で切り分け、サーバー側で HTTP/2 にフォールバックして挙動を比較。 |
| IntersectionObserver による遅延読込 | ルート要素の overflow や transform が観測を妨げ、Edge で発火しづらいことがあります。rootMargin の拡大や threshold の見直しで改善。 |
| Back/Forward Cache(BFCache)復帰 | 復帰時に初期化コードが二重起動/無起動になると内容欠落。pageshow の persisted を監視し、復帰時の再同期を実装。 |
症状別・高速トリアージ表
| 症状 | Network/Console の痕跡 | 推定要因 | すぐ試すこと | 暫定回避 |
|---|---|---|---|---|
| 途中でロードが止まる | 一部リクエストが pending のまま / stalled | HTTP/3/中間装置、Service Worker の競合、fetch ストリーミング | QUIC 無効で比較、SW 解除、ReadableStream を使わず一括応答で再確認 | サーバー側で一時的に HTTP/2 に固定、ストリーミングを無効化 |
| 一部ウィジェットだけ欠落 | Console に TypeError / NotSupportedError | 新 API の未実装 / 権限不足 / MIME 不一致 | Feature detection で分岐、ヘッダーとポリシー確認 | 代替レンダラー(SSR/プリレンダー)に切替 |
| 画像や動画が表示されない | MIME 警告、net::ERR_BLOCKED_BY_RESPONSE | nosniff + コンテンツ型不一致、CSP/COEP/COOP | 正しい Content-Type 設定、ポリシーの適正化 | フォーマット変換(WebP/AVIF のみ依存を避ける) |
| スクロールしないと現れない | 描画イベントは発火、しかし DOM が content-visibility で停止 | 高さ未確定、IntersectionObserver 未発火 | contain-intrinsic-size 付与、rootMargin を +200px 以上に | 重要要素は遅延表示をやめる |
| 戻る/進む後に壊れる | pageshow 未処理、状態同期不全 | BFCache 復帰対応漏れ | window.addEventListener('pageshow', e => { if (e.persisted) rehydrate(); }); | 状態管理を URL 駆動へ寄せる |
HTTP ヘッダーとサーバー設定の見直し
「Chrome は通るのに Edge だけ NG」の多くは、ヘッダーの厳密さの差で説明できます。代表的な設定をまとめます。
| 対象 | 推奨設定例 | 補足 |
|---|---|---|
| MIME タイプ | # Nginx types { text/javascript js mjs; text/css css; application/wasm wasm; font/woff2 woff2; image/avif avif; image/webp webp; } | nosniff とセットで厳密に。.mjs を application/javascript にしないなど細部も重要。 |
| キャッシュ制御 | Cache-Control: public, max-age=31536000, immutable # 静的資産 Cache-Control: no-store # HTML/JSON など動的 | SW 併用時は SW 側の戦略と二重管理にならないよう統一。 |
| 安全性・分離 | Cross-Origin-Opener-Policy: same-origin Cross-Origin-Embedder-Policy: require-corp Cross-Origin-Resource-Policy: same-site X-Content-Type-Options: nosniff | SharedArrayBuffer 等が必要な場合の基本。導入時は 3rd パーティ資産の読み込み方も見直し。 |
| 圧縮 | Edge/クライアントが対応する圧縮方式のみ使用。Content-Encoding と Vary: Accept-Encoding を正しく付与。 | 不一致は「途中で止まる」原因に。CDN 側辞書圧縮の設定も確認。 |
実装の落とし穴とフォールバック例(コピペ可)
Feature detection で機能を段階的に有効化
// UA Sniff は避け、機能検出で分岐
const supports = {
contentVisibility: CSS.supports?.('content-visibility: auto'),
modulePreload: HTMLLinkElement.prototype.relList?.supports?.('modulepreload'),
readableStream: typeof ReadableStream !== 'undefined'
};
if (!supports.contentVisibility) {
document.documentElement.classList.add('no-cv');
}
if (!supports.readableStream) {
// ストリーミング fetch を使わないコードパスに切り替え
}
動的 import 失敗時にレガシーバンドルへフォールバック
async function loadApp() {
try {
await import('/assets/app.mjs');
} catch (e) {
console.warn('module import failed, fallback to legacy', e);
await new Promise((res, rej) => {
const s = document.createElement('script');
s.src = '/assets/app.legacy.js';
s.defer = true;
s.onload = res; s.onerror = rej;
document.head.appendChild(s);
});
}
}
loadApp();
Service Worker の更新保証(古いキャッシュを残さない)
// sw.js
self.addEventListener('install', e => {
self.skipWaiting();
});
self.addEventListener('activate', e => {
e.waitUntil(clients.claim());
});
// register side
navigator.serviceWorker.register('/sw.js', { updateViaCache: 'none' })
.then(reg => reg.update());
BFCache 復帰に強い初期化
window.addEventListener('pageshow', e => {
if (e.persisted) {
// 状態再同期・再描画
hydrateFromServerState();
}
});
Edge で発火しにくい IntersectionObserver への対処
const io = new IntersectionObserver(cb, {
root: null,
rootMargin: '300px 0px', // 余裕を持たせる
threshold: [0, 0.1, 0.5, 1]
});
// transform/overflow: hidden な祖先の影響を避ける
一時的な回避とユーザーコミュニケーション
- 重要機能だけ SSR/プリレンダーに切り替え、クライアント側の脚注機能は後段ロードに。
- Edge 限定の軽量表示モード(アニメーション無効・ストリーミング無効)を feature detection ベースで提供。
- 既知の不具合で Insider 版に修正が入っている場合、お知らせバナーで「次期更新で改善予定」と透明性を持って案内。
再発防止:CI と監視に Edge を組み込む
- マトリクス検証:Windows 11 / Edge Stable・Beta・Dev の 3 チャンネルで E2E(Playwright/EdgeDriver)。
- 互換性警告の監視:DevTools の Issues(旧 Compat)や Lint で未対応仕様の導入を早期に検知。
- browserslist を運用に組み込み、Autoprefixer/TS/バンドラのターゲットを Edge の実採用バージョンに合わせる。
- 重大ページのプロファイリング:LCP/INP/CLS のしきい値を Edge でも計測し、異常値をアラート。
GitHub Actions の疑似例(概念):
name: E2E on Edge Channels
on: [push]
jobs:
test:
runs-on: windows-latest
strategy:
matrix:
channel: [stable, beta, dev]
steps:
- uses: actions/checkout@v4
- name: Install Edge (${{ matrix.channel }})
run: |
echo "事前にチャンネル別の Edge を用意"
- name: Run Playwright
run: |
npx playwright test --project="Desktop Edge ${{ matrix.channel }}"
現場の「あるある」落とし穴集
- 古いポリフィルが生き残っている:Shadow DOM/Custome Elements の二重定義で初期化競合。
- Origin Trial 依存:Chrome の Origin Trial でのみ有効な機能に依存し、Edge ではフォールバックしていない。
- メディアクエリの想定外:
prefers-reduced-motionでアニメーションが無効化され、待ち合わせ条件が満たされず画面が進まない。 - ユーザー設定の影響:追跡防止「厳密」、サードパーティ Cookie 完全ブロックで認可フローが失敗。
「それでも直らない」ときの最後の切り札
- 最小再現リポジトリ(MRE)を作る:JS/CSS/HTML を最小化し、どの 1 行で壊れるかを特定。
- 機能フラグ化:問題ブロックを kill‑switch で全無効にできるようにする。
- 段階的ロールアウト:Edge のみ段階的に機能を戻し、メトリクスで監視。
よくある質問(FAQ)
Q. Chrome と同じ Chromium ベースなのに、なぜ Edge だけ壊れる?
A. リリースタイミング・機能フラグ・ポリシー初期値・追跡防止・CDN/ネットワークとの相性などで「同じではない」箇所があり、仕様のグレーな使い方やヘッダーの不整合が表面化します。
Q. UA 判定で Edge をはじいても良い?
A. 推奨しません。UA は変化し、将来の保守コストが跳ね上がります。機能検出(Feature detection)+ フォールバックが安全です。
Q. サービスワーカーは便利だが怖い…
A. 運用ルール(キャッシュ戦略、バージョニング、更新保証)を決めれば安定します。緊急時の「全登録解除スクリプト」をブックマークしておくと安心です。
まとめ
- まずは Insider 版の再現有無で切り分け、ブラウザー不具合かサイト実装かの方向性を決める。
- 同時に Microsoft へ詳細フィードバック(HAR・バージョン・手順・動画)を送り、修正/調査を促進。
- Service Worker・MIME・新仕様・追跡防止など Edge でつまずきやすい点を重点的に検証。
- プロダクション影響を抑えるために フォールバックと機能フラグを備え、次期修正までの暫定運用を可能にする。
- 再発防止として CI に Edge(Stable/Beta/Dev)を組み込み、Issues タブやメトリクスで早期検知を行う。
即座に使える「サイト側チェックリスト」(配布用)
| カテゴリ | チェック | OK 基準 |
|---|---|---|
| Script | type="module" と nomodule の二重読み込みや依存順序崩れがない | 初期化順が保証され、UnhandledPromiseRejection が 0 |
| Header | nosniff 有効かつ MIME 正確、Content-Security-Policy が現実的 | Console に MIME/CSP 警告が出ない |
| SW | 更新保証(skipWaiting/clients.claim)、updateViaCache 設計済み | 更新直後の表示で旧リソースが残らない |
| CSS | content-visibility と contain-intrinsic-size を併用 | 遅延表示領域でもプレースホルダーが描画される |
| Lazy Load | IntersectionObserver の rootMargin 設計 | 実機スクロールで未発火がない |
| Network | HTTP/3 の影響を検証(CDN/プロキシ設定) | HTTP/2 と同等の安定性が得られる |
| Back/Forward | BFCache 復帰のハンドリング済み | 戻る/進む後の壊れがない |
Edge のみ問題が出るページへの局所回避アイデア
- 重要コンテンツだけ SSR または静的化し、インタラクションは後段ロード。
- アニメーション/ストリーミング/重い観測処理を Edge ではオフ(Feature detection で制御)。
- 告知バナーで「最新の Insider 版で改善の可能性」を案内。ユーザー体験の混乱を減らす。
以上のステップを上から順に実施すれば、多くの「Edge だけ壊れる」を数時間で「再現→原因特定→暫定回避→永続対策」まで持ち込めます。現場の即戦力として、ぜひチームの運用手順書に組み込んでください。

コメント