Article

SEO 対策 モバイルの基礎知識と要点10選|まず押さえるポイント

高田晃太郎
SEO 対策 モバイルの基礎知識と要点10選|まず押さえるポイント

2024年時点で検索はモバイル経由が過半となり、GoogleはCore Web Vitalsの指標をINPに刷新しました⁷。ページ体験の質は検索での成功に寄与し、収益にも影響しうるため⁶⁸、モバイルを起点にした最適化が重要です。スマホ回線のレイテンシと端末CPUの制約は、同じ実装でもデスクトップより誤差が大きく、遅延は直帰・離脱を増やしやすくなります⁸。モバイルファーストインデックスではスマホ版の内容が評価対象であるため、技術選定・配信・計測のいずれもモバイル起点に再設計が必要です。本稿では、CTO・エンジニアリーダーが短期間で成果を出すための基礎と要点10選を、コード・数値・運用手順で提示します。

**モバイルSEOの基礎指標と技術仕様**

前提を明確化し、誤った最適化を避けます。特にINP・LCP・CLSの3指標は実装判断の評価軸として運用に組み込みます¹³⁵。

**前提条件と環境**

対象: SSR/SSGを含むモダンWeb(Next.js, Nuxt, Astro等)。計測はラボ(Lighthouse/PSI)とRUM(web-vitals)を併用。配信はHTTP/2以上、Brotli、モバイル優先のキャッシュ制御。

仕様/指標モバイル要点閾値/推奨
クロールGooglebot Smartphone(モバイルUA)スマホ版とPC版の内容同一
LCP最大描画要素(画像/テキスト)2.5s以下が良好、4.0s超は要改善¹
INP全体入力応答(タップ/キー)≤200ms良好、200–500ms要改善³⁴
CLSレイアウトシフト蓄積≤0.10良好、0.10–0.25要改善⁵
配信HTTP/2/3 + Brotli + CDN/EdgeTTFB 200ms台を目標
画像AVIF/WebP優先、明示的サイズ適切なsrcset/sizesとpreload⁹

**要点10選:実装の勘所とコード**

1. LCP最適化(ヒーロー画像/テキストの即時描画)

ヒーロー画像はpreloadし、明示サイズとモダンフォーマットで配信。SSRで初期HTMLに含め、クライアントJS依存を避けます¹。

import dynamic from 'next/dynamic';
import Head from 'next/head';

const HeroImage = dynamic(() => import(’../components/HeroImage’), { ssr: true });

export default function Page() { return ( <> <Head> <meta name=“viewport” content=“width=device-width, initial-scale=1” /> <link rel=“preload” as=“image” href=“/hero.avif” imagesrcset=“/hero.avif 1x, /hero@2x.avif 2x” imagesizes=“100vw” /> </Head> <HeroImage priority /> </> ); }

計測ではLCP対象を固定化し、遅延読み込み・カルーセル初期化による遅延を避けます¹。

2. INP改善(JS削減と即応性)

リスナの最小化、長タスク分割、優先度制御(scheduler.postTask等)。レガシーポリフィルの除去で送信JSを削減³。

import React, {useTransition} from 'react';

export function Filter({apply}) { const [pending, start] = useTransition(); return ( <button aria-busy={pending} onClick={() => start(() => apply())} > 絞り込み </button> ); }

長タスクが残る場合はWeb Worker移送を検討します³。

3. CLSゼロ化(寸法とフォント)

画像・広告枠は必ず幅高を宣言し、フォントは可変幅差を抑えるdisplay: optional/ swap + size-adjustを活用⁵。

import React from 'react';

export function Img(props) { return <img loading=“eager” decoding=“async” width={1200} height={600} alt="" {…props} />; }

4. モバイルファーストインデックスの整合

スマホ版もPC版と同一の主コンテンツ・構造化データ・リンクを保持。レンダリング差分を削除し、robots/Canonicalを統一。

5. 画像パイプライン(AVIF/WebP, responsive)

ビルド時に多形式・多解像度を生成してキャッシュ親和性を高めます⁹。

import fs from 'node:fs/promises';
import sharp from 'sharp';

async function buildResponsive(src, outBase) { try { await Promise.all([ sharp(src).avif({quality: 50}).toFile(${outBase}-800.avif), sharp(src).webp({quality: 60}).toFile(${outBase}-800.webp), sharp(src).jpeg({quality: 70}).toFile(${outBase}-800.jpg) ]); } catch (err) { console.error(‘Image build failed’, err); process.exitCode = 1; } }

buildResponsive(‘public/hero.jpg’, ‘public/hero’);

6. JS分割と遅延(module/nomodule廃止、動的import)

ヒーロー以外のウィジェットは遅延。エッジでの早期フラッシュ回避のためSSRとハイドレーション優先度を設計します。

import React, {Suspense} from 'react';

const ProductList = React.lazy(() => import(’./ProductList’));

export function Page() { return ( <Suspense fallback={<div role=“status” aria-live=“polite”>Loading…</div>}> <ProductList /> </Suspense> ); }

7. サーバー・配信(TTFB短縮)

HTTP/2/3、Brotli、TLS 1.3、CDNのEdge TTLとstale-while-revalidate。SSRはキャッシュキーにクエリを含めすぎない設計。

8. PWA/Service Workerで再訪体験を底上げ

初回はネットワーク優先、2回目以降はStale-While-Revalidateで画像・フォントを即時表示。

/* eslint-disable no-restricted-globals */
import {precacheAndRoute} from 'workbox-precaching';
import {registerRoute} from 'workbox-routing';
import {StaleWhileRevalidate} from 'workbox-strategies';

try { // @ts-ignore precacheAndRoute(self.__WB_MANIFEST || []); registerRoute( ({request}) => request.destination === ‘image’, new StaleWhileRevalidate({cacheName: ‘images-v1’}) ); } catch (e) { console.error(‘SW init failed’, e); }

9. フォールバックUXとアセットのアクセシビリティ

オフライン時や低帯域時の代替UIを用意し、ARIAと視認性を両立。CLSを防ぎつつ読みやすさを担保します。

10. 計測とRUM・CIの常設

RUMで実ユーザーのVitalを収集、PRごとにLighthouse CIで回帰をブロック。閾値はモバイル値で運用。

import {onLCP, onINP, onCLS} from 'web-vitals/attribution';

try { onLCP(({value, attribution}) => { navigator.sendBeacon(‘/vitals’, JSON.stringify({metric: ‘LCP’, value, target: attribution?.element})); }); onINP(({value, attribution}) => { navigator.sendBeacon(‘/vitals’, JSON.stringify({metric: ‘INP’, value, event: attribution?.eventType})); }); onCLS(({value}) => { navigator.sendBeacon(‘/vitals’, JSON.stringify({metric: ‘CLS’, value})); }); } catch (e) { console.error(‘web-vitals init failed’, e); }

**計測・ベンチマークとCIの実運用**

手元のラボ値と実ユーザーのRUM値の両輪で意思決定します。ここでは、Lighthouse(モバイルプリセット)での改善例を提示します。

指標BeforeAfter改善要因
LCP3.8s1.9sヒーロー画像preload+AVIF
INP380ms180msJS分割/遅延+長タスク分割
CLS0.180.05画像寸法宣言+フォント最適化
TTFB800ms220msCDN+Brotli+SSRキャッシュ
JS実行2.4s0.9s動的import/不要ライブラリ削除
転送量2.8MB1.2MB画像圧縮+HTTP/2

CIへの組み込み例(プログラマティックLHCI)。PRでしきい値を超えたら失敗させます。

import {writeFile} from 'node:fs/promises';
import lhci from '@lhci/cli/src/index.js';

try { const {lhr} = await lhci.openLocalBrowserAndRunLighthouse(‘https://m.example.com’, {preset: ‘mobile’}); await writeFile(‘lhr.json’, JSON.stringify(lhr)); const lcp = lhr.audits[‘largest-contentful-paint’].numericValue; if (lcp > 2500) throw new Error(LCP regression: ${lcp}); console.log(‘LCP’, lcp); } catch (e) { console.error(‘LHCI run failed’, e); process.exit(1); }

RUMはBigQuery/Logに集約し、国/端末/ネットワーク別にセグメント。予算(Performance Budget)をJSONで宣言し、PRごとに差分を検証すると運用が安定します。

**事業インパクトと導入計画(ROI/期間)**

モバイル高速化は検索流入とCV双方に効きます。例として、月間セッション10万、CVR 2.0%、平均注文額8,000円のECで、LCP 3.8→1.9s・INP 380→180msに改善しCVRが2.3%へ上昇した場合、月+240万円の売上増となります。投資300万円・維持月20万円なら、回収は2か月弱。Google/Deloitteの公開分析(小売・旅行)でも、速度短縮によるCV改善の相関が示されています⁸。

導入期間の目安:

  1. 現状診断(1週): ラボ/ログを整備し、LCP要素と長タスク特定。RUM収集の実装。
  2. 優先実装(2–3週): 画像パイプライン、preload、JS分割、CDN設定、フォント最適化。
  3. 安定化(1週): CIしきい値運用、RUMダッシュボード、A/BでCV影響を検証。

リスク: 広告・計測タグの遅延、画像CDNの変換遅延、キャッシュキー爆発。対策としてタグ遅延読込のサンドボックス化、ビルド時変換の採用、キャッシュポリシーの合意(Varyの最小化)を行います。

**補助ツール(任意)**

Blurプレースホルダー生成でファーストインプレッションを向上。

import sys
from PIL import Image, ImageFilter

def blur_placeholder(src, dst): try: with Image.open(src) as im: im = im.resize((32, 32), Image.LANCZOS).filter(ImageFilter.GaussianBlur(1.2)) im.save(dst, format=‘JPEG’, quality=30) except Exception as e: print(f’placeholder failed: {e}’, file=sys.stderr) raise

if name == ‘main’: blur_placeholder(‘public/hero.jpg’, ‘public/hero-blur.jpg’)

**まとめ:まず押さえて進めるために**

モバイルSEOは「測る→直す→運用する」の反復です。最初にCore Web Vitalsのボトルネック(LCP要素・長タスク・レイアウトずれ)を特定し、ヒーロー画像のpreload/AVIF化、JS分割、寸法宣言とフォント最適化を実行。RUMで実ユーザーの数値を常時監視し、CIにしきい値を組み込めば、リリースのたびに品質が積み上がります。貴社のトップページはLCP 2.5s以下、INP 200ms以下、CLS 0.1以下を達成できていますか¹³⁵。今日から計測の配線と優先3施策(画像・JS・TTFB)に着手し、2–4週間での体感改善と収益効果の検証を進めましょう⁶⁸。

参考文献

  1. Largest Contentful Paint (LCP) – web.dev. https://web.dev/articles/lcp
  2. Interaction to Next Paint (INP) – web.dev. https://web.dev/inp
  3. INP thresholds and guidance – web.dev (INP page, thresholds section). https://web.dev/inp/#:~:text=,are%20greater%20than%20500%20milliseconds
  4. Optimize Cumulative Layout Shift (CLS) – web.dev. https://web.dev/articles/optimize-cls
  5. The role of page experience in creating helpful content – Google Search Central Blog (Apr 2023). https://developers.google.com/search/blog/2023/04/page-experience-in-search
  6. Introducing INP to Core Web Vitals – Google Search Central Blog (May 2023). https://developers.google.com/search/blog/2023/05/introducing-inp
  7. How speeding up your mobile site can improve your bottom line – Think with Google (2020). https://www.thinkwithgoogle.com/intl/en-emea/marketing-strategies/app-and-mobile/mobile-page-speed-data/
  8. AVIF updates in 2023 – web.dev. https://web.dev/articles/avif-updates-2023