favicon、icon 与 apple-icon

通过 faviconiconapple-icon 文件约定,您可以为应用程序设置图标。

这些图标适用于添加出现在网页浏览器标签页、手机主屏幕和搜索引擎结果等位置的应用程序图标。

设置应用程序图标有两种方式:

使用图片文件 (.ico, .jpg, .png)

/app 目录中放置 faviconiconapple-icon 图片文件来设置应用程序图标。favicon 图片只能位于 app/ 的顶级目录中。

Next.js 将评估该文件并自动将适当的标签添加到应用程序的 <head> 元素中。

文件约定支持的文件类型有效位置
favicon.icoapp/
icon.ico, .jpg, .jpeg, .png, .svgapp/**/*
apple-icon.jpg, .jpeg, .pngapp/**/*

favicon

在根 /app 路由段添加 favicon.ico 图片文件。

<head> 输出
<link rel="icon" href="/favicon.ico" sizes="any" />

icon

添加 icon.(ico|jpg|jpeg|png|svg) 图片文件。

<head> 输出
<link
  rel="icon"
  href="/icon?<generated>"
  type="image/<generated>"
  sizes="<generated>"
/>

apple-icon

添加 apple-icon.(jpg|jpeg|png) 图片文件。

<head> 输出
<link
  rel="apple-touch-icon"
  href="/apple-icon?<generated>"
  type="image/<generated>"
  sizes="<generated>"
/>

须知

  • 您可以通过在文件名后添加数字后缀来设置多个图标。例如,icon1.pngicon2.png 等。带编号的文件将按字典顺序排序。
  • Favicon 只能在根 /app 段中设置。如果需要更细粒度的控制,可以使用 icon
  • 适当的 <link> 标签和属性(如 relhreftypesizes)由图标类型和评估文件的元数据决定。
    • 例如,32x32 像素的 .png 文件将具有 type="image/png"sizes="32x32" 属性。
  • sizes="any" 被添加到 favicon.ico 输出中,以避免浏览器错误,即 .ico 图标优先于 .svg

使用代码生成图标 (.js, .ts, .tsx)

除了使用图片文件外,您还可以通过代码生成图标。

通过创建默认导出函数的 iconapple-icon 路由来生成应用程序图标。

文件约定支持的文件类型
icon.js, .ts, .tsx
apple-icon.js, .ts, .tsx

生成图标最简单的方法是使用 next/server 中的 ImageResponse API。

import { ImageResponse } from 'next/server'

// 路由段配置
export const runtime = 'edge'

// 图片元数据
export const size = {
  width: 32,
  height: 32,
}
export const contentType = 'image/png'

// 图片生成
export default function Icon() {
  return new ImageResponse(
    (
      // ImageResponse JSX 元素
      <div
        style={{
          fontSize: 24,
          background: 'black',
          width: '100%',
          height: '100%',
          display: 'flex',
          alignItems: 'center',
          justifyContent: 'center',
          color: 'white',
        }}
      >
        A
      </div>
    ),
    // ImageResponse 选项
    {
      // 为了方便,我们可以重用导出的图标尺寸元数据
      // 配置来同时设置 ImageResponse 的宽度和高度。
      ...size,
    }
  )
}
<head> 输出
<link rel="icon" href="/icon?<generated>" type="image/png" sizes="32x32" />

须知

属性

默认导出函数接收以下属性:

params (可选)

一个包含从根段到 iconapple-icon 所在段的动态路由参数的对象。

export default function Icon({ params }: { params: { slug: string } }) {
  // ...
}
路由URLparams
app/shop/icon.js/shopundefined
app/shop/[slug]/icon.js/shop/1{ slug: '1' }
app/shop/[tag]/[item]/icon.js/shop/1/2{ tag: '1', item: '2' }
app/shop/[...slug]/icon.js/shop/1/2{ slug: ['1', '2'] }

返回值

默认导出函数应返回 Blob | ArrayBuffer | TypedArray | DataView | ReadableStream | Response

须知ImageResponse 满足此返回类型。

配置导出

您可以通过从 iconapple-icon 路由导出 sizecontentType 变量来配置图标的元数据。

选项类型
size{ width: number; height: number }
contentTypestring - 图片 MIME 类型

size

export const size = { width: 32, height: 32 }

export default function Icon() {}
<head> 输出
<link rel="icon" sizes="32x32" />

contentType

export const contentType = 'image/png'

export default function Icon() {}
<head> 输出
<link rel="icon" type="image/png" />

路由段配置

iconapple-icon 是专门的路由处理器,可以使用与页面和布局相同的路由段配置选项。

选项类型默认值
dynamic'auto' | 'force-dynamic' | 'error' | 'force-static''auto'
revalidatefalse | 'force-cache' | 0 | numberfalse
runtime'nodejs' | 'edge''nodejs'
preferredRegion'auto' | 'global' | 'home' | string | string[]'auto'
export const runtime = 'edge'

export default function Icon() {}

版本历史

版本变更
v13.3.0引入 faviconiconapple-icon

On this page