Guía

Favicon para React

React no representa el `<head>`: el favicon vive en su index.html estático. Coloque su favicon.ico en la carpeta /public, vincúlelo en index.html y habrá terminado con lo básico. Las configuraciones modernas también incluyen una variante SVG con soporte para modo oscuro, un apple-touch-icon de 180 × 180 y un manifiesto web para indicaciones de instalación de PWA. El favicon generator produce todos los archivos que necesita a partir de una única imagen de origen. Consulte también how-to-add-favicon-html guide para obtener la referencia completa de la etiqueta de enlace.

Tanto en Vite como en la aplicación Create React (CRA), los archivos estáticos ubicados en el directorio /public se sirven directamente desde la URL raíz sin ningún procesamiento de paquete. Esto significa que se puede acceder a /public/favicon.ico en https://yourdomain.com/favicon.ico, que es exactamente la ruta que los navegadores prueban primero para un favicon. No se necesita ningún cargador de paquetes web, complemento Vite ni configuración de compilación para la configuración básica de .ico.

Cuando crea un nuevo proyecto Vite React con `npm create vite@latest`, el andamio ya coloca un favicon.svg en /public y hace referencia a él en index.html. Este es un buen punto de partida, pero el SVG predeterminado es un ícono genérico de Vite. Reemplácelo con su propio SVG y agregue un respaldo .ico de varios tamaños para los navegadores que no admiten favicons SVG.

Crear andamios de aplicaciones React incluyen un favicon.ico en /public de forma predeterminada. Para reemplazarlo, simplemente sobrescriba el archivo con su propio .ico de varios tamaños. CRA también incluye manifest.json en /public: actualice las entradas de la matriz `icons` para que apunten a sus propios archivos PNG (192×192 y 512×512). El index.html en /public ya tiene la etiqueta de enlace de manifiesto insertada por CRA.

El .ico de varios tamaños sigue siendo el archivo más importante. Los navegadores que no admiten favicons SVG (versiones Safari anteriores, algunas herramientas de incrustación y creación de accesos directos Windows) recurren automáticamente a /favicon.ico. Un único archivo .ico agrupa fotogramas de 16×16, 32×32, 48×48 y 64×64 para que el navegador elija la resolución correcta sin etiquetas de enlace adicionales.

Para pantallas de alto DPI (Retina), agregue una etiqueta de enlace PNG explícita además del .ico. `<link rel='icon' type='image/png' sizes='32x32' href='/favicon-32x32.png'>` le dice al navegador que use PNG en pantallas retina donde un ícono 2x se muestra con mayor nitidez que el marco .ico de la misma resolución. Coloque tanto el .ico como el PNG en /public.

Los favicons SVG ofrecen la mejor solución preparada para el futuro para aplicaciones React. Un único archivo SVG se reproduce nítidamente en cualquier tamaño de pestaña y puede adaptar sus colores a la combinación de colores del usuario. Agregue `<link rel='icon' type='image/svg+xml' href='/favicon.svg'>` en index.html. Los navegadores que admiten favicons SVG lo prefieren al .ico; navegadores que no saltan simplemente a la siguiente etiqueta de enlace.

Los favicons SVG en modo oscuro son potentes en las aplicaciones React porque el público objetivo suele utilizar herramientas de desarrollo y escritorios en modo oscuro. Incrusta un bloque `<style>` dentro de tu SVG con `@media (prefers-color-scheme: dark) { :root { fill: white; } }` (ajustado a la estructura de tu ícono). Este único archivo sirve tanto para temas claros como oscuros sin JavaScript ni etiquetas adicionales.

Se requiere el apple-touch-icon si algún usuario móvil guardará su aplicación React en su pantalla de inicio. Coloque apple-touch-icon.png (180×180) en /public y agregue `<link rel='apple-touch-icon' size='180x180' href='/apple-touch-icon.png'>` a index.html. Sin esto, iOS muestra una captura de pantalla de baja resolución de la aplicación en lugar del ícono de su marca en la pantalla de inicio.

Para aplicaciones React implementadas como PWA, su /public/manifest.json (o site.webmanifest) debe incluir entradas de íconos en 192×192 y 512×512. Estos tamaños activan el mensaje de instalación de la pantalla de inicio Android y el cuadro de diálogo de instalación Chrome PWA. El favicon generator genera PNG y una plantilla de manifiesto precargada que puede colocar directamente en /public.

El enrutamiento es importante para los favicons en implementaciones SPA React. La ruta /favicon.ico debe ser servida directamente por su host, no interceptada por el enrutador React. Las páginas de Vercel, Netlify y GitHub ofrecen contenido /public en la raíz antes de pasar al SPA. Si aloja en un servidor personalizado, confirme que su middleware de archivos estáticos se ejecute antes de la ruta general que sirve index.html.

Durante el desarrollo con `npm run dev`, Vite recarga en caliente la mayoría de los cambios automáticamente, pero los cambios de favicon a veces requieren una actualización manual del navegador. Los navegadores almacenan en caché /favicon.ico por origen incluso entre recargas del servidor de desarrollo. Para forzar una actualización durante el desarrollo, realice una actualización forzada (Ctrl+Shift+R) o agregue una cadena de consulta como `/favicon.svg?v=2` en su etiqueta de enlace temporalmente.

En configuraciones de renderizado del lado del servidor (React con un servidor Express personalizado, por ejemplo), debe confirmar que el middleware express.static() sirve /public antes que el controlador SSR React. Si el controlador SSR detecta todas las solicitudes primero, /favicon.ico será procesado por React y devolverá HTML en lugar del archivo binario ICO, rompiendo el favicon por completo.

Las configuraciones de Monorepo con múltiples aplicaciones React necesitan una gestión cuidadosa de los favicon. La carpeta /public de cada aplicación tiene su propio favicon. Si comparte íconos entre aplicaciones, considere mantener un único directorio de íconos de fuente verdadera en la raíz de monorepo y copiar archivos en cada /public durante el paso de compilación. Herramientas como `cp` en el script de compilación o un complemento de sincronización de activos dedicado los mantienen sincronizados.

Después de la implementación, use favicon tester para verificar que todas las variantes de favicon sean accesibles públicamente. Ingrese su URL de producción y verifique que favicon.ico, favicon.svg, apple-touch-icon.png y su manifiesto PNG se resuelvan correctamente. Esto descarta el servicio de archivos estáticos mal configurados o rutas que funcionan en desarrollo pero se interrumpen en producción.

Cómo funciona

  1. 1

    Genera tu paquete de favicon

    Cargue un PNG o SVG de 512×512 al [favicon generator](tool:favicon-generator). Descargue el paquete que contiene favicon.ico, favicon.svg, apple-touch-icon.png, android-chrome-192x192.png, android-chrome-512x512.png y site.webmanifest.

  2. 2

    Copie todos los archivos a /public

    Coloque cada archivo del paquete en el directorio /public de su proyecto. Esto garantiza que Vite y CRA los proporcionen en la URL raíz (por ejemplo, https://yourdomain.com/favicon.ico).

  3. 3

    Actualice las etiquetas de enlace en index.html

    Abra /public/index.html (o index.html en la raíz del proyecto para Vite). Reemplace o agregue lo siguiente dentro de `<head>`: el enlace .ico, el enlace SVG, el enlace apple-touch-icon y el enlace de manifiesto. Copie el fragmento HTML generado del paquete de favicon README.

  4. 4

    Actualizar las entradas del icono manifest.json

    Para CRA, abra /public/manifest.json y actualice la matriz `icons` para hacer referencia a sus nuevos PNG de 192×192 y 512×512. Para Vite, cambie el nombre del site.webmanifest generado a manifest.json o mantenga el nombre de archivo original y asegúrese de que la etiqueta del enlace apunte a él.

  5. 5

    Prueba en desarrollo y producción.

    Actualice completamente el navegador durante el desarrollo para omitir el caché de favicon. Después de la implementación, use [favicon tester](utility:favicon-tester) para confirmar que todas las rutas de los íconos se resuelvan correctamente. En iOS, use 'Agregar a la pantalla de inicio' para verificar apple-touch-icon.

Pruébalo ahora

Crea un favicon listo para React

Generador de Favicon

Preguntas frecuentes

¿Dónde va el favicon en una aplicación Vite React?+

En el directorio /public: /public/favicon.ico, /public/favicon.svg, /public/apple-touch-icon.png. Todo en /public se sirve en la URL raíz sin ningún procesamiento de compilación.

¿Cómo reemplazo el favicon predeterminado de Vite?+

Reemplace /public/favicon.svg y /public/favicon.ico con sus propios archivos. Actualice también las etiquetas `<link>` en index.html si los hrefs difieren. Reinicie el servidor de desarrollo y actualice la pestaña del navegador para ver el cambio.

¿Cómo agrego un favicon en modo oscuro en React?+

Utilice un favicon SVG con un bloque de estilo `@media (prefers-color-scheme: dark)` incrustado que cambia el color de relleno o trazo de las rutas de sus iconos. Vincúlelo con `<link rel='icon' type='image/svg+xml' href='/favicon.svg'>` en index.html. No se necesita JavaScript.

¿Por qué no se actualiza mi favicon React en el navegador?+

Los navegadores almacenan en caché /favicon.ico por origen, incluso durante recargas de módulos activos. Actualice completamente la pestaña (Ctrl+Shift+R / Cmd+Shift+R), o agregue temporalmente una cadena de consulta de versión al href en su etiqueta de enlace para forzar una nueva recuperación.

¿Necesito configurar Vite o webpack para servir el favicon?+

No. Tanto Vite como CRA sirven automáticamente la carpeta /public en la URL raíz. No se necesita configuración de paquete para archivos favicon siempre que estén ubicados en /public.

¿Qué es manifest.json en un proyecto CRA y afecta al favicon?+

Es el manifiesto de la aplicación web el que habilita las indicaciones de instalación de PWA. Incluye entradas de iconos que apuntan a PNG en /public. Actualice las entradas de 192×192 y 512×512 para usar sus propios íconos para una visualización correcta durante la instalación de la pantalla de inicio de Android.

¿Puedo usar un favicon en un componente React en lugar de index.html?+

Sí, usando bibliotecas como react-helmet o el componente Head integrado de Next.js. Para Vite React, inyecte las etiquetas de enlace en index.html directamente; es el enfoque más simple y confiable ya que el archivo se procesa en el momento de la compilación.

Herramientas relacionadas

Más guías

Guías

Explorar FetchFavicon

Categorías

Convertidores

Utilidades

Guías

Tutoriales