Busca en todas las páginas de la documentación
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
import { prefetchDNS, preconnect, preload, preinit } from "react-dom";
function App() {
// Carga y ejecuta un script ansiosamente
preinit("https://cdn.example.com/analytics.js", { as: "script" });
// Precarga una fuente (descarga temprano, usa luego)
preload("https://fonts.example.com/inter.woff2", {
as: "font",
type: "font/woff2",
crossOrigin: "anonymous",
});
// Precarga una hoja de estilos
preload("https://cdn.example.com/theme.css", { as: "style" });
// Prefetch de DNS para un dominio que solicitarás luego
prefetchDNS("https://api.example.com");
// Preconnect (DNS + TCP + TLS) para un dominio que solicitarás pronto
preconnect("https://images.example.com");
return <main>{/* ... */}</main>;
}Cuándo usarlo: Usa estas APIs para mejorar la carga inicial de la página y el rendimiento de la navegación del lado del cliente indicándole al navegador acerca de los recursos que necesitará antes de que React renderice los componentes que los usan.
// Una página que precarga todos los recursos críticos para un rendimiento óptimo
import { Suspense } from "react";
import { preload, preinit, preconnect } from "react-dom";
// Precarga recursos críticos a nivel de módulo (se ejecuta una vez al importar)
preconnect("https://api.myapp.com");
preload("/fonts/brand-bold.woff2", { as: "font", type: "font/woff2", crossOrigin: "anonymous" });
preload("/fonts/brand-regular.woff2", { as: "font", type: "font/woff2", crossOrigin: "anonymous" });
function CriticalCSS() {
return (
<>
{/* React deduplicates y gestiona el ordenamiento de carga de hojas de estilos via precedence */}
<link rel="stylesheet" href="/styles/reset.css" precedence="reset" />
<link rel="stylesheet" href="/styles/base.css" precedence="default" />
<link rel="stylesheet" href="/styles/theme.css" precedence="high" />
</>
);
}
function HeavyWidget() {
// Preinit un script necesario por este widget
preinit("/scripts/chart-library.js", { as: "script" });
return (
<div className="widget">
<h2>Dashboard de Ventas</h2>
<div id="chart-container" />
</div>
);
}
function ImageGallery({ images }: { images: { src: string; alt: string }[] }) {
// Precarga las primeras imágenes para visualización instantánea
images.slice(0, 3).forEach((img) => {
preload(img.src, { as: "image" });
});
return (
<div className="grid grid-cols-3 gap-4">
{images.map((img, i) => (
<img
key={i}
src={img.src}
alt={img.alt}
loading={i < 3 ? "eager" : "lazy"}
/>
))}
</div>
);
}
export default function DashboardPage() {
return (
<>
<CriticalCSS />
<title>Dashboard | MyApp</title>
<header>
<h1>Dashboard</h1>
</header>
<Suspense fallback={<p>Cargando widget...</p>}>
<HeavyWidget />
</Suspense>
<Suspense fallback={<p>Cargando galería...</p>}>
<ImageGallery
images={[
{ src: "/images/product-1.jpg", alt: "Producto 1" },
{ src: "/images/product-2.jpg", alt: "Producto 2" },
{ src: "/images/product-3.jpg", alt: "Producto 3" },
{ src: "/images/product-4.jpg", alt: "Producto 4" },
{ src: "/images/product-5.jpg", alt: "Producto 5" },
{ src: "/images/product-6.jpg", alt: "Producto 6" },
]}
/>
</Suspense>
</>
);
}Lo que esto demuestra:
preconnect estableciendo conexiones tempranas a dominios de APIpreload para fuentes a nivel de módulo (antes de que cualquier componente se renderice)<link rel="stylesheet" precedence={}> para CSS ordenado y deduplicadopreinit cargando ansiosamente un script de terceros dentro de un componentepreload para imágenes para acelerar el renderizado above-the-foldpreload(href, options) -- Inserta una etiqueta <link rel="preload"> en el documento. El navegador descarga el recurso con alta prioridad pero no lo ejecuta ni lo aplica. Úsalo para fuentes, imágenes, hojas de estilos y scripts que necesitarás pronto.preinit(href, options) -- Descarga y ejecuta/aplica el recurso inmediatamente. Para scripts, esto significa que el script se ejecuta. Para hojas de estilos, esto significa que el CSS se aplica. Úsalo cuando necesites el recurso activo de inmediato.prefetchDNS(href) -- Inserta una sugerencia <link rel="dns-prefetch">. El navegador resuelve el nombre de dominio temprano. Opción más económica -- úsala cuando puedas solicitar desde este dominio.preconnect(href) -- Inserta un <link rel="preconnect">. El navegador realiza handshake de DNS + TCP + TLS temprano. Úsalo cuando definitivamente solicitarás desde este dominio pronto.href.<link> apropiadas en el <head> de HTML y como Early Hints (103 Early Hints) si el servidor lo soporta.<link rel="stylesheet" precedence={}> le dice a React que gestione la hoja de estilos. React suspenderá el renderizado del componente hasta que la hoja de estilos se cargue, evitando un flash de contenido sin estilos.Precargando al pasar el ratón (predictivo):
"use client";
import { preload } from "react-dom";
import Link from "next/link";
function NavLink({ href, children }: { href: string; children: React.ReactNode }) {
function handleMouseEnter() {
// Precarga el CSS y la imagen hero de la página cuando el usuario pasa el ratón
preload(`/styles${href}.css`, { as: "style" });
preload(`/images${href}-hero.jpg`, { as: "image" });
}
return (
<Link href={href} onMouseEnter={handleMouseEnter}>
{children}
</Link>
);
}Precarga condicional basada en viewport:
"use client";
import { useEffect } from "react";
import { preload } from "react-dom";
function AdaptiveLoader() {
useEffect(() => {
const connection = (navigator as any).connection;
if (connection?.effectiveType === "4g") {
// Solo precarga recursos pesados en conexiones rápidas
preload("/videos/hero.mp4", { as: "video" });
preload("/fonts/display.woff2", { as: "font", crossOrigin: "anonymous" });
}
}, []);
return null;
}Precarga a nivel de módulo (se ejecuta al importar):
import { preconnect, preload } from "react-dom";
// Estas se ejecutan cuando el módulo se importa, antes de que cualquier componente se renderice
preconnect("https://cdn.example.com");
preload("https://cdn.example.com/critical.css", { as: "style" });
export default function Page() {
return <div>Contenido que necesita recursos de cdn.example.com</div>;
}"react-dom".preload(href: string, options: { as: string; crossOrigin?: string; type?: string; fetchPriority?: "high" | "low" | "auto" }).preinit(href: string, options: { as: "script" | "style"; crossOrigin?: string; fetchPriority?: "high" | "low" | "auto"; nonce?: string }).prefetchDNS(href: string) y preconnect(href: string, options?: { crossOrigin?: string }) tienen opciones mínimas.precedence en <link rel="stylesheet"> se tipifica como string.preinit ejecuta scripts inmediatamente -- Si el script tiene efectos secundarios o depende de elementos DOM que aún no se han renderizado, puede fallar. Solución: Usa preload en su lugar y añade una etiqueta <script> cuando el DOM esté listo, o asegúrate de que el script maneja elementos DOM faltantes correctamente.preload deben especificar crossOrigin: "anonymous" incluso para fuentes same-origin, según la especificación de Fetch. Solución: Siempre incluye crossOrigin: "anonymous" para precargas de fuentes.precedence no es gestionada -- Si omites precedence de un <link rel="stylesheet">, React no lo deduplicará ni suspenderá para él. Solución: Añade precedence a todos los enlaces de hojas de estilos que quieras que React gestione.| Enfoque | Cuándo elegir |
|---|---|
| APIs de precarga de React DOM | React 19 integrado, funciona con SSR y renderizado del cliente |
HTML <link> en template <head> | Recursos estáticos conocidos en tiempo de construcción |
Componente <Script> de Next.js | Proyectos Next.js que necesitan estrategias de carga de scripts |
@next/font / next/font | Optimización de fuentes de Next.js con subsetting automático |
document.createElement("link") manual | Casos raros que necesitan control programático fuera de React |
| Resource hints vía HTTP headers | Optimización a nivel de servidor (103 Early Hints) |
preload descarga el recurso con alta prioridad pero no lo ejecuta ni lo aplicapreinit descarga y ejecuta/aplica el recurso inmediatamente (los scripts se ejecutan, el CSS se aplica)preload para recursos que necesitarás pronto; usa preinit cuando los necesites activos de inmediatoprefetchDNS solo resuelve el nombre de dominio (búsqueda de DNS) -- opción más económicapreconnect realiza handshake de DNS + TCP + TLS -- más caro pero ahorra más tiempoprefetchDNS cuando puedas solicitar de un dominio; usa preconnect cuando definitivamente lo harás prontohrefpreload("/fonts/brand.woff2", {
as: "font",
type: "font/woff2",
crossOrigin: "anonymous", // requerido para todas las fuentes
});Debes incluir crossOrigin: "anonymous" incluso para fuentes same-origin, según la especificación de Fetch.
function NavLink({ href, children }) {
function handleMouseEnter() {
preload(`/styles${href}.css`, { as: "style" });
preload(`/images${href}-hero.jpg`, { as: "image" });
}
return (
<a href={href} onMouseEnter={handleMouseEnter}>
{children}
</a>
);
}<link rel="stylesheet" precedence="default"> le dice a React que gestione la hoja de estilosprecedence se agrupan juntas en <head><link> en el <head> de HTML y como 103 Early Hints si el servidor lo soportauseEffect(() => {
const conn = (navigator as any).connection;
if (conn?.effectiveType === "4g") {
preload("/videos/hero.mp4", { as: "video" });
preload("/fonts/display.woff2", {
as: "font",
crossOrigin: "anonymous",
});
}
}, []);preinit ejecuta scripts inmediatamente, lo que puede fallar si el script depende de elementos DOM que no se han renderizadopreload en su lugar y añade una etiqueta <script> cuando el DOM esté listopreload(href: string, options: {
as: string;
crossOrigin?: string;
type?: string;
fetchPriority?: "high" | "low" | "auto";
}): void;
preinit(href: string, options: {
as: "script" | "style";
crossOrigin?: string;
fetchPriority?: "high" | "low" | "auto";
nonce?: string;
}): void;Las cuatro funciones se importan de "react-dom".
precedence se tipifica como string en <link rel="stylesheet">"reset", "default", e "high"Revisado por Chris St. John·Última actualización: 7 jul 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥