vercel 发布了 sveltekit,其中 vite 无法注册放置在 src 文件夹中的 serviceworker

vercel published sveltekit where vite fails to register serviceworker placed in src folder

这个问题需要 vercel 团队或 sveltekit 团队的人,因为它与我发布到 vercel 的 pwa 应用程序有关: 1- 我在“静态”文件夹中放置了一个 minifest1.js 文件 2- 我将 testserviceworker.js 文件放在“SRC”文件夹中。

当我通过“npm 运行 build”和“npm 运行 preview”在本地使用我的笔记本电脑 运行 我的应用程序时,vite 注册了我的 serviceworker,我的缓存被填充并且应用程序可作为 pwa 安装。

当我将相同的代码部署到vercel 时,vite 无法注册serviceworker。为了进行实验,我将 serviceworker 文件添加到静态文件夹,并在 index.svelte 中添加了一个注册按钮,以便在我按下按钮时手动注册文件。

当我按下按钮时,serviceworker 已注册,我能够在开发工具、应用程序选项卡、缓存中验证它并能够安装我的应用程序,但我的灯塔报告显示 pwa 部分失败。

所以我的问题是关于 vite 在启动站点时默认注册 serviceworker。我是否需要使用“navigator.serviceWorker.register('testserviceworker.js”在 load 或 onMount 中添加一个函数,或者在 vercel 或 svelte.config.js 中有某种神奇的配置指向 vite serviceworker.js 所以它在启动应用程序时注册它?

我在这里添加了 manifest 和 serviceworker 的文件,但我认为它们与我的问题无关,因为这是配置问题而不是代码问题:

清单文件:

{
  "name": "PWATEST",
  "short_name": "PWATESTSHORTNAME", 
  "start_url": "/",
  "scope" : "/",
  "background_color": "#1b4079",
  "theme_color": "#d62828",
  "display": "fullscreen",
  "icons": [
    {
      "src": "/512svelte-welcome.png",
      "sizes": "512x512",
      "type": "image/png",
      "purpose" : "any maskable"
    }    
  ]
}

我的testserviceworker.js

console.log("*****hello from testserviceworker.js inside static folder********")

self.addEventListener('install', (event) => {
  event.waitUntil(
    caches.open('v3').then((cache) => {
       cache.add(
          './favicon.png'             
       );
    })
  );
});
    
self.addEventListener('activate', function(event) {
   console.log("serviceworker activate fn :", event)
});

self.addEventListener('fetch', function(event) {
 console.log("fetch fn inside serviceworker.js") 
})

这里是 LINK to vercel app 运行 在主页中逐步测试此设置的步骤。

有vercel组员或者Sveltekit忍者战士可以指导我解决这个问题吗?没有人再建网站了。安装 pwa 是必经之路,Sapper 过去默认包含一个 serviceworker 和清单文件。由于一些神秘的原因,vite 参与其中并且该能力消失了,现在在部署之后,vite 无法找到 serviceworker 来注册它,如 sveltekit 文档中所述:

Doc-serviceworkers 通常值得使用服务工作者通过预缓存构建的 JS 和 CSS.

来加速导航

在 SvelteKit 中,如果你有一个 src/service-worker.js 文件(或 src/service-worker.ts,或 src/service-worker/index.js,等等)它将被构建邀请并自动注册。

总结:

1-如何让 vite 知道 serviceworker 文件在特定位置,如静态文件夹或应用程序的不同部分?

2-如果我将 serviceworker.js 放在 src 文件夹中,如何修复注册 serviceworker 的问题?

希望我们能从 vercel 团队或 sveltekit 团队中找人来调查这个问题。我 found this issue 并且我可以禁用它但是如何在不按下按钮的情况下注册 serviceworker? 将代码放在load或onMount中?

为了方便大家,published vercel app link又来了。

我在 onMount 中以注册结束。现在,当应用程序加载时,serviceworker 已注册并且可以安装 pwa。它通过了灯塔检查。全绿。

这是 onMount 的代码:

import { onMount } from 'svelte';


    onMount(async () => {
        
        if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('testserviceworker.js', { scope: '/' }).then(function(reg) {
    // registration worked
    console.log('Registration succeeded. Scope is ' + reg.scope);
  }).catch(function(error) {
    // registration failed
    console.log('Registration failed with ' + error);
  });
}; 



    }); 

回顾一下: 当您发布到 vercel - 根据 sveltekit 文档 - 假设为您注册 serviceworker。 1- 将 serviceworker.js 文件放在静态文件夹中。 2- 添加 onMount fn 并在那里注册 serviceworker。 3- 无需在 svelte.config.js as 中禁用 vite 自动注册 在文档中指示,因为我没有禁用它并且它没有导致任何 问题。

希望sveltekit 1.0早日发布。我相信到那时大多数这些错误都会被解决。