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

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

保存してもブラウザが更新されない、HMR が途中で沈黙する——Antigravity で Next.js や Vite を扱うときの定番トラブルを3つの兆候に切り分けます。ブラウザ側・ビルド側・途中で止まる場合の対処と、Antigravity 固有のチェックポイントを解説します。

antigravity464hmrhot-reloadtroubleshooting89nextjs4vite

「保存しているはずなのにブラウザが更新されない」「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.host や server.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.json の files.watcherExclude が過剰に広い場合、編集中のファイルが意図せず除外されていることがあります。エディタの「Toggle Developer Tools」から console.log を吐かせて、保存イベントが発火しているかを確認するのが早いです。

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

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

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

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

シェア

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

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

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

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

関連記事

▣ アプリ開発2026-04-30
Antigravity × Better Auth でモダンTypeScript認証基盤を構築する
auth.ts を書き直し続ける消耗から抜けるために、Better Auth で TypeScript 認証基盤を組み立てます。Auth.js v5 との設計思想の違い、スキーマ生成、メール+パスワード認証、Google / GitHub OAuth、セッション取得までを5ステップで実装します。
▣ アプリ開発2026-10-14
ドキュメントのないコードを仕様書に起こす前に、読ませる順番を fan-in で決めておく
ドキュメントのない既存コードをエージェントに読ませて仕様書にするとき、最初に渡すファイルをどう決めるか。import の被参照数(fan-in)とルート定義ファイルから「読ませる順番」を出す 36 行の Python と、77 ファイルの Next.js プロジェクトで測った割合をまとめます。
▣ アプリ開発2026-10-08
agy CLI をコンテナで動かす前に、擬似 agy で確かめておく 3 つの安全網
Antigravity CLI(agy)を Docker や Cloud Run のジョブから呼ぶ前に、インストーラーの取りこぼし・承認待ちの固まり・終了コード 0 の空振りを、擬似 agy で再現して潰します。公式 docs の記述と、手元で実行した結果だけを根拠に組み立てた手順です。