Notification API 不是真正推送方案,仅负责前端通知展示;Web Push 才具备后台唤醒、远程消息接收与投递能力,依赖 Service Worker、VAPID 和加密推送协议栈。

不能替代,HTML通知只是推送链路的末端展示层,它本身不处理网络通信、后台唤醒或消息分发。
Notification API 为什么不是“推送”
浏览器 Notification API 只负责在用户已授权且页面(或 Service Worker)处于活动状态时,弹出一个桌面通知。它不连接推送服务、不维持长连接、也不接收远程消息——所有这些都得靠 Web Push 协议栈支撑。
-
new Notification()必须由前端 JS 主动调用,一旦页面卸载(标签页关闭),就完全失效 - 没有
onmessage或类似回调;你无法监听“新消息到达”,只能靠轮询或 WebSocket 主动拉取后再手动触发 - iOS Safari 完全不支持
Notification构造函数,"Notification" in window直接为false - Chrome 120+ 对非激活的 Service Worker 唤醒更激进,没
skipWaiting()和clients.claim(),showNotification()很可能静默失败
Web Push 才是真正能“推”的方案
Web Push 是一套完整协议:Service Worker + VAPID + PushManager + 后端推送服务(如 Firebase Cloud Messaging、webpush-go)。HTML 页面只起入口作用,真正的消息路由和投递都在浏览器后台进程里完成。
-
navigator.serviceWorker.register('/sw.js')必须注册成功,且sw.js要能被正确 fetch(404 不报错,但静默失败) -
registration.pushManager.subscribe()需传userVisibleOnly: true和 Base64 URL 编码的applicationServerKey,漏掉任一参数会抛TypeError - 后端 POST 到 endpoint 时,
Authorizationheader 必须是WebPush xxx格式,payload 必须加密(非 JSON 直传) - Chrome / Edge 对
scope敏感:注册路径若为/assets/sw.js,则默认 scope 是/assets/,导致 push 事件收不到
常见“以为能推,其实不能”的坑
很多开发者误把 Notification.requestPermission() 成功当成推送可用,结果上线后一条通知都收不到。
- 权限返回
"granted"≠ 推送可用:这只是允许弹窗,不代表 Service Worker 已激活、endpoint 已获取、后端已配 VAPID - 本地开发用
localhost可跳过 HTTPS,但部署到测试环境必须上 HTTPS,否则navigator.serviceWorker根本不存在 - 用户点了“禁止”,后续再调
requestPermission()不会弹窗,也改不了状态,只能引导去chrome://settings/content/notifications手动开 -
icon路径必须可跨域访问(CORS),且尺寸建议 ≥ 192×192,否则某些 Android 浏览器直接忽略图标
最易被忽略的一点:Web Push 的 endpoint 是一次性的,有效期通常数月,但用户清除浏览数据、换设备、或浏览器重置后就会失效——后端必须有机制清理无效 endpoint,否则持续发送只会增加 410 错误率。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











