著者:
    作成:2026-06-11最終更新:2026-09-27

    ウェブサイトのスキャン

    scan コマンドは、公開URLを取得し、総ページサイズを測定し、そのページの i18n および SEO の健全性を監査します。HTML属性、カノニカルリンク、hreflangタグおよびその相互リンク、robots.txt、サイトマップ、ローカライズされた内部リンク、およびJavaScriptバンドル内のロケールデータ重量をカバーするスコア付きレポート(0〜100)を生成します。

    また、サイトがURL内でロケールをどのようにエンコードしているか(ルーティング戦略)、および使用しているフレームワーク、i18nライブラリ、翻訳管理システム(TMS)、翻訳プロキシを報告します。これらと同じチェックが オンライン i18n SEO スキャナー や Intlayer Chrome 拡張機能でも動作しています。

    追加の依存関係は必要ありません。puppeteer がインストールされている場合、より正確なバンドル分析のために、遅延ロード(lazy-loaded)されるJavaScriptチャンクを取得できます。インストールされていない場合は、HTML内に宣言されている即時ロードされるスクリプトの検査にフォールバックします。

    使用方法

    bash
    npx intlayer scan <url>
    

    例

    bash
    npx intlayer scan https://example.com
    

    出力例:

    plaintext
    🔍 Scanned https://example.com/fr (basic mode)
    
    Score: 91/100
    Page size: 10.60 MB (HTML 42.31 KB)
    Locales: fr, en, es, de
    Routing: locale prefix except for the default locale (every hreflang alternate but "en" starts with a locale segment, default locale: en)
    
    Stack:
      Framework Next.js 15.1.0
      i18n library next-intl
      TMS Crowdin
    Checks:
      ✓ html lang attribute
      ✓ html dir attribute
      ✓ locale signals consistent (lang, URL, hreflang)
      ⚠ og:locale meta tag
          Missing <meta property="og:locale">: social previews default to en_US
      ✓ canonical link
      ✓ hreflang tags
      ✓ x-default hreflang
      ✓ hreflang alternates link back
      ✓ unused bundle locale content
      ✓ localized internal links
      ⚠ all internal links keep the locale
          2 internal links leave the "fr" locale (0 to another locale, 2 without locale)
            <a href="/pricing">Tarifs</a>
      ✓ crawlable language switcher
      ✓ robots.txt present
      ✓ robots.txt keeps localized URLs crawlable
      ✓ sitemap present
      ✓ sitemap lists every locale
      ✓ sitemap has alternate links
      ✓ sitemap has x-default
    
    Bundle locale weight:
      Translations shipped: 120.50 KB
      Unused (other locales): 45.20 KB (37%)
    

    オプション

    <url>(必須)

    スキャンする完全修飾URL(例:https://example.com)。

    --no-deep

    レンダリングに基づく深いスキャンを無効にします。

    デフォルトでは、コマンドは puppeteer を使用してヘッドレスブラウザでページをレンダリングし、遅延ロードされるJavaScriptチャンクを取得して、実際の転送サイズを測定しようとします。puppeteerがインストールされていない場合、コマンドは自動的に基本モードにフォールバックします。

    puppeteerが利用可能な場合でも、基本モードを強制するには --no-deep を渡します。

    例:npx intlayer scan https://example.com --no-deep

    --json

    フォーマットされたレポートの代わりに、スキャン結果全体をJSONオブジェクトとして出力します。プログラムによる処理やCIパイプラインに便利です。

    例:npx intlayer scan https://example.com --json

    標準設定オプション

    • --base-dir:intlayer.config.* ファイルを配置するベースディレクトリ。
    • -e, --env:対象の環境(例:development, production)。
    • --env-file:カスタム .env ファイルへのパス。
    • --no-cache:設定キャッシュを無効にします。
    • --ci:モノレポ内のすべての Intlayer プロジェクトでコマンドを実行します(プロジェクトディレクトリ内から実行した場合はそのプロジェクトのみ)。プロジェクトごとの資格情報は、プロジェクトパスを { "clientId", "clientSecret" } に対応付ける JSON オブジェクト INTLAYER_PROJECT_CREDENTIALS から挿入できます。
    • --verbose:詳細ログを有効にします(CLIモードではデフォルト)。
    • --prefix:カスタムログプレフィックス。

    ルーティング戦略

    ページのhreflang代替タグで共有されるロケールパターンから、サイトがどのようにロケールをルーティングしているかが判明します。代替タグがない場合は、スキャン対象のURLのみが使用されます(信頼度:低)。

    戦略例
    prefix-all/en/about, /fr/about
    prefix-no-default/about(デフォルトロケール), /fr/about
    search-params/about?lang=fr
    subdomainfr.example.com
    domainexample.fr, example.de
    no-prefixすべてのロケールで同一URL(Cookie)

    リンク、カノニカル、robots.txt、サイトマップの各チェックは、この戦略を通して各URLを判定します。たとえば、プレフィックスなしのリンクは prefix-no-default サイトのデフォルトロケールでは正しく、?lang= のないリンクは search-params サイトではロケールから離脱したと判定されます。

    検出されたスタック

    HTML、読み込まれたリソース、JavaScriptバンドルから、フレームワーク、i18nライブラリ(Intlayer, i18next, react-i18next, next-i18next, next-intl, use-intl, react-intl, vue-i18n, @nuxtjs/i18n, Lingui, svelte-i18n, Paraglide, ngx-translate, Transloco, Polylang, WPML…)、翻訳管理システム(Crowdin, Phrase, Lokalise, locize, Transifex, Tolgee, Localazy, SimpleLocalize, Localizely, Smartling, Intlayer CMS)、および翻訳プロキシ(Weglot, Localize, GTranslate…)が特定されます。詳細モードでは、windowグローバル変数やCookieも読み取ります。

    チェック項目

    チェック説明スコアの重み
    html lang<html lang> が存在し、有効なBCP 47タグである9
    html dir右から左へ記述する言語に対して dir="rtl" が設定されている(デフォルトは ltr)3
    locale signals consistent<html lang>、URLのロケール、および自己参照hreflangエントリが一致している5
    og:localeog:locale が設定されており、<html lang> と一致している3
    canonicalカノニカルリンクが存在し、別のロケールバージョンを指していない10
    hreflang有効なコード、絶対URL、重複なし、自己参照を含むhreflangタグが存在する9
    x-default hreflangx-default hreflangの代替が存在する7
    hreflang alternates link back代替ページが200で応答し、リダイレクトされず、元のページへリンクを返し、言語を宣言している8
    localized links内部リンクがページのロケールを指している8
    all links keep the locale内部リンクでロケールが切り替わったり失われたりしていない6
    language switcherクロール可能な <a href> による他言語バージョンへのリンクが存在する6
    robots.txt present/robots.txt が 200 応答を返す10
    robots.txt localized URLsサイトおよびそのローカライズされたURLがGooglebotに対してブロックされていない8
    sitemap presentサイトマップが見つかる(robots.txtの Sitemap: ディレクティブ、/sitemap.xml、/sitemap_index.xml)10
    sitemap locale coverageすべてのロケールがリストされ、代替リンクを持つエントリが自身もリストしている9
    sitemap alternatesサイトマップに hreflang 代替リンクが含まれている8
    sitemap x-defaultサイトマップに x-default hreflangが含まれている7
    unused bundle contentメインJSバンドルに他のロケールの翻訳が余計に含まれていない8

    警告の場合は重みの半分が得られます。最終スコアは、実行されたチェックの加重合計をパーセンテージ(0〜100)で表したものです。失敗したチェックは最初に見つかった問題を表示します。詳細については --json を使用してください。

    プログラムによるスキャン機能の使用

    scan 関数は @intlayer/cli からもエクスポートされており、独自のスクリプトから呼び出すことができます:

    ts
    import { scan } from "@intlayer/cli";
    
    await scan("https://example.com", {
      deep: false,
      json: false,
    });
    

    より低レベルのアクセスには、@intlayer/engine/scan の scanWebsite が構造化された ScanResult オブジェクトを返します:

    ts
    import { scanWebsite } from "@intlayer/engine/scan";
    
    const result = await scanWebsite("https://example.com", { deep: false });
    console.log(result.score, result.totalPageSize, result.events);