工兵和服务人员

Sapper and Service Workers

这更像是一个服务工作者问题,尽管它可能更具体到 Sapper。我真的不知道,因为我是第一个管理员,我与 Service Workers 斗争,几乎没有使用过它们,并且经常觉得它们很痛苦。

基本上,无论我做什么,我都无法 localhost:3000 停止加载应用程序的旧副本。我以各种方式注销了服务工作者,包括尝试以编程方式注销。我清除了缓存,甚至清除了浏览器中的所有浏览数据。我的 Sapper 开发环境中的服务器不是 运行.

这发生在 Brave 中,但在 Opera 中表现相同,并且看起来像是一般的 Chromium 场景。我不使用 Firefox 或 Safari,但可能会很快测试其中一个,看看那里会发生什么行为。

这是一个片段,展示了我如何尝试注销 Service Worker。

https://youtu.be/Cb24I_fEklE

清除缓存,我唯一能绕过它的方法。

问题是 service worker 是来自缓存的服务,再次从缓存提供服务可能会将缓存中的此项重置为更有效的发送,并且您陷入了某种循环。

--

我发现这个问题是因为我正在考虑完全删除 service worker 以尝试使我的站点性能更高一些...

这是非常必要的吗?它有什么好处?

我使用了这个非常有效的小技巧。在您的 rollup.config.js 中,outputs 对象中有一个 serviceWorker 对象。

serviceworker: {
    input: config.serviceworker.input(),
    output: config.serviceworker.output(),
    plugins: [
      resolve(),
      replace({
        "process.browser": true,
        "process.env.NODE_ENV": JSON.stringify(mode),
      }),
      commonjs(),
      !dev && terser(),
    ],

    preserveEntrySignatures: false,
    onwarn,
  },

定义一个变量 dev 如果还没有声明的话:

const dev = process.env.NODE_ENV === "development";

现在像这样更改您的 Service Worker 配置:

serviceworker: !dev && {
    input: config.serviceworker.input(),
    output: config.serviceworker.output(),
    plugins: [
      resolve(),
      replace({
        "process.browser": true,
        "process.env.NODE_ENV": JSON.stringify(mode),
      }),
      commonjs(),
      !dev && terser(),
    ],

    preserveEntrySignatures: false,
    onwarn,
  },

确保关闭所有包含应用程序 运行 的浏览器选项卡,您无法在服务工作线程为现有版本的应用程序提供服务时更换它。如果存在任何缓存问题,也请在安装 service worker 后尝试重新加载页面。