Favicon ToolsПроверитьСоздать
DevEx
Управление

Favicon для каждого окружения

· 6 min read

Квадрат 16x16 способен предотвратить инциденты на миллионы долларов. Приучите свою команду читать панель вкладок как защитную сетку для деплоя.

Снизьте риски в продакшене

Отчёты об инцидентах регулярно называют коренной причиной «запустил скрипт не в той вкладке». Визуальные подсказки создают паузу, прежде чем кто-то сотрёт данные продакшена.

С favicon, закодированными по цвету, даже переполненное окно браузера сигнализирует, в какой вкладке безопасно экспериментировать.

Более быстрое переключение контекста

Дизайнеры, QA и PM жонглируют десятками ссылок на превью. Заголовки окон часто выглядят одинаково (одно и то же название фичи).

Favicon для каждого окружения устраняют догадки, особенно когда напоминания в Slack и звонки в Zoom отвлекают людей посреди теста.

Свой визуальный язык для каждого уровня

Позаимствуйте цвета из ваших design tokens, но сохраняйте базовый глиф идентичным, чтобы узнаваемость бренда закрепилась.

ОкружениеОформление иконки
ПродакшенЭталонная иконка бренда без каких-либо оверлеев. Держите её неприкосновенной, чтобы обращённые к клиентам вкладки мгновенно узнавались.
StagingДобавьте диагональную полосу или значок, чтобы обозначить, что это безопасная песочница для QA и демонстраций.
РазработкаИспользуйте игривые оттенки, чтобы разработчики находили своё локальное окружение, переключаясь между окнами, полными логов.
Preview / Review AppsНаложите номер PR или инициал канала, чтобы продукт и маркетинг кликали по нужной сборке.

Оверлеи должны выживать в панели вкладок

Example favicon at 16 by 16 pixels
16px
Example favicon at 32 by 32 pixels
32px
Example favicon at 48 by 48 pixels
48px
Отрисовано в реальных пиксельных размерах. Вкладка — это то место, где эта система выполняет свою работу, поэтому проверяйте значок на 16px, прежде чем утверждать его: полоса читается в этом размере, а номер PR обычно нет.

Схема конфигурации

Привяжите ссылки на иконки к тем же переменным деплоя, которые вы уже используете для URL API или feature flags.

УровеньЧто настроитьСовет
Next.js MetadataОбновляйте metadata.icons с помощью process.env.ICON_URL.Централизуйте в app/layout.tsx, чтобы маршруты наследовали правильный набор иконок.
Manifest JSONОтдавайте manifest, специфичный для окружения, с соответствующими PNG.Включите purpose: "any maskable" для splash-экранов Android.
Резервные варианты HTMLУбедитесь, что устаревшие теги <link rel="shortcut icon"> также указывают на правильный актив.Добавьте параметры ?v={{ buildId }} для сброса кэшей при деплое.

Чек-лист выката

Запускайте новую систему как любой другой контроль соответствия: с документацией, peer review и автоматизацией.

  1. 1

    Именуйте активы по окружению

    Используйте суффиксы окружения (favicon-prod.png) плюс хеши для сброса кэша.

  2. 2

    Внедряйте теги из переменных окружения

    Внедряйте необходимые для индексации теги (rel="shortcut icon" и rel="apple-touch-icon") из переменных окружения в layout.tsx или document.tsx, по возможности используя абсолютные URL https://.

  3. 3

    Дублируйте везде, где появляются иконки

    Дублируйте обновления для apple-touch icons и массивов иконок в manifest.json.

  4. 4

    Зафиксируйте цветовую систему

    Задокументируйте цветовую систему внутри ваших design tokens, чтобы будущие ребрендинги оставались согласованными.

  5. 5

    Проверьте развёрнутые байты

    Подстрахуйте всё автоматическим шагом верификации (Playwright или /verify), который инспектирует байты скачанных иконок.

Фрагмент реализации

// app/layout.tsx
const iconBase = process.env.NEXT_PUBLIC_ICON_BASE_URL;

export const metadata = {
  icons: {
    icon: [
      { url: `${iconBase}/favicon.ico` },
      { url: `${iconBase}/favicon.png`, sizes: "32x32" },
      { url: `${iconBase}/favicon-16x16.png`, sizes: "16x16" },
    ],
    shortcut: [`${iconBase}/favicon.ico?v=${process.env.NEXT_BUILD_ID}`],
  },
};

Согласуйте с командой платформы, чтобы iconBase разрешался в бакеты S3, пути CDN или артефакты GitHub Pages, уникальные для каждого окружения.

Generate your icon set

Keep reading