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

React嵌套路由下Workbox生成的Service Worker注册失败如何解决?

问题根因

报错的核心原因是在嵌套路由页面下使用相对路径请求service-worker.js时,浏览器会将路径解析为https://my-app.com/someroute/service-worker.js,但你的service worker文件实际打包在站点部署根目录下,服务器找不到对应路径的js资源,就返回了SPA的兜底index.html文件,因此浏览器识别到的MIME类型为text/html而非预期的application/javascript,触发注册失败。你之前设置的directoryIndex参数用于处理静态资源目录索引逻辑,和该问题无关因此无法生效。

解决方案

1. 修改Service Worker注册路径为绝对路径

找到项目中service worker注册逻辑,将相对路径替换为适配部署路径的绝对路径,React项目可直接用PUBLIC_URL环境变量适配:

// 原错误写法(相对路径)
navigator.serviceWorker.register('./service-worker.js')

// 修改后的正确写法
navigator.serviceWorker.register(`${process.env.PUBLIC_URL}/service-worker.js`, {
  scope: `${process.env.PUBLIC_URL}/`
})

如果你的应用直接部署在域名根路径,也可以直接写死为'/service-worker.js'。

2. 调整Workbox配置

给GenerateSW配置新增路由兜底参数,确保SPA嵌套路由的缓存逻辑正常:

new GenerateSW({
    cacheId: 'my-app',
    skipWaiting: true,
    clientsClaim: true,
    exclude: [/\.map$/, /^manifest.*\.js(?:on)?$/, /\.html$/],
    // 新增:SPA导航请求统一兜底到index.html
    navigationFallback: `${process.env.PUBLIC_URL}/index.html`
}),

3. 可选:配置服务器响应头(作用域扩展场景)

如果你需要service worker的作用域覆盖站点全路径,需要在服务器返回service-worker.js的响应中添加Service-Worker-Allowed头,nginx配置示例如下:

location ~* (service-worker\.js)$ {
  add_header Service-Worker-Allowed /;
  expires off;
  add_header Cache-Control "no-cache";
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:21:00