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

Что такое уведомления в 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”. В разных ОС и браузерах отображение может отличаться.

Свойства уведомлений — подробный разбор
При создании уведомления вы можете передать объект 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 через сервис-воркер — если нужна доставка при закрытой вкладке.
Мини‑методология: как проектировать поток уведомлений
- Определите цель уведомления — что должно сделать пользователь.
- Классифицируйте важность: критическое / информативное / рекламное.
- Выберите канал: локальное уведомление, push, email, SMS.
- Настройте частоту и дедупликацию (tag, grouping).
- Тестируйте в разных браузерах и ОС.
- Добавьте возможность отписки и управление настройками.
Чек-лист для ролей
Разработчик:
- Запрос разрешений корректно и только при релевантном контексте.
- Использовать 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)
- Проанализируйте сценарии использования и приоритеты.
- Создайте UX-среду для запроса разрешения (пояснение, зачем нужно).
- Реализуйте код для requestPermission и создание Notification.
- Добавьте логику дедупликации с tag.
- Реализуйте обработчики click/close и маршрутизацию.
- Проведите тестирование в разных браузерах и ОС.
- Подготовьте страницу настроек уведомлений в приложении.
FAQ
Как отменить разрешение на уведомления?
Пользователь может отменить разрешение в настройках браузера. На сервере можно хранить флаг подписки и уважать изменения.
Отличаются ли уведомления между браузерами?
Да. Визуальное отображение и дополнительные возможности могут отличаться. Поведение событий, как правило, стандартизовано.
Можно ли показывать уведомления, если вкладка закрыта?
Не напрямую. Для этого используйте Push API и Service Worker.
Заключение
Notification API даёт простой и быстрый способ взаимодействовать с пользователем вне страницы. Он удобен для ненавязчивых оповещений и кратких напоминаний. Для доставки при закрытой вкладке используйте Service Worker и Push API. Всегда следуйте правилам хорошей практики: уважайте разрешения, минимизируйте персональные данные и тестируйте поведение в целевых браузерах.
Короткое резюме
- Запрашивайте разрешение только когда нужно.
- Используйте body, icon, tag и data для настройки уведомлений.
- Добавьте обработчики click и close для логики перехода и очистки.
- Для доставки при закрытой странице изучите Push API и Service Worker.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone