ANTIGRAVITY LABEN
記事一覧/アプリ開発
アプリ開発/2026-04-28中級

Antigravity でホットリロード(HMR)が効かない問題の切り分けと修正手順

Antigravity で HMR が効かない・反映されない問題を、ファイルウォッチャー/ポート/ビルドツール/エディタ設定の4領域に分けて切り分ける実践的な診断手順をまとめました。

antigravity435hmrhot-reloadtroubleshooting88nextjs4vite

「保存しているはずなのにブラウザが更新されない」「HMR が一度だけ効いて、その後沈黙してしまう」— Antigravity で Next.js や Vite を扱うとき、誰もが一度はぶつかる現象ではないでしょうか。私自身、Dolice Labs の 4 サイトを日々開発していて、AI エージェントに大きな修正を任せた直後に HMR が止まる場面を何度も経験しました。

HMR が効かない問題は、原因が「ファイルウォッチャー」「ポートとプロキシ」「ビルドツールの設定」「Antigravity 固有の挙動」の 4 領域にまたがるため、勘で直そうとすると時間を溶かしがちです。私が普段実際に使っている診断の順序と、それぞれの修正手順を実例とともに整理しました。読み終えたとき、「次に試すべき手」が必ず 1 つは増えているはずです。

まず把握しておきたい「3 つの兆候」

HMR トラブルは、表に出てくる兆候によって原因の当たりが変わります。次の 3 つのどれに最も近いかを最初に分類してください。

  • 兆候 A: ファイルを保存するとターミナルにビルドログは出るが、ブラウザだけが沈黙している
  • 兆候 B: ファイルを保存してもターミナルに何も出ない(ビルドが走らない)
  • 兆候 C: 起動直後は HMR が効くが、5〜10 分作業すると突然止まる

兆候 A はネットワーク経路の問題、兆候 B はファイルウォッチャーの問題、兆候 C はリソース枯渇の問題であることが明確に多い、というのが個人的な経験則です。以下、それぞれを順に追っていきます。

兆候 A: ブラウザ側だけが反応しない場合

ターミナルに compiled successfully のような出力は出ているのに、ブラウザが更新されないケースです。WebSocket(HMR の通信路)がどこかで遮断されている可能性が高いと考えてください。

最初にブラウザの開発者ツールを開き、Console と Network タブを確認します。WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr' failed のような赤い行が出ていれば、ほぼ確定です。

# Antigravity の統合ターミナルで実行
# Next.js 16 系: HMR の WebSocket ポートを確認
lsof -i -P | grep LISTEN | grep -E "3000|3001|24678"
# 期待される出力例:
# node    12345 ...    TCP *:3000 (LISTEN)

修正の典型パターンは次の 3 つです。第 1 に、Antigravity の組み込みポートフォワーダー(リモート開発時)が WebSocket をプロキシできていない場合があります。コマンドパレットから「Forward a Port」を選び、HMR 専用のポートを明示的に転送してください。第 2 に、ブラウザ拡張機能(広告ブロッカーや CSP 系拡張)が WebSocket を遮断していることがあります。シークレットウィンドウで再現するかを確認するのが最速です。第 3 に、Vite の場合は server.hmr.hostserver.hmr.port を環境変数で明示的に指定すると安定します。

// vite.config.ts
import { defineConfig } from 'vite';
 
export default defineConfig({
  server: {
    host: '0.0.0.0',
    port: 5173,
    hmr: {
      // リモートやコンテナ越しでも確実に届けるための明示指定
      host: 'localhost',
      port: 5173,
      protocol: 'ws',
    },
  },
});
// 期待される動作: ブラウザの devtools で
// "[vite] connected." がコンソールに表示される

兆候 B: ファイル保存後、ビルドが走らない場合

ターミナルに何も流れないということは、ファイルウォッチャーが変更を検知していないということです。これが一番厄介で、原因も多岐にわたります。

最初に疑うべきは inotify の上限です。Linux 環境(WSL や Devcontainer 含む)でファイルを監視できる総数には上限があり、大きめのリポジトリでは秒単位で枯渇します。次のコマンドで現状を確認してください。

# 現在の上限
cat /proc/sys/fs/inotify/max_user_watches
# 監視中のファイル数
find /proc/*/fd -lname 'anon_inode:inotify' 2>/dev/null | wc -l
 
# 一時的に増やす
sudo sysctl fs.inotify.max_user_watches=524288
# 永続化する場合
echo "fs.inotify.max_user_watches=524288" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

これに関連した「No space left on device」エラー(実際は inotify 枯渇)の対処は、Antigravity File Watcher の ENOSPC エラー対処法 にもまとめてあります。併せてご確認ください。

inotify が原因でなさそうなら、次は監視対象から保存先が除外されていないかを疑います。たとえば Next.js は node_modules.next.git を監視対象から外していますが、独自に next.config.js でカスタマイズしている場合や、シンボリックリンク経由でファイルを編集している場合に、編集中のファイルがウォッチャーの管轄外になっていることがあります。

// next.config.js — ウォッチャーを明示的に拡張する例
module.exports = {
  webpack: (config, { dev }) => {
    if (dev) {
      // シンボリックリンク先も含めて監視
      config.watchOptions = {
        followSymlinks: true,
        // 巨大リポでは poll に切り替えると確実だが CPU を食う
        poll: process.env.WATCH_POLL ? 1000 : false,
        ignored: ['**/node_modules/**', '**/.next/**'],
      };
    }
    return config;
  },
};
// 確認方法: WATCH_POLL=1 npm run dev で起動し、
// CPU 使用率が上がりつつもファイル保存で再ビルドが走れば
// ウォッチャー側の問題で確定

兆候 C: 一度は効くが途中で止まる場合

最初は HMR が動いていたのに、数分作業していると突然止まるパターン。原因はほぼ「リソース枯渇」「メモリリーク」「Antigravity 側のセッション切断」の 3 つに絞れます。

メモリの確認は Activity Monitor(macOS)や htop(Linux)で十分です。node プロセスのメモリが 2 GB を超えてきたら要注意で、NODE_OPTIONS=--max-old-space-size=4096 を付けて起動するか、定期的に開発サーバーを再起動する運用に切り替えましょう。

Antigravity 固有の現象としては、AI エージェントが大量のファイル変更を一度にコミットしたあとに、Antigravity 側のインデックスが詰まり、ファイルウォッチャー通知が遅延することがあります。コマンドパレットから「Developer: Restart Extension Host」を実行すると、エディタ全体を再起動せずに復旧できることが多いので、まずこれを試すのがおすすめです。それでも復旧しない場合、ワークスペースのインデックスが壊れているかもしれません。詳しい復旧手順は Antigravity ワークスペースのインデックスが詰まる問題の修正手順 にまとめています。

Antigravity 固有のチェックポイント

最後に、Antigravity 特有の設定で見落としがちな項目を 3 つ挙げておきます。

第 1 に、AI エージェント実行中はワークスペースの一部のファイル監視が一時停止する仕様があります。これは大規模な書き換え中の不要な再ビルドを防ぐためのもので、エージェント終了後に自動復帰しますが、終了直後の数秒は HMR が動かないことがあります。「効かない」と感じても、まず数秒待ってもう一度保存してみてください。

第 2 に、設定ファイル .antigravity/settings.jsonfiles.watcherExclude が過剰に広い場合、編集中のファイルが意図せず除外されていることがあります。エディタの「Toggle Developer Tools」から console.log を吐かせて、保存イベントが発火しているかを確認するのが早いです。

第 3 に、Antigravity のリモート開発拡張を使っている場合、ポートフォワーディングの設定が再起動時にリセットされていることがあります。.antigravity/settings.jsonremote.autoForwardPortstrue に固定し、HMR 用ポートを remote.portsAttributes に明示しておくと事故が減ります。

全体を振り返って — 次の一歩

HMR の問題は「魔法のようなワンライナーで直る」ものではなく、上記のように 4 領域の切り分けが必要です。今日の作業に戻る前に、まず 1 つだけやってみてほしいことがあります。それは、「自分がいま遭遇している現象が兆候 A・B・C のどれに当たるか」をメモに書き出すことです。これだけで、闇雲に設定をいじって時間を溶かす事態を防げます。

エディタとビルドツールの組み合わせが多様になる時代、ホットリロードの安定性は開発体験そのものを左右します。

シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

アプリ開発2026-06-14
エッジキャッシュが Next.js の空ページを固定化していた原因と、cache-worker のガード設計
ユーザーから「時々読み込みエラーになる」と報告されるのに手元では再現しない。SSR の例外が HTTP 200 で配信され、それをエッジキャッシュが固定化していた原因を Antigravity のエージェントで切り分け、cache-worker にキャッシュ拒否ガードを実装した記録です。
アプリ開発2026-05-03
Antigravityで『uv add transformers』が通らない時の見落としやすい原因と対処法
Antigravity上のPythonプロジェクトでuv add transformersが失敗する、あるいは追加後もImportErrorになる時に確認すべきポイントを、実際に詰まった順序で整理します。
アプリ開発2026-05-02
Antigravity に Server Actions を書かせるときの落とし穴 — Zod・revalidate・セキュリティを後付けしない実装フロー
Antigravity の AI に Next.js の Server Actions を書かせると、バリデーション・revalidate・認可チェックがごっそり抜け落ちることがあります。それを後付けにせず、最初から安全な実装に着地させるための実践フローをまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →