Гид по технологиям

Push-уведомления в JavaScript: создание и лучшие практики

7 min read JavaScript Обновлено 09 Jan 2026
Push‑уведомления в JavaScript
Push‑уведомления в JavaScript

Push-уведомления в браузере и на телефоне можно отправлять напрямую из клиентского JavaScript через Notification API. Сначала запросите разрешение у пользователя, затем создавайте объекты Notification с настройками: title, body, icon, tag, data и обработчиками событий. Ниже подробное руководство, сценарии применения, шаблоны кода, чек-листы для разработчиков и соображения по безопасности и конфиденциальности.

Работа на MacBook Pro

Что такое уведомления в JavaScript

Уведомления — это сообщения, которые отображаются пользователю в реальном времени вне контекста страницы. Они помогают вернуть пользователя на сайт, оповещают о новых сообщениях, встречах или изменениях состояния. Notification API — встроенный браузерный интерфейс: у него простая модель и минимальные требования для начала работы.

Короткое определение: Notification API — браузерный интерфейс для создания видимых уведомлений на клиенте.

Когда использовать и когда не использовать уведомления

Важно выбирать уведомления только для релевантных случаев. Подходящие сценарии:

  • Новые сообщения в чате, когда пользователь не на странице.
  • Срочные системные события (сбой сервиса, статус заказа).
  • Напоминания о встречах и таймеры.

Не используйте уведомления для:

  • Навязчивой рекламы или постоянного промо. Это быстро приведёт к блокировке.
  • Тривиальных обновлений, которые можно показать в интерфейсе.

Важно: если пользователь отказал в разрешении, уважайте решение и не показывайте повторные запросы.

Запрос разрешения на показ уведомлений

Перед созданием любого уведомления нужно запросить разрешение у пользователя. Notification.requestPermission() возвращает промис со строкой: “granted”, “denied” или “default”.

Пример запроса разрешения (сохранён оригинальный стиль кода):

const button = document.querySelector('button')  
  button.addEventListener("click", ()=> {  
  Notification.requestPermission().then(permission => {  
    alert(permission)  
  })  
})

Пояснение:

  • granted — можно создавать уведомления.
  • denied — пользователь явно запретил. Не просите снова.
  • default — пользователь закрыл диалог без выбора; можно аккуратно попросить повторно позже.

Примечание по режиму инкогнито: многие браузеры в приватных окнах автоматически отклоняют запросы на уведомления.

Создание простого уведомления

После получения разрешения вы создаёте уведомление через new Notification(title, options).

Пример базового уведомления:

const button = document.querySelector('button')  
button.addEventListener("click", ()=> {  
  Notification.requestPermission().then(perm => {  
    if(perm === 'granted') {  
      new Notification("Example notification")  
    }  
  })  
})

Этот код создаст системное уведомление с заголовком “Example notification”. В разных ОС и браузерах отображение может отличаться.

Скриншот уведомления в Google Chrome

Свойства уведомлений — подробный разбор

При создании уведомления вы можете передать объект options с набором свойств. Ниже описаны ключевые поля и примеры их использования.

body

Поле body — текст сообщения под заголовком уведомления.

new Notification("Example notification", {  
  body: "This is more text",  
})

Используйте короткие, понятные фразы. Длинные абзацы в телах уведомлений часто обрезаются.

data

data — любое произвольное значение, которое вы хотите сохранить в уведомлении. Это удобно для передачи идентификаторов или состояния.

button.addEventListener("click", ()=> {  
  Notification.requestPermission().then(perm => {  
    if(perm === 'granted') {  
      const notification = new Notification("Example notification", {  
       body: "This is more text",  
       data: {hello: "world"}  
      })  
      
      alert(notification.data.hello)  
    }  
  })  
})  

data доступна в обработчиках событий (click, close и т. д.).

События уведомления

Уведомления поддерживают ряд событий. Их можно повесить напрямую на объект Notification:

  • show — уведомление показано.
  • click — пользователь кликнул по уведомлению.
  • close — уведомление было закрыто.
  • error — произошла ошибка при создании или показе уведомления.

Пример обработчика close:

const notification = new Notification("Example notification", {    
  body: "This is more text",  
  data: {hello: "world"}    
})  
  
notification.addEventListener("close", e => {  
  console.log(e.target.data.hello)  
})

Используйте click для открытия вкладки или маршрутизации пользователя в приложение, а close — для логирования или очистки временных данных.

icon

Свойство icon задаёт URL изображения, которое отображается в уведомлении.

const notification = new Notification("Example notification", {    
  icon: "logo.png"  
})

Путь может быть относительным или абсолютным. Если изображение не загружается, уведомление отобразится без иконки.

Скриншот уведомления с иконкой

tag

Тег позволяет сгруппировать уведомления и предотвращать их накопление. Если два уведомления имеют одинаковый tag, новое перезапишет старое.

new Notification("Example notification", {    
  body: "This is more text",  
  tag: "My new tag"  
})  

Полезно для индикаторов: например, для счетчика уведомлений или одноточечных оповещений о состоянии.

Пример: уведомление при уходе со страницы

Ниже пример, который показывает уведомление, когда пользователь уходит со страницы (т. е. теряет фокус). Обратите внимание на корректное событие — в примере используется visibilitychange.

let notification  
document.addEventListener("visibilitychange", ()=> {  
  if(document.visibilityState === "hidden") {  
    notification = new Notification("Come back please", {  
      body: "Don't leave just yet :(",  
      tag: "Come Back"  
    })  
  } else {  
    notification.close()  
  }  
})  

Практический совет: не злоупотребляйте такими уведомлениями; используйте их, когда есть реальная ценность для пользователя.

Отличие уведомлений в окне и push-уведомлений через Service Worker

  • Локальные уведомления (как в примерах выше) создаются из контекста открытой страницы.
  • Push-уведомления через Push API + Service Worker приходят, даже если страница закрыта. Они требуют серверной части и подписки.

Если цель — доставлять уведомления при закрытой странице, изучите Push API, VAPID-ключи и сервис-воркеры. Этот материал фокусируется на клиентских Notification-объектах.

Когда уведомления не сработают: типичные ограничения

  • Разрешение пользователя: denied блокирует показ уведомлений.
  • Приватный режим: некоторые браузеры запрещают запросы.
  • Ограничения платформы: мобильные браузеры на iOS долгое время не поддерживали полноценные уведомления.
  • Спам-фильтры и UX: слишком частые уведомления приведут к отписке.

Контрмера: если уведомления критичны, объединяйте их с email/SMS как запасным каналом.

Альтернативы и дополняющие механизмы

  • Встраиваемые модальные окна и баннеры на странице — работают, когда пользователь на сайте.
  • Email и SMS — подходят для уведомлений с высокой важностью.
  • WebSocket или Web Push через сервис-воркер — если нужна доставка при закрытой вкладке.

Мини‑методология: как проектировать поток уведомлений

  1. Определите цель уведомления — что должно сделать пользователь.
  2. Классифицируйте важность: критическое / информативное / рекламное.
  3. Выберите канал: локальное уведомление, push, email, SMS.
  4. Настройте частоту и дедупликацию (tag, grouping).
  5. Тестируйте в разных браузерах и ОС.
  6. Добавьте возможность отписки и управление настройками.

Чек-лист для ролей

Разработчик:

  • Запрос разрешений корректно и только при релевантном контексте.
  • Использовать tag для дедупликации.
  • Повесить обработчики click/close для логики переходов.
  • Тестировать иконки и относительные пути.

Продукт-менеджер:

  • Описать цель каждой категории уведомлений.
  • Установить лимиты по частоте и приоритеты.
  • Убедиться в наличии альтернативных каналов.

Специалист по безопасности:

  • Минимизировать личные данные в поле data.
  • Проверять URL и содержимое иконок на безопасность.
  • Обновлять политику конфиденциальности.

Тестовые сценарии и критерии приёмки

Критерии приёмки:

  • Уведомление отображается при granted.
  • click открывает нужную страницу или маршрут.
  • close удаляет временные объекты и не оставляет утечек памяти.
  • Поведение с одинаковым tag перезаписывает старое уведомление.
  • В режимах denied/default не происходит навязчивых повторов запроса.

Тест-кейсы:

  • Получение разрешения, показ уведомления, клик по уведомлению.
  • Установка tag и многократный триггер — убедиться в перезаписи.
  • Отказ в разрешении — уведомление не показывается.
  • Тесты на мобильных и настольных браузерах, включая приватный режим.

Безопасность и конфиденциальность

  • Храните в data только минимально необходимую информацию (например, идентификатор сообщения, а не полный текст).
  • Не включайте персональные данные в заголовки и тела уведомлений.
  • Убедитесь, что ссылки в click ведут на защищённые (HTTPS) страницы.

Примечание по GDPR: уведомления могут быть частью обработки персональных данных. Обеспечьте юридическое основание и возможность управления настройками уведомлений.

Советы по совместимости и миграции

  • Проверьте поддержку Notification API и Push API в целевых браузерах. На старых версиях Safari/iOS поддержка могла отсутствовать.
  • Для доставки при закрытой странице добавьте серверную поддержку Push API и VAPID.
  • Для кросс-платформенной работы используйте прогрессивные подходы: сначала локальные уведомления, затем сервис-воркеры для полного покрытия.

Шаблоны кода и быстрый чек-лист для разработки

Шорткат-перечень свойств options:

  • body — основной текст уведомления
  • icon — URL иконки
  • tag — идентификатор для группировки
  • data — произвольные данные

Пример расширённого уведомления с обработчиком клика:

Notification.requestPermission().then(perm => {
  if (perm !== 'granted') return;
  const opts = {
    body: 'У вас новое сообщение',
    icon: '/img/logo.png',
    tag: 'chat-123',
    data: { conversationId: 123 }
  };
  const n = new Notification('Новое сообщение', opts);
  n.addEventListener('click', e => {
    // Переводим пользователя в приложение
    window.focus();
    window.location.href = `/chat/${e.target.data.conversationId}`;
  });
});

Часто встречимые ошибки и как их избегать

  • Запрос разрешения при загрузке страницы — раздражает пользователя. Запрашивайте только в контексте действия.
  • Хранение чувствительных данных в data — риск утечки.
  • Отсутствие дедупликации — пользователи увидят много повторяющихся уведомлений.

Ментальная модель: как думать об уведомлениях

Представьте уведомление как короткое письмо на рабочем столе пользователя. Оно должно быть полезным и не мешать. Если оно не добавляет ценности — не отправляйте.

Decision flow (Mermaid)

flowchart TD
  A[Нужна ли немедленная доставка?] -->|Да| B[Push через Service Worker]
  A -->|Нет| C[Локальные уведомления из страницы]
  B --> D{Есть сервер и VAPID?}
  D -->|Да| E[Настроить Push API]
  D -->|Нет| F[Рассмотреть Email/SMS]
  C --> G{Пользователь онлайн?}
  G -->|Да| H[Встроенные баннеры]
  G -->|Нет| I[Notification API с tag]

Краткое руководство по внедрению (SOP)

  1. Проанализируйте сценарии использования и приоритеты.
  2. Создайте UX-среду для запроса разрешения (пояснение, зачем нужно).
  3. Реализуйте код для requestPermission и создание Notification.
  4. Добавьте логику дедупликации с tag.
  5. Реализуйте обработчики click/close и маршрутизацию.
  6. Проведите тестирование в разных браузерах и ОС.
  7. Подготовьте страницу настроек уведомлений в приложении.

FAQ

Как отменить разрешение на уведомления?

Пользователь может отменить разрешение в настройках браузера. На сервере можно хранить флаг подписки и уважать изменения.

Отличаются ли уведомления между браузерами?

Да. Визуальное отображение и дополнительные возможности могут отличаться. Поведение событий, как правило, стандартизовано.

Можно ли показывать уведомления, если вкладка закрыта?

Не напрямую. Для этого используйте Push API и Service Worker.

Заключение

Notification API даёт простой и быстрый способ взаимодействовать с пользователем вне страницы. Он удобен для ненавязчивых оповещений и кратких напоминаний. Для доставки при закрытой вкладке используйте Service Worker и Push API. Всегда следуйте правилам хорошей практики: уважайте разрешения, минимизируйте персональные данные и тестируйте поведение в целевых браузерах.

Короткое резюме

  • Запрашивайте разрешение только когда нужно.
  • Используйте body, icon, tag и data для настройки уведомлений.
  • Добавьте обработчики click и close для логики перехода и очистки.
  • Для доставки при закрытой странице изучите Push API и Service Worker.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство