Incrusta o referencia JavaScript. Sin atributos, bloquea el parser HTML.
defer descarga en paralelo y ejecuta en orden tras parsear el documento.
async ejecuta en cuanto descarga, sin orden garantizado.
type="module" activa módulos ES6 e implica defer.
Regla general: pon los scripts al final del <body>
o usa defer.
<!-- Inline -->
<script>
console.log('Hola');
</script>
<!-- Externo con defer -->
<script src="app.js" defer></script>
<!-- Async (sin orden) -->
<script src="plugin.js" async></script>
Define contenido alternativo que se muestra cuando JavaScript está deshabilitado o no soportado. En el <head> solo puede contener <link>, <style> y <meta>. En el <body> puede incluir cualquier HTML. Es útil para mensajes de aviso, redirecciones de emergencia (<meta http-equiv="refresh"> dentro) y garantizar que el contenido crítico sea accesible en entornos sin JavaScript.
Aunque pocos usuarios desactivan JavaScript, algunos bots y crawlers no lo ejecutan. Un <noscript> con contenido alternativo mejora la indexación en motores de búsqueda menos avanzados y sirve como red de seguridad para progressive enhancement.
<noscript>
<p>Por favor, activa JavaScript
para usar este sitio.</p>
</noscript>
Atributo para <img> e <iframe> que aplaza la carga hasta que el elemento está a punto de entrar al viewport (lazy loading nativo, sin JavaScript). Valores: lazy (carga diferida), eager (carga inmediata, por defecto), auto (decisión del navegador). Reduce significativamente el tiempo de carga inicial y el consumo de datos, especialmente en páginas con muchas imágenes.
lazyenumCarga diferida: el recurso se descarga cuando entra en el viewport
eagerenumCarga inmediata sin importar la posición (comportamiento por defecto)
Nunca uses loading="lazy" en imágenes que están en el viewport al cargar la página (above-the-fold). Retrasaría el LCP (Largest Contentful Paint) y perjudicaría los Core Web Vitals. Úsalo solo para imágenes por debajo del fold.
<img src="foto.jpg"
alt="Foto"
loading="lazy"
width="800" height="600">
<iframe src="mapa.html"
loading="lazy">
</iframe>
srcset lista versiones de la imagen con su ancho (descriptor w)
o densidad de píxeles (2x). sizes le dice al navegador
cuánto espacio ocupará la imagen en diferentes viewports, para que pueda elegir
la fuente óptima antes de descargar CSS. Siempre incluye un
src como fallback para navegadores sin soporte.
<img
srcset="img-320.jpg 320w,
img-768.jpg 768w,
img-1280.jpg 1280w"
sizes="(max-width:600px) 320px,
(max-width:1024px) 768px,
1280px"
src="img-1280.jpg"
alt="Imagen responsiva">
Meta tags que controlan la presentación en redes sociales y aplicaciones de mensajería.
Open Graph (Facebook, LinkedIn, WhatsApp): usa prefijo property="og:…".
Twitter/X Cards: usa prefijo name="twitter:…".
La imagen OG ideal: 1200×630 px, menos de 1 MB.
Verifica tu resultado en las herramientas de depuración de cada red.
<!-- Open Graph -->
<meta property="og:title"
content="Mi Página">
<meta property="og:image"
content="thumb.jpg">
<meta property="og:description"
content="Descripción">
<!-- Twitter Card -->
<meta name="twitter:card"
content="summary_large_image">
Los dos <meta> más importantes de cualquier página. charset="UTF-8" debe ser el primero en el <head> (antes del <title>) para que el navegador codifique correctamente el título y todo el documento, incluyendo caracteres especiales. viewport controla el comportamiento en pantallas móviles: sin él, los móviles simulan una pantalla de escritorio y hacen zoom out, rompiendo cualquier diseño responsive.
No añadas user-scalable=no ni maximum-scale=1 al viewport. Deshabilitar el zoom del usuario viola las pautas de accesibilidad (WCAG 1.4.4) y perjudica a personas con baja visión que necesitan ampliar el contenido.
<!-- Siempre los primeros en head -->
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width,
initial-scale=1.0">
Instrucciones al navegador para optimizar la carga de recursos críticos o anticipar conexiones futuras.
<!-- preload: recurso crítico para el render actual -->
<link rel="preload" href="hero.jpg" as="image">
<link rel="preload" href="font.woff2" as="font" crossorigin>
<!-- prefetch: recurso probable en la próxima navegación -->
<link rel="prefetch" href="/pagina-siguiente">
<!-- preconnect: abre conexión a un origen externo -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<!-- dns-prefetch: solo resuelve DNS (fallback) -->
<link rel="dns-prefetch" href="//cdn.ejemplo.com">
<!-- modulepreload: módulo JS con sus dependencias -->
<link rel="modulepreload" href="/js/app.js">
Describe el contenido de tu página en un formato legible por máquinas. Google lo usa para Rich Snippets en los resultados de búsqueda.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Guía de HTML y CSS",
"author": {
"@type": "Person",
"name": "Tu Nombre"
},
"datePublished": "2024-01-15",
"image": "https://ejemplo.com/thumb.jpg"
}
</script>
<!-- Otros tipos: Product, Recipe, FAQ,
HowTo, BreadcrumbList, Event... -->
Archivo JSON que hace tu sitio instalable como app nativa. Controla nombre, iconos, colores y comportamiento al lanzarse.
<!-- En el <head> -->
<link rel="manifest" href="/manifest.json">
<meta name="theme-color" content="#0f172a">
// manifest.json
{
"name": "BryanDocs",
"short_name": "Explorer",
"start_url": "/",
"display": "standalone",
"background_color": "#f4f6fb",
"theme_color": "#0f172a",
"icons": [
{ "src": "/icon-192.png", "sizes": "192x192" },
{ "src": "/icon-512.png", "sizes": "512x512" }
]
}
Controlan cuándo se descarga y ejecuta el JavaScript respecto al parsing del HTML. La elección incorrecta puede bloquear el render.
■parse HTML ■descarga ■ejecuta
type="module" → siempre defer + scope propio
defer → ejecuta en orden tras parsear
async → ejecuta al terminar descarga (sin orden)
(sin nada) → bloquea el parser