Autor:
    Creación:2026-06-11Última actualización:2026-09-27

    Escanear sitio web

    El comando scan obtiene una URL pública, mide el tamaño total de la página y audita la salud de i18n y SEO de la página. Produce un informe puntuado (0–100) que cubre atributos HTML, enlaces canónicos, etiquetas hreflang y sus enlaces de retorno, robots.txt, sitemaps, enlaces internos localizados y el peso de las locales en el bundle de JavaScript.

    También informa cómo el sitio codifica la locale en sus URLs (estrategia de enrutamiento) y qué framework, librería i18n, sistema de gestión de traducciones (TMS) o proxy de traducción utiliza. Las mismas comprobaciones impulsan el escáner SEO i18n en línea y la extensión de Chrome de Intlayer.

    No se requieren dependencias adicionales. Cuando puppeteer está instalado, el escaneo puede capturar fragmentos de JavaScript cargados de forma diferida para un análisis de bundle más preciso; de lo contrario, recurre a inspeccionar los scripts cargados de forma activa declarados en el HTML.

    Uso

    bash
    npx intlayer scan <url>
    

    Ejemplo

    bash
    npx intlayer scan https://example.com
    

    Ejemplo de salida:

    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%)
    

    Opciones

    <url> (requerido)

    La URL completa a escanear (por ejemplo, https://example.com).

    --no-deep

    Desactiva el escaneo profundo basado en renderizado.

    Por defecto, el comando intenta utilizar puppeteer para renderizar la página en un navegador sin interfaz gráfica, capturar fragmentos de JavaScript cargados de forma diferida y medir el tamaño real de transferencia. Si puppeteer no está instalado, el comando recurre automáticamente al modo básico.

    Pase --no-deep para forzar el modo básico incluso cuando puppeteer esté disponible.

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

    --json

    Muestra el resultado completo del escaneo como un objeto JSON en lugar de un informe formateado. Útil para el consumo programático o pipelines de CI.

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

    Opciones de configuración estándar

    • --base-dir: Directorio base utilizado para localizar el archivo intlayer.config.*.
    • -e, --env: Entorno de destino (por ejemplo, development, production).
    • --env-file: Ruta a un archivo .env personalizado.
    • --no-cache: Desactivar la caché de configuración.
    • --ci: Ejecuta el comando en cada proyecto Intlayer del monorepo (o solo en el actual si se ejecuta desde un directorio de proyecto). Se pueden inyectar credenciales por proyecto mediante INTLAYER_PROJECT_CREDENTIALS, un objeto JSON que asocia cada ruta de proyecto a { "clientId", "clientSecret" }.
    • --verbose: Activar el registro detallado (por defecto en modo CLI).
    • --prefix: Prefijo de registro personalizado.

    Estrategia de enrutamiento

    El patrón de locale compartido por las alternativas hreflang de la página revela cómo el sitio enruta sus locales. Sin alternativas, solo se utiliza la URL escaneada (baja confianza).

    EstrategiaEjemplo
    prefix-all/en/about, /fr/about
    prefix-no-default/about (locale por defecto), /fr/about
    search-params/about?lang=fr
    subdomainfr.example.com
    domainexample.fr, example.de
    no-prefixUna URL para cada locale (cookie)

    Las comprobaciones de enlaces, canónicos, robots.txt y sitemaps leen cada URL mediante esta estrategia. Por ejemplo, un enlace sin prefijo es correcto en la locale por defecto de un sitio prefix-no-default, y un enlace sin ?lang= abandona la locale en un sitio search-params.

    Stack detectada

    Frameworks, librerías 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…), sistemas de gestión de traducción (Crowdin, Phrase, Lokalise, locize, Transifex, Tolgee, Localazy, SimpleLocalize, Localizely, Smartling, Intlayer CMS) y proxies de traducción (Weglot, Localize, GTranslate…) se identifican a partir del HTML, los recursos cargados y los bundles de JavaScript. El modo profundo también lee variables globales de window y cookies.

    Qué se comprueba

    ComprobaciónDescripciónPeso de la puntuación
    html lang<html lang> está presente y es una etiqueta BCP 47 válida9
    html dirdir="rtl" está configurado para idiomas de derecha a izquierda (ltr es el valor por defecto)3
    locale signals consistent<html lang>, la locale de la URL y la entrada hreflang propia coinciden5
    og:localeog:locale está configurado y coincide con <html lang>3
    canonicalExiste un enlace canónico y no apunta a otra versión de idioma10
    hreflangExisten etiquetas hreflang, con códigos válidos, URLs absolutas, sin duplicados y con auto-referencia9
    x-default hreflangExiste una alternativa hreflang x-default7
    hreflang alternates link backLas alternativas responden con un 200, no están redirigidas, devuelven el enlace y declaran el idioma8
    localized linksLos enlaces internos apuntan a la locale de la página8
    all links keep the localeNingún enlace interno cambia o descarta la locale6
    language switcherExisten enlaces <a href> rastreables hacia las otras versiones de idioma6
    robots.txt present/robots.txt devuelve una respuesta 20010
    robots.txt localized URLsNi el sitio ni sus URLs localizadas están bloqueadas para Googlebot8
    sitemap presentSe encuentra un sitemap (directivas Sitemap: en robots.txt, /sitemap.xml, /sitemap_index.xml)10
    sitemap locale coverageCada locale está listada, y las entradas con alternativas se listan a sí mismas9
    sitemap alternatesEl sitemap contiene enlaces alternativos hreflang8
    sitemap x-defaultEl sitemap contiene un hreflang x-default7
    unused bundle contentEl bundle principal de JS no envía traducciones de otras locales8

    Una advertencia otorga la mitad del peso. La puntuación final es la suma ponderada de las comprobaciones ejecutadas, expresada como un porcentaje (0–100). Las comprobaciones fallidas imprimen los primeros problemas encontrados; use --json para obtener los detalles completos.

    Uso programático de la función de escaneo

    La función scan también se exporta desde @intlayer/cli para que pueda llamarse desde sus propios scripts:

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

    Para un acceso de nivel inferior, scanWebsite de @intlayer/engine/scan devuelve un objeto ScanResult estructurado:

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