Vue Reactで訪問者IP別の地域キャンペーンを表示する方法

著者:Lisa Farrell·2026-06-01

Vue、React、Next.jsのランディングページは地域別キャンペーンに適しています。デフォルト内容を表示後、ブラウザがIP情報を取得してバナー、CTA、登録リンクを切り替えます。

設計目標

「Vue Reactで訪問者IP別の地域キャンペーンを表示する方法」では、IP リクエストが完了する前からページが役立つ状態である必要があります。位置情報は補助データとして検証し、限定した一つの判定だけに使い、不完全な場合は採用しません。

リクエストと判定の流れ

Vue Reactで訪問者IP別の地域キャンペーンを表示する方法: 次の流れはこの実装専用であり、一般的な IP 検索チェックリストの使い回しではありません。

  1. 手順 1 — 既定状態: DEFAULT_CAMPAIGN
  2. 手順 2 — リクエスト: getCountry()
  3. 手順 3 — 検証: sessionStorage
  4. 手順 4 — 判定: cleanup / onScopeDispose
  5. 手順 5 — フォールバック: CAMPAIGNS record

本番運用を意識した実装例

Vue Reactで訪問者IP別の地域キャンペーンを表示する方法: この例にはタイムアウト、レスポンス検証、決定的なフォールバック、フレームワーク固有のライフサイクル処理を含めています。

// geoClient.ts
export async function getCountry(signal?: AbortSignal): Promise<string | null> {
  const cached = sessionStorage.getItem('ipin_country_v2');
  if (cached && /^[A-Z]{2}$/.test(cached)) return cached;
  const timeout = new AbortController();
  const timer = setTimeout(() => timeout.abort(), 2200);
  const combined = signal ? AbortSignal.any([signal, timeout.signal]) : timeout.signal;
  try {
    const response = await fetch('https://my.ipin.io/info', {signal: combined});
    if (!response.ok) throw new Error(`HTTP ${response.status}`);
    const data: unknown = await response.json();
    const value = typeof data === 'object' && data !== null && 'country' in data
      ? String((data as {country?: unknown}).country || '').toUpperCase() : '';
    if (!/^[A-Z]{2}$/.test(value)) return null;
    sessionStorage.setItem('ipin_country_v2', value);
    return value;
  } finally { clearTimeout(timer); }
}

// React
const DEFAULT = {title: 'Global webinar', url: '/events/global'};
const CAMPAIGNS = {JP:{title:'Tokyo webinar',url:'/events/jp'}, DE:{title:'Berlin webinar',url:'/events/de'}};
export function GeoCampaign() {
  const [campaign, setCampaign] = React.useState(DEFAULT);
  React.useEffect(() => {
    const controller = new AbortController();
    getCountry(controller.signal)
      .then(code => { if (code && CAMPAIGNS[code]) setCampaign(CAMPAIGNS[code]); })
      .catch(error => { if (error.name !== 'AbortError') console.warn(error); });
    return () => controller.abort();
  }, []);
  return <a href={campaign.url}>{campaign.title}</a>;
}

// Vue 3 composable
export function useGeoCampaign() {
  const campaign = ref(DEFAULT);
  const controller = new AbortController();
  getCountry(controller.signal)
    .then(code => { if (code && CAMPAIGNS[code]) campaign.value = CAMPAIGNS[code]; })
    .catch(error => { if (error.name !== 'AbortError') console.warn(error); });
  onScopeDispose(() => controller.abort());
  return {campaign};
}

テストマトリクス

「Vue Reactで訪問者IP別の地域キャンペーンを表示する方法」を公開する前に、モックレスポンスまたは制御可能な VPN 出口で次のケースを確認します。

条件入力 / 設定期待結果
T1SSR: window=undefinedDEFAULT markup
T2country=JPJP campaign
T3unmount before responseabort; no state update
T4country=<script>DEFAULT; storage unchanged

自動 / スモークテスト

it('keeps the default campaign for an invalid payload', async () => {
  vi.stubGlobal('fetch', vi.fn().mockResolvedValue({
    ok: true, json: async () => ({country: '<script>'})
  }));
  render(<GeoCampaign />);
  expect(screen.getByRole('link')).toHaveTextContent('Global webinar');
});

障害時の処理

Vue Reactで訪問者IP別の地域キャンペーンを表示する方法: 障害はログや開発者ツールで確認できるようにしつつ、空のモジュールや壊れた決済画面を利用者に見せないことが重要です。

障害原因対応
hydration mismatchserver ≠ client statesame DEFAULT object
AbortErrorroute changeignore cancellation
stale storageconfig versionversioned key / TTL
data=nullresponse shapetype guard

実運用の例

「Vue Reactで訪問者IP別の地域キャンペーンを表示する方法」の現実的な利用例:ウェビナーのランディングページが SSR 対応の既定キャンペーンを先に描画し、クライアントで位置情報レスポンスを検証してから地域イベントへ切り替えます。

本番公開時の注意

Vue Reactで訪問者IP別の地域キャンペーンを表示する方法: 既定の HTML を完全な状態で残してください。IP 位置情報は本人確認ではなく、クライアント側の結果を権限制御に使ってはいけません。

まとめ

「Vue Reactで訪問者IP別の地域キャンペーンを表示する方法」は、共通テンプレートではなく、独自の実装手順、テスト、フォールバック動作を持つ記事になりました。