You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js集成PushPad Web通知时遇importScripts DOMException错误

解决Next.js集成PushPad Web通知时的importScripts错误

1. 修正Service Worker文件位置与脚本路径

Next.js的静态资源都存在public目录下,必须把你的service-worker.js放在public文件夹根目录。然后把脚本里的import路径改成绝对路径,避免Next.js路由解析问题:

importScripts('https://pushpad.xyz/service-worker.js');

如果用的是PushPad自定义脚本,确保路径是浏览器能直接访问的绝对地址。

2. 调整App组件中的Service Worker注册逻辑

Next.js开发环境对Service Worker有特殊限制,仅在生产环境注册即可。修改_app.tsx:

import { useEffect } from 'react';

export default function MyApp({ Component, pageProps }) {
  useEffect(() => {
    if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
      window.addEventListener('load', async () => {
        try {
          await navigator.serviceWorker.register('/service-worker.js');
        } catch (err) {
          console.error('Service Worker注册失败:', err);
        }
      });
    }
  }, []);

  return <Component {...pageProps} />;
}

3. 给next.config.js加Service Worker专属配置

Next.js默认会处理静态资源,得让它放过service-worker.js,还要设置允许的作用域:

const nextConfig = {
  async headers() {
    return [
      {
        source: '/service-worker.js',
        headers: [
          { key: 'Service-Worker-Allowed', value: '/' }
        ]
      }
    ];
  },
  // 生产环境部署用standalone输出更稳妥,可选
  output: 'standalone'
};

module.exports = nextConfig;

4. 检查tsconfig.json的全局API支持

确保tsconfig里包含dom相关的lib,避免TypeScript报错:

{
  "compilerOptions": {
    "lib": ["dom", "dom.iterable", "esnext"],
    "types": ["node"]
  }
}

最后排查步骤

  • 清除浏览器缓存,在开发者工具的Application面板里注销旧的Service Worker后刷新页面
  • 确认PushPad项目的公钥、配置与你的站点完全匹配
  • 测试服务器必须使用HTTPS(localhost除外,浏览器允许本地HTTP环境使用Service Worker)

内容的提问来源于stack exchange,提问作者ppoz21

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:48:19