加载远程Service Worker,以便在其他域中运行

Load remote Service Worker, to run in a different domain?

本文关键字:其他 运行 Service Worker 加载      更新时间:2023-09-26

我正试图在网站上放置一个Service Worker,我想从CDN加载Service Worker脚本。然而,当我从另一个域加载服务工作者时,我会收到以下错误。

ServiceWorker DOMException:未能注册ServiceWorker:提供的scriptURL的来源('https://cdndomain.com')没有匹配当前原点('http://mydomain')

有没有办法从CDN加载服务工作者?我见过一些推送通知服务在那里做这件事,我们可以使用eval在本地执行服务工作者js吗?

有什么解决办法吗?感谢

以下是我当前代码的

 if (navigator.serviceWorker) {
   console.log("ServiceWorkerssupported");
   navigator.serviceWorker.register('https://cdn.com/sw.js', {
     scope: './'
   })
   .then(function(reg) {
     console.log("ServiceWorkerstered", reg);
   })
   .catch(function(error) {
     console.log("Failedegister ServiceWorker", error);
   });
}

服务工作者必须来自同一个域,因为服务工作者文件的位置非常重要。

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/sw.js').then(function(registration) {
    // Registration was successful
    console.log('ServiceWorker registration successful with scope: ',    registration.scope);
  }).catch(function(err) {
    // registration failed :(
    console.log('ServiceWorker registration failed: ', err);
  });
}

register方法的一个微妙之处是服务的位置工作文件。在这种情况下,您会注意到服务工作者文件位于域的根目录。这意味着服务人员范围将是整个原点。换句话说,这个服务人员将接收此域上所有内容的获取事件。如果我们在/example/sw.js中注册服务工作者文件,然后服务工作程序只会看到URL以开头的页面的获取事件/example/(即/example/page1/、/example/page2/)。

您可以使用php脚本作为代理从其他地方加载它。