如何添加 Favicon
如何把网站图标加进项目:HTML、Next.js、Nuxt.js、React、Vue.js 和 SvelteKit 的安装步骤和代码示例。
开始之前
先在首页设计图标,并下载完整 ZIP。压缩包里包含所需的全部尺寸。
下载后解压,把文件放到项目的 public 目录(SvelteKit 用 static,纯 HTML 放网站根目录)。
文件就位后,按你用的框架加上 HTML 链接。
各框架安装说明
纯 HTML
把全部图标文件放到网站根目录(静态站点生成器则放 public),然后在 HTML 的 head 里加上这些链接:
<link rel="icon" type="image/x-icon" sizes="16x16 32x32 48x48" href="/favicon.ico">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="48x48" href="/favicon-48x48.png">
<link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png">
<link rel="icon" type="image/png" sizes="180x180" href="/favicon-180x180.png">
<link rel="icon" type="image/png" sizes="192x192" href="/favicon-192x192.png">
<link rel="icon" type="image/png" sizes="512x512" href="/favicon-512x512.png">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">Next.js
把全部图标文件放到 public,然后在 app/layout.tsx 或 pages/_document.tsx 里加 metadata:
// app/layout.tsx (App Router)
import type { Metadata } from 'next'
export const metadata: Metadata = {
icons: {
icon: [
{ url: '/favicon.ico', sizes: '16x16 32x32 48x48' },
{ url: '/favicon-16x16.png', sizes: '16x16', type: 'image/png' },
{ url: '/favicon-32x32.png', sizes: '32x32', type: 'image/png' },
{ url: '/favicon-48x48.png', sizes: '48x48', type: 'image/png' },
{ url: '/favicon-96x96.png', sizes: '96x96', type: 'image/png' },
{ url: '/favicon-180x180.png', sizes: '180x180', type: 'image/png' },
{ url: '/favicon-192x192.png', sizes: '192x192', type: 'image/png' },
{ url: '/favicon-512x512.png', sizes: '512x512', type: 'image/png' },
{ url: '/favicon.svg', type: 'image/svg+xml' },
],
apple: [
{ url: '/apple-touch-icon.png', sizes: '180x180', type: 'image/png' },
],
},
}Pages Router 也可以用 next/head:
// pages/_document.tsx (Pages Router)
import Head from 'next/head'
export default function Document() {
return (
<Head>
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="48x48" href="/favicon-48x48.png" />
<link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png" />
<link rel="icon" type="image/png" sizes="180x180" href="/favicon-180x180.png" />
<link rel="icon" type="image/png" sizes="192x192" href="/favicon-192x192.png" />
<link rel="icon" type="image/png" sizes="512x512" href="/favicon-512x512.png" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
</Head>
)
}Nuxt.js
把全部图标文件放到 public,然后在 nuxt.config.ts 或 app.vue 里配置:
// nuxt.config.ts
export default defineNuxtConfig({
app: {
head: {
link: [
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' },
{ rel: 'apple-touch-icon', sizes: '180x180', href: '/apple-touch-icon.png' },
{ rel: 'icon', type: 'image/png', sizes: '16x16', href: '/favicon-16x16.png' },
{ rel: 'icon', type: 'image/png', sizes: '32x32', href: '/favicon-32x32.png' },
{ rel: 'icon', type: 'image/png', sizes: '48x48', href: '/favicon-48x48.png' },
{ rel: 'icon', type: 'image/png', sizes: '96x96', href: '/favicon-96x96.png' },
{ rel: 'icon', type: 'image/png', sizes: '180x180', href: '/favicon-180x180.png' },
{ rel: 'icon', type: 'image/png', sizes: '192x192', href: '/favicon-192x192.png' },
{ rel: 'icon', type: 'image/png', sizes: '512x512', href: '/favicon-512x512.png' },
{ rel: 'icon', type: 'image/svg+xml', href: '/favicon.svg' },
],
},
},
})也可以在 app.vue 里用 useHead:
// app.vue
<script setup>
useHead({
link: [
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' },
{ rel: 'apple-touch-icon', sizes: '180x180', href: '/apple-touch-icon.png' },
{ rel: 'icon', type: 'image/png', sizes: '16x16', href: '/favicon-16x16.png' },
{ rel: 'icon', type: 'image/png', sizes: '32x32', href: '/favicon-32x32.png' },
{ rel: 'icon', type: 'image/png', sizes: '48x48', href: '/favicon-48x48.png' },
{ rel: 'icon', type: 'image/png', sizes: '96x96', href: '/favicon-96x96.png' },
{ rel: 'icon', type: 'image/png', sizes: '180x180', href: '/favicon-180x180.png' },
{ rel: 'icon', type: 'image/png', sizes: '192x192', href: '/favicon-192x192.png' },
{ rel: 'icon', type: 'image/png', sizes: '512x512', href: '/favicon-512x512.png' },
{ rel: 'icon', type: 'image/svg+xml', href: '/favicon.svg' },
],
})
</script>React(Create React App / Vite)
把全部图标文件放到 public,然后改 public/index.html:
<!-- public/index.html -->
<head>
<link rel="icon" type="image/x-icon" href="%PUBLIC_URL%/favicon.ico" />
<link rel="apple-touch-icon" sizes="180x180" href="%PUBLIC_URL%/apple-touch-icon.png" />
<link rel="icon" type="image/png" sizes="16x16" href="%PUBLIC_URL%/favicon-16x16.png" />
<link rel="icon" type="image/png" sizes="32x32" href="%PUBLIC_URL%/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="48x48" href="%PUBLIC_URL%/favicon-48x48.png" />
<link rel="icon" type="image/png" sizes="96x96" href="%PUBLIC_URL%/favicon-96x96.png" />
<link rel="icon" type="image/png" sizes="180x180" href="%PUBLIC_URL%/favicon-180x180.png" />
<link rel="icon" type="image/png" sizes="192x192" href="%PUBLIC_URL%/favicon-192x192.png" />
<link rel="icon" type="image/png" sizes="512x512" href="%PUBLIC_URL%/favicon-512x512.png" />
<link rel="icon" type="image/svg+xml" href="%PUBLIC_URL%/favicon.svg" />
</head>Vue.js(Vite)
把全部图标文件放到 public,然后改 index.html:
<!-- index.html -->
<head>
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="48x48" href="/favicon-48x48.png" />
<link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png" />
<link rel="icon" type="image/png" sizes="180x180" href="/favicon-180x180.png" />
<link rel="icon" type="image/png" sizes="192x192" href="/favicon-192x192.png" />
<link rel="icon" type="image/png" sizes="512x512" href="/favicon-512x512.png" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
</head>SvelteKit
把全部图标文件放到 static,然后改 src/app.html:
<!-- src/app.html -->
<head>
<link rel="icon" type="image/x-icon" href="%sveltekit.assets%/favicon.ico" />
<link rel="apple-touch-icon" sizes="180x180" href="%sveltekit.assets%/apple-touch-icon.png" />
<link rel="icon" type="image/png" sizes="16x16" href="%sveltekit.assets%/favicon-16x16.png" />
<link rel="icon" type="image/png" sizes="32x32" href="%sveltekit.assets%/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="48x48" href="%sveltekit.assets%/favicon-48x48.png" />
<link rel="icon" type="image/png" sizes="96x96" href="%sveltekit.assets%/favicon-96x96.png" />
<link rel="icon" type="image/png" sizes="180x180" href="%sveltekit.assets%/favicon-180x180.png" />
<link rel="icon" type="image/png" sizes="192x192" href="%sveltekit.assets%/favicon-192x192.png" />
<link rel="icon" type="image/png" sizes="512x512" href="%sveltekit.assets%/favicon-512x512.png" />
<link rel="icon" type="image/svg+xml" href="%sveltekit.assets%/favicon.svg" />
</head>