Nuxt App Head Favicon: Mastering useHead for Icon Control
You've shipped a Nuxt app and the default favicon is still showing in the tab. Worse, your marketing team wants different icons on the checkout page and the admin dashboard. Hard-coding link tags won't cut it — Nuxt gives you programmatic control through the app.head config and the useHead composable, and understanding both is the difference between fighting your framework and letting it work for you.
This guide focuses specifically on managing your favicon through Nuxt's head configuration system, not the file-based metadata approach covered in our Nuxt favicon guide. If you need per-page icons, dark mode toggling, or runtime swaps, the head API is what you want.
Prerequisites
Nuxt 3.x or 4.x project
Generated favicon files (PNG, SVG, ICO) — check our favicon sizes guide if you're unsure which you need
Basic familiarity with Vue 3 <script setup> blocks
Step 1: Set a Default Favicon via app.head
The app.head property in nuxt.config.ts is the framework-wide default. Anything you put here gets injected into every page's <head> unless a page overrides it.
Place your icon files in the public/ directory so Nuxt serves them at the root. According to the Nuxt SEO and meta documentation, the link array follows the same shape that the underlying unhead engine accepts, which in turn matches the WHATWG rel="icon" spec at html.spec.whatwg.org.
Step 2: Override the Favicon Per Page with useHead
Sometimes you want a different icon on specific routes. The useHead composable lets you push entries that override the global config for that page only.
Call useHead() at the top of your <script setup> block. Nuxt handles SSR injection, so the override is present in the initial HTML — no flash of the wrong icon on hydration, no client-side patching needed.
Step 3: Swap Favicons Dynamically Based on State
Want the favicon to react to a notification count or theme change? Combine useHead with a reactive ref or computed.
The computed href updates whenever cartCount changes. Nuxt's useHead tracks the reactivity and rewrites the <link> tag in place — no full page reload, no manual DOM manipulation. If you want to push this further with canvas-based badges, the underlying pattern is covered in our dynamic favicon JavaScript guide.
Step 4: Support Dark Mode Favicons
Modern browsers honor media attributes on icon links. Pair this with useHead and you get theme-aware icons without any JavaScript at all.
The browser picks the right one based on the user's system preference. This is the same pattern described in our favicon dark mode guide, but driven through Nuxt's head API instead of raw HTML.
Common Pitfalls
Putting useHead in a deeply nested child component. It still works, but SSR timing gets unpredictable and you risk duplicate tags. Keep it in the page-level <script setup>.
Forgetting the type attribute. When multiple rel="icon" links share a path or filename, browsers may serve the wrong file. Always set type for clarity.
Mixing file-based metadata with useHead. Nuxt's file-based icons (in app/ or public/) can collide with explicit app.head entries and produce duplicate <link> tags. Pick one approach per project.
Hardcoded absolute paths. Use root-relative paths like /favicon.svg so the icon loads correctly across routes, subdomains, and behind reverse proxies.
Wrapping Up
The app.head config handles your defaults; useHead handles everything dynamic. Together they cover every favicon scenario Nuxt apps typically need — from a single static icon to per-page swaps and reactive badges — without reaching for third-party head plugins or fighting Nuxt's defaults.
If you haven't generated your icon files yet, Mzu favicondl produces the full multi-resolution package (SVG, PNG, ICO, Apple Touch) in one click. Drop the files into public/, wire them into app.head, and your tabs will look professional within minutes.
Nuxt 앱을 배포했는데 아직도 탭에 기본 favicon이 표시되고 있나요? 더 나쁜 것은 마케팅 팀이 결제 페이지와 관리자 대시보드에 각각 다른 아이콘을 원한다는 것입니다. link 태그를 하드코딩하는 것으로는 충분하지 않습니다. Nuxt는 app.head 설정과 useHead 컴포저블을 통해 프로그래밍 방식으로 제어할 수 있는 방법을 제공하며, 이 둘을 이해하는 것이 프레임워크와 싸우는 것과 프레임워크가 알아서 동작하게 하는 것의 차이를 만듭니다.
이 가이드는 파일 기반 메타데이터 접근 방식이 아닌 Nuxt의 head 구성 시스템을 통해 favicon을 관리하는 데 초점을 맞춥니다. 파일 기반 방식에 대한 내용은 Nuxt favicon 가이드를 참조하세요. 페이지별 아이콘, 다크 모드 전환 또는 런타임 교체가 필요하다면 head API가 바로 그 해답입니다.
사전 요구 사항
Nuxt 3.x 또는 4.x 프로젝트
생성된 favicon 파일(PNG, SVG, ICO) — 어떤 파일이 필요한지 잘 모르겠다면 favicon 크기 가이드를 확인하세요.
Vue 3 <script setup> 블록에 대한 기본적인 이해
1단계: app.head로 기본 Favicon 설정
nuxt.config.ts의 app.head 속성은 프레임워크 전체의 기본값입니다. 여기에 정의된 내용은 페이지에서 재정의하지 않는 한 모든 페이지의 <head>에 주입됩니다.
아이콘 파일을 public/ 디렉토리에 배치하면 Nuxt가 루트에서 파일을 제공합니다. Nuxt SEO 및 메타 문서에 따르면 link 배열은 내부적으로 사용되는 unhead 엔진이 허용하는 형태와 동일하며, 이는 html.spec.whatwg.org의 WHATWG rel="icon" 사양과 일치합니다.
2단계: useHead로 페이지별 Favicon 재정의
특정 라우트에 다른 아이콘을 사용하고 싶을 때가 있습니다. useHead 컴포저블을 사용하면 해당 페이지에서만 전역 설정을 재정의하는 항목을 추가할 수 있습니다.
computed href는 cartCount가 변경될 때마다 업데이트됩니다. Nuxt의 useHead는 반응성을 추적하고 <link> 태그를 제자리에서 다시 작성합니다. 전체 페이지를 다시 로드하거나 수동으로 DOM을 조작할 필요가 없습니다. 캔버스 기반 배지로 더 확장하려면 동적 favicon JavaScript 가이드에서 기본 패턴을 다룹니다.
4단계: 다크 모드 Favicon 지원
최신 브라우저는 아이콘 링크의 media 속성을 지원합니다. 이를 useHead와 결합하면 JavaScript 없이도 테마를 인식하는 아이콘을 얻을 수 있습니다.
브라우저는 사용자의 시스템 기본 설정에 따라 올바른 아이콘을 선택합니다. 이는 favicon 다크 모드 가이드에서 설명한 것과 동일한 패턴이지만, 원시 HTML 대신 Nuxt의 head API를 통해 구현됩니다.
일반적인 함정
깊이 중첩된 하위 컴포넌트에서 useHead를 호출하는 경우. 작동은 하지만 SSR 타이밍이 예측 불가능해지고 중복 태그가 발생할 수 있습니다. 페이지 레벨의 <script setup>에 유지하세요.
type 속성을 잊는 경우. 여러 rel="icon" 링크가 동일한 경로나 파일 이름을 공유하면 브라우저가 잘못된 파일을 제공할 수 있습니다. 명확성을 위해 항상 type을 설정하세요.
파일 기반 메타데이터와 useHead를 혼합하는 경우. Nuxt의 파일 기반 아이콘(app/ 또는 public/ 디렉토리)은 명시적인 app.head 항목과 충돌하여 중복된 <link> 태그를 생성할 수 있습니다. 프로젝트당 하나의 접근 방식을 선택하세요.
하드코딩된 절대 경로./favicon.svg와 같은 루트 상대 경로를 사용하여 라우트, 서브도메인, 리버스 프록시 뒤에서도 아이콘이 올바르게 로드되도록 하세요.
마무리
app.head 설정은 기본값을 처리하고 useHead는 모든 동적 요소를 처리합니다. 이 둘을 함께 사용하면 단일 정적 아이콘에서 페이지별 교체, 반응형 배지에 이르기까지 Nuxt 앱에서 일반적으로 필요한 모든 favicon 시나리오를 처리할 수 있으며, 타사 head 플러그인에 의존하거나 Nuxt의 기본값과 싸울 필요가 없습니다.
아직 아이콘 파일을 생성하지 않았다면 Mzu favicondl에서 전체 다중 해상도 패키지(SVG, PNG, ICO, Apple Touch)를 한 번의 클릭으로 생성할 수 있습니다. 파일을 public/에 넣고 app.head에 연결하면 몇 분 안에 탭이 전문적으로 보일 것입니다.
Has lanzado una aplicación Nuxt y el favicon por defecto todavía aparece en la pestaña del navegador. Peor aún, tu equipo de marketing quiere iconos diferentes en la página de pago y en el panel de administración. Hardcodear etiquetas link no es suficiente: Nuxt te da control programático a través de la configuración app.head y el composable useHead. Entender ambos es la diferencia entre luchar contra tu framework y dejar que trabaje para ti.
Esta guía se centra específicamente en gestionar tu favicon mediante el sistema de configuración de head de Nuxt, no en el enfoque de metadatos basado en archivos que cubrimos en nuestra guía de favicon para Nuxt. Si necesitas iconos por página, alternancia de modo oscuro o cambios en tiempo de ejecución, la API de head es lo que buscas.
Prerrequisitos
Proyecto Nuxt 3.x o 4.x
Archivos de favicon generados (PNG, SVG, ICO) — consulta nuestra guía de tamaños de favicon si no estás seguro de cuáles necesitas
Familiaridad básica con bloques <script setup> de Vue 3
Paso 1: Establecer un favicon por defecto mediante app.head
La propiedad app.head en nuxt.config.ts es el valor por defecto a nivel de framework. Todo lo que pongas aquí se inyecta en el <head> de cada página, a menos que una página lo sobrescriba.
Coloca tus archivos de icono en el directorio public/ para que Nuxt los sirva desde la raíz. Según la documentación de SEO y meta de Nuxt, el array link sigue la misma forma que acepta el motor subyacente unhead, que a su vez coincide con la especificación WHATWG para rel="icon" en html.spec.whatwg.org.
Paso 2: Sobrescribir el favicon por página con useHead
A veces quieres un icono diferente en rutas específicas. El composable useHead te permite insertar entradas que sobrescriben la configuración global solo para esa página.
Llama a useHead() al inicio de tu bloque <script setup>. Nuxt maneja la inyección SSR, por lo que la sobrescritura está presente en el HTML inicial — sin parpadeo del icono incorrecto durante la hidratación, sin necesidad de parcheo en el cliente.
Paso 3: Intercambiar favicons dinámicamente según el estado
¿Quieres que el favicon reaccione a un contador de notificaciones o a un cambio de tema? Combina useHead con un ref reactivo o un computed.
El href computado se actualiza cada vez que cambia cartCount. El useHead de Nuxt rastrea la reactividad y reescribe la etiqueta <link> en su lugar — sin recargar la página, sin manipulación manual del DOM. Si quieres llevar esto más allá con insignias basadas en canvas, el patrón subyacente se cubre en nuestra guía de favicon dinámico con JavaScript.
Paso 4: Soporte de favicons en modo oscuro
Los navegadores modernos respetan los atributos media en los enlaces de icono. Combínalo con useHead y obtendrás iconos conscientes del tema sin necesidad de JavaScript.
El navegador elige el correcto según la preferencia del sistema del usuario. Este es el mismo patrón descrito en nuestra guía de favicon en modo oscuro, pero impulsado a través de la API de head de Nuxt en lugar de HTML crudo.
Errores comunes
Poner useHead en un componente hijo profundamente anidado. Aún funciona, pero el tiempo de SSR se vuelve impredecible y corres el riesgo de etiquetas duplicadas. Mantenlo en el <script setup> a nivel de página.
Olvidar el atributo type. Cuando múltiples enlaces rel="icon" comparten una ruta o nombre de archivo, los navegadores pueden servir el archivo incorrecto. Siempre establece type para mayor claridad.
Mezclar metadatos basados en archivos con useHead. Los iconos basados en archivos de Nuxt (en app/ o public/) pueden colisionar con entradas explícitas de app.head y producir etiquetas <link> duplicadas. Elige un enfoque por proyecto.
Rutas absolutas hardcodeadas. Usa rutas relativas a la raíz como /favicon.svg para que el icono se cargue correctamente en todas las rutas, subdominios y detrás de proxies inversos.
Conclusión
La configuración app.head maneja tus valores por defecto; useHead maneja todo lo dinámico. Juntos cubren todos los escenarios de favicon que las aplicaciones Nuxt suelen necesitar — desde un icono estático único hasta intercambios por página e insignias reactivas — sin recurrir a plugins de head de terceros ni luchar contra los valores por defecto de Nuxt.
Si aún no has generado tus archivos de icono, Mzu favicondl produce el paquete completo de múltiples resoluciones (SVG, PNG, ICO, Apple Touch) con un clic. Coloca los archivos en public/, conéctalos en app.head, y tus pestañas se verán profesionales en cuestión de minutos.
Generate Your Nuxt Favicon Package
Get every favicon size and format your Nuxt app needs — SVG, PNG, ICO, and Apple Touch — in a single click.