If you’ve ever opened a Next.js site built with the App Router and saw a generic browser tab icon, the missing favicon is probably the result of an incomplete metadata setup.
Prerequisites
- A Next.js 13+ project that uses the
app directory.
- Node.js 18 or newer installed locally.
- An icon set (SVG, PNG, ICO) generated with Mzu favicondl. The favicon sizes guide can help you pick the right dimensions.
Step‑by‑step implementation
- Generate the icon files. Use Mzu favicondl to create at least three files:
favicon.svg – the preferred scalable format.
favicon.ico – legacy fallback for browsers that still request /favicon.ico.
apple-touch-icon.png – optional Apple Touch icon.
Save the files in the project’s public folder.
- Export metadata in
app/layout.tsx. The App Router reads a metadata export from layout files. Add an icons object that references the files you just placed.
<pre><code>export const metadata = {
title: 'My Next.js Site',
icons: {
icon: '/favicon.ico', // legacy fallback
shortcut: '/favicon.ico', // shortcut icon for older browsers
apple: '/apple-touch-icon.png', // Apple Touch icon (optional)
other: [
{ rel: 'icon', url: '/favicon.svg', type: 'image/svg+xml', sizes: 'any' }
]
}
};
</code></pre>
This matches the official file‑based metadata approach documented by Next.js.
- Verify the generated
<head> output. Run npm run dev and open the page source. You should see link tags similar to:
<link rel='icon' href='/favicon.ico'>
<link rel='shortcut icon' href='/favicon.ico'>
<link rel='apple-touch-icon' href='/apple-touch-icon.png'>
<link rel='icon' href='/favicon.svg' type='image/svg+xml' sizes='any'>
The tags are generated automatically; you do not need to write them manually.
- Test in multiple browsers. Open the site in Chrome, Safari, and Firefox. Each should display the SVG icon on high‑DPI screens and fall back to the ICO file on older versions.
- Chrome prefers SVG when
type='image/svg+xml' is present.
- Safari uses the Apple Touch icon for home‑screen shortcuts.
- Firefox respects the
rel='icon' entry and will cache the ICO file if the SVG is missing.
- Deploy. Push the changes to your hosting provider (Vercel, Netlify, etc.). The
public folder is served statically, so the icons are available immediately after the first build.
Common pitfalls
- Missing
public folder path. If the icons live outside public, the generated URLs will point to a non‑existent location and browsers will log 404 errors.
- Using only
rel='shortcut icon'. Modern browsers follow the rel='icon' specification (HTML spec). Relying solely on the legacy attribute can cause the SVG to be ignored.
- Cache‑related stale icons. Browsers aggressively cache
favicon.ico. Append a query string (e.g., /favicon.ico?v=2) or enable content hashing in your build to force an update.
- Incorrect MIME type. Serve
.svg with image/svg+xml and .ico with image/x-icon. A misconfigured server will cause browsers to reject the file.
Conclusion
By letting the App Router generate the <link> tags from a single metadata export, you keep the favicon configuration declarative and future‑proof. The steps above cover generation, placement, metadata export, verification, and deployment, so you can move from a blank tab icon to a polished brand presence in minutes.
Need a quick way to create the SVG and ICO files? Try Mzu favicondl – it produces the exact set of files required for the App Router approach.
Check the documented requirements
Next.js documents favicons and app icons in its metadata file conventions.
如果你打开使用 App Router 的 Next.js 站点时只看到一个通用的浏览器标签图标,通常是因为 metadata 配置不完整导致 favicon 缺失。
前置条件
逐步实现
- 生成图标文件。 使用 Mzu favicondl 创建至少三个文件:
favicon.svg – 推荐的可伸缩矢量格式。
favicon.ico – 为仍然请求 /favicon.ico 的旧浏览器提供的回退。
apple-touch-icon.png – 可选的 Apple Touch 图标。
将这些文件保存到项目的 public 目录。
- 在
app/layout.tsx 中导出 metadata。 App Router 会读取布局文件中的 metadata 导出。添加一个 icons 对象并指向刚才放置的文件。
<pre><code>export const metadata = {
title: 'My Next.js Site',
icons: {
icon: '/favicon.ico', // legacy fallback
shortcut: '/favicon.ico', // shortcut icon for older browsers
apple: '/apple-touch-icon.png', // Apple Touch icon (optional)
other: [
{ rel: 'icon', url: '/favicon.svg', type: 'image/svg+xml', sizes: 'any' }
]
}
};
</code></pre>
这符合 Next.js 官方文档中基于文件的 metadata 写法。
- 检查生成的
<head> 输出。 运行 npm run dev 并打开页面源码。你应该能看到类似以下的 link 标签:
<link rel='icon' href='/favicon.ico'>
<link rel='shortcut icon' href='/favicon.ico'>
<link rel='apple-touch-icon' href='/apple-touch-icon.png'>
<link rel='icon' href='/favicon.svg' type='image/svg+xml' sizes='any'>
这些标签由框架自动生成,无需手动编写。
- 在多个浏览器中测试。 在 Chrome、Safari 和 Firefox 中打开站点。高 DPI 屏幕应显示 SVG 图标,旧版浏览器则回退到 ICO 文件。
- Chrome 在存在
type='image/svg+xml' 时会优先使用 SVG。
- Safari 会使用 Apple Touch 图标作为首页快捷方式。
- Firefox 会遵循
rel='icon' 条目,如果缺少 SVG 则缓存 ICO 文件。
- 部署。 将修改推送到你的托管平台(Vercel、Netlify 等)。
public 文件夹是静态提供的,构建完成后图标即可立即生效。
常见坑点
- 缺少
public 文件夹路径。 若图标放在 public 之外,生成的 URL 会指向不存在的位置,浏览器会报 404 错误。
- 仅使用
rel='shortcut icon'。 现代浏览器遵循 rel='icon' 规范(HTML spec)。只依赖旧属性会导致 SVG 被忽略。
- 缓存导致的旧图标。 浏览器会强力缓存
favicon.ico。可以在 URL 后追加查询字符串(如 /favicon.ico?v=2)或在构建时启用内容哈希以强制更新。
- MIME 类型不正确。
.svg 必须以 image/svg+xml 响应,.ico 必须以 image/x-icon 响应。服务器配置错误会导致浏览器拒绝加载。
结论
让 App Router 通过单一的 metadata 导出自动生成 <link> 标签,可保持 favicon 配置声明式且具备未来兼容性。上述步骤涵盖了图标生成、放置、metadata 导出、验证以及部署,帮助你在几分钟内从空白标签图标升级为完整的品牌标识。
需要快速生成 SVG 与 ICO 文件?试试 Mzu favicondl——它会输出符合 App Router 需求的完整文件集。
查看官方要求
Next.js 在其 metadata file conventions 中对 favicons 与 app icons 进行了说明。
Next.js の App Router を使用したサイトを開いた際に、汎用的なブラウザタブアイコンが表示された場合、favicon が欠如しているのはメタデータ設定が不完全なためである可能性が高いです。
Prerequisites
Step‑by‑step implementation
- アイコンファイルを生成します。 Mzu favicondl を使用して、少なくとも次の 3 つのファイルを作成してください。
favicon.svg – 推奨されるスケーラブル形式。
favicon.ico – /favicon.ico を要求するブラウザ向けのレガシーフォールバック。
apple-touch-icon.png – 任意の Apple Touch アイコン。
これらのファイルをプロジェクトの public フォルダに保存します。
app/layout.tsx でメタデータをエクスポートします。 App Router はレイアウトファイルから metadata エクスポートを読み取ります。先ほど配置したファイルを参照する icons オブジェクトを追加してください。
<pre><code>export const metadata = {
title: 'My Next.js Site',
icons: {
icon: '/favicon.ico', // legacy fallback
shortcut: '/favicon.ico', // shortcut icon for older browsers
apple: '/apple-touch-icon.png', // Apple Touch icon (optional)
other: [
{ rel: 'icon', url: '/favicon.svg', type: 'image/svg+xml', sizes: 'any' }
]
}
};
</code></pre>
これは Next.js が公式にドキュメントしているファイルベースのメタデータアプローチに一致します。
- 生成された
<head> の出力を確認します。 npm run dev を実行し、ページのソースを開いてください。次のような link タグが出力されているはずです。
<link rel='icon' href='/favicon.ico'>
<link rel='shortcut icon' href='/favicon.ico'>
<link rel='apple-touch-icon' href='/apple-touch-icon.png'>
<link rel='icon' href='/favicon.svg' type='image/svg+xml' sizes='any'>
これらのタグは自動的に生成されるため、手動で記述する必要はありません。
- 複数のブラウザでテストします。 Chrome、Safari、Firefox でサイトを開いてください。各ブラウザは高 DPI 画面では SVG アイコンを表示し、古いバージョンでは ICO ファイルにフォールバックします。
- Chrome は
type='image/svg+xml' が存在する場合、SVG を優先します。
- Safari はホーム画面用ショートカットとして Apple Touch アイコンを使用します。
- Firefox は
rel='icon' エントリを尊重し、SVG が欠如している場合は ICO ファイルをキャッシュします。
- デプロイします。 変更をホスティングプロバイダー(Vercel、Netlify など)にプッシュしてください。
public フォルダは静的に配信されるため、ビルドが完了した直後からアイコンが利用可能になります。
Common pitfalls
public フォルダのパスが欠如している。 アイコンが public の外にある場合、生成された URL は存在しない場所を指し、ブラウザは 404 エラーを記録します。
rel='shortcut icon' のみを使用している。 現代のブラウザは rel='icon' 仕様(HTML spec)に従います。レガシー属性だけに依存すると SVG が無視される可能性があります。
- キャッシュに起因する古いアイコン。 ブラウザは
favicon.ico を積極的にキャッシュします。クエリ文字列(例:/favicon.ico?v=2)を付加するか、ビルド時にコンテンツハッシュを有効にして更新を強制してください。
- 不正な MIME タイプ。
.svg は image/svg+xml、.ico は image/x-icon で配信してください。サーバー設定が誤っているとブラウザはファイルを拒否します。
Conclusion
App Router が単一の metadata エクスポートから <link> タグを自動生成するようにすれば、favicon 設定を宣言的かつ将来にわたって保守しやすくなります。上記の手順は生成、配置、メタデータエクスポート、検証、デプロイを網羅しており、空白のタブアイコンから洗練されたブランド表現へ数分で移行できます。
SVG と ICO ファイルを手早く作成したい場合は、Mzu favicondl を試してください。App Router のアプローチに必要なファイル一式を生成してくれます。
Check the documented requirements
Next.js は metadata file conventions において favicon とアプリアイコンの取り扱いを文書化しています。
App Router를 사용해 만든 Next.js 사이트를 열었을 때 기본 브라우저 탭 아이콘만 보인다면, 파비콘이 누락된 원인은 메타데이터 설정이 불완전하기 때문일 가능성이 높습니다.
전제 조건
- Next.js 13 이상 버전이며
app 디렉터리를 사용하는 프로젝트.
- 로컬에 Node.js 18 이상이 설치되어 있어야 합니다.
- Mzu favicondl(링크)으로 생성한 아이콘 세트(SVG, PNG, ICO)가 필요합니다. 적절한 크기를 선택하려면 favicon 사이즈 가이드를 참고하십시오.
단계별 구현
- 아이콘 파일을 생성합니다. Mzu favicondl을 사용해 최소 세 개의 파일을 만듭니다:
favicon.svg – 권장되는 확장 가능한 형식.
favicon.ico – /favicon.ico를 여전히 요청하는 구형 브라우저용 대체 파일.
apple-touch-icon.png – 선택적인 Apple Touch 아이콘.
파일을 프로젝트의 public 폴더에 저장합니다.
app/layout.tsx에서 메타데이터를 내보냅니다. App Router는 레이아웃 파일에서 metadata export를 읽습니다. 방금 배치한 파일을 참조하는 icons 객체를 추가합니다.
<pre><code>export const metadata = {
title: 'My Next.js Site',
icons: {
icon: '/favicon.ico', // legacy fallback
shortcut: '/favicon.ico', // shortcut icon for older browsers
apple: '/apple-touch-icon.png', // Apple Touch icon (optional)
other: [
{ rel: 'icon', url: '/favicon.svg', type: 'image/svg+xml', sizes: 'any' }
]
}
};
</code></pre>
이는 Next.js에서 문서화한 파일 기반 메타데이터 방식과 일치합니다.
- 생성된
<head> 출력을 확인합니다. npm run dev를 실행하고 페이지 소스를 열면 다음과 유사한 link 태그가 표시됩니다:
<link rel='icon' href='/favicon.ico'>
<link rel='shortcut icon' href='/favicon.ico'>
<link rel='apple-touch-icon' href='/apple-touch-icon.png'>
<link rel='icon' href='/favicon.svg' type='image/svg+xml' sizes='any'>
태그는 자동으로 생성되므로 직접 작성할 필요가 없습니다.
- 다양한 브라우저에서 테스트합니다. Chrome, Safari, Firefox에서 사이트를 열어보십시오. 고해상도 화면에서는 SVG 아이콘이 표시되고, 구형 버전에서는 ICO 파일이 대체됩니다.
- Chrome은
type='image/svg+xml'가 지정된 경우 SVG를 우선 사용합니다.
- Safari는 홈 화면 바로가기를 위해 Apple Touch 아이콘을 사용합니다.
- Firefox는
rel='icon' 항목을 인식하며, SVG가 없을 경우 ICO 파일을 캐시합니다.
- 배포합니다. 변경 사항을 호스팅 제공업체(Vercel, Netlify 등)에 푸시합니다.
public 폴더는 정적으로 제공되므로 첫 빌드가 완료된 직후 아이콘을 사용할 수 있습니다.
자주 발생하는 실수
public 폴더 경로 누락. 아이콘이 public 외부에 있으면 생성된 URL이 존재하지 않는 위치를 가리키게 되며, 브라우저는 404 오류를 기록합니다.
rel='shortcut icon'만 사용. 최신 브라우저는 rel='icon' 사양(HTML spec)을 따릅니다. 레거시 속성만 의존하면 SVG가 무시될 수 있습니다.
- 캐시로 인한 오래된 아이콘. 브라우저는
favicon.ico를 적극적으로 캐시합니다. 쿼리 문자열(예: /favicon.ico?v=2)을 추가하거나 빌드 시 콘텐츠 해싱을 활성화해 업데이트를 강제하십시오.
- 잘못된 MIME 타입.
.svg는 image/svg+xml, .ico는 image/x-icon으로 제공해야 합니다. 서버 설정이 잘못되면 브라우저가 파일을 거부합니다.
결론
App Router가 단일 metadata export를 기반으로 <link> 태그를 자동 생성하도록 하면 파비콘 설정을 선언적이고 향후 확장 가능하게 유지할 수 있습니다. 위 단계는 아이콘 생성, 위치 지정, 메타데이터 내보내기, 검증, 배포까지 모두 포함하므로 빈 탭 아이콘을 몇 분 안에 완성된 브랜드 아이덴티티로 전환할 수 있습니다.
SVG와 ICO 파일을 빠르게 만들고 싶으신가요? Mzu favicondl을 사용해 보세요 – App Router 방식에 필요한 정확한 파일 세트를 생성합니다.
문서화된 요구 사항 확인
Next.js는 metadata 파일 규약에서 파비콘 및 앱 아이콘에 대해 문서화하고 있습니다.
Si alguna vez has abierto un sitio Next.js construido con el App Router y has visto un icono genérico en la pestaña del navegador, la falta de favicon probablemente se deba a una configuración incompleta de metadata.
Requisitos previos
- Un proyecto Next.js 13+ que use el directorio
app.
- Node.js 18 o superior instalado localmente.
- Un conjunto de iconos (SVG, PNG, ICO) generado con Mzu favicondl. La guía de tamaños de favicon puede ayudarte a elegir las dimensiones correctas.
Implementación paso a paso
- Generate the icon files. Use Mzu favicondl to create at least three files:
favicon.svg – el formato escalable preferido.
favicon.ico – fallback legado para navegadores que aún solicitan /favicon.ico.
apple-touch-icon.png – icono Apple Touch opcional.
Guarda los archivos en la carpeta public del proyecto.
- Export metadata in
app/layout.tsx. El App Router lee una exportación metadata de los archivos de layout. Añade un objeto icons que haga referencia a los archivos que acabas de colocar.
<pre><code>export const metadata = {
title: 'My Next.js Site',
icons: {
icon: '/favicon.ico', // legacy fallback
shortcut: '/favicon.ico', // shortcut icon for older browsers
apple: '/apple-touch-icon.png', // Apple Touch icon (optional)
other: [
{ rel: 'icon', url: '/favicon.svg', type: 'image/svg+xml', sizes: 'any' }
]
}
};
</code></pre>
Esto coincide con el enfoque oficial de metadata basado en archivos documentado por Next.js.
- Verify the generated
<head> output. Ejecuta npm run dev y abre el código fuente de la página. Deberías ver etiquetas link similares a:
<link rel='icon' href='/favicon.ico'>
<link rel='shortcut icon' href='/favicon.ico'>
<link rel='apple-touch-icon' href='/apple-touch-icon.png'>
<link rel='icon' href='/favicon.svg' type='image/svg+xml' sizes='any'>
Las etiquetas se generan automáticamente; no necesitas escribirlas a mano.
- Test in multiple browsers. Abre el sitio en Chrome, Safari y Firefox. Cada uno debería mostrar el icono SVG en pantallas de alta densidad y recurrir al archivo ICO en versiones más antiguas.
- Chrome prefiere SVG cuando está presente
type='image/svg+xml'.
- Safari usa el Apple Touch icon para accesos directos en la pantalla de inicio.
- Firefox respeta la entrada
rel='icon' y almacenará en caché el archivo ICO si falta el SVG.
- Deploy. Envía los cambios a tu proveedor de hosting (Vercel, Netlify, etc.). La carpeta
public se sirve de forma estática, por lo que los iconos están disponibles inmediatamente después de la primera compilación.
Problemas comunes
- Missing
public folder path. Si los iconos están fuera de public, las URLs generadas apuntarán a una ubicación inexistente y los navegadores registrarán errores 404.
- Using only
rel='shortcut icon'. Los navegadores modernos siguen la especificación rel='icon' (HTML spec). Depender únicamente del atributo legado puede hacer que el SVG sea ignorado.
- Cache‑related stale icons. Los navegadores almacenan en caché agresivamente
favicon.ico. Añade una cadena de consulta (p.ej., /favicon.ico?v=2) o habilita el hash de contenido en tu compilación para forzar una actualización.
- Incorrect MIME type. Sirve
.svg con image/svg+xml y .ico con image/x-icon. Un servidor mal configurado hará que los navegadores rechacen el archivo.
Conclusión
Al permitir que el App Router genere las etiquetas <link> a partir de una única exportación metadata, mantienes la configuración del favicon declarativa y preparada para el futuro. Los pasos anteriores cubren la generación, ubicación, exportación de metadata, verificación y despliegue, de modo que puedas pasar de una pestaña vacía a una presencia de marca pulida en minutos.
¿Necesitas una forma rápida de crear los archivos SVG y ICO? Prueba Mzu favicondl; genera el conjunto exacto de archivos necesario para el enfoque del App Router.
Revisa los requisitos documentados
Next.js documenta favicons y app icons en sus convenciones de archivos de metadata.