如何使用新部署的站点版本(Firebase)从用户的浏览器中删除在先前部署中注册的服务工作者?

联合国1

我已经在现有项目上将网站的新版本(它位于Polymer上,现在位于Vue.js上)部署到Firebase。

vue init webpack my-project在新项目中将默认的Vue.js模板与Webpack()一起使用


既然我已经部署了新版本,那么当我打开站点时,我看到的只是一个缓存的外壳程序,我认为这是服务工作者的错

为了从Firebase I(和所有以前的访问者)获取实际的当前文件,现在每次都必须Ctrl+F5在Firefox中每次都强制刷新站点。

安慰

现在,在浏览器控制台(“网络”选项卡)中,我看到:

在此处输入图片说明

  • 红色的服务人员说:(failed) net::ERR_INSECURE_RESPONSE我正常打开站点时(不进行强制刷新)

  • 其中一些文件的size属性为(from ServiceWorker)-这些文件已经具有,cache-control:max-age=3600但是自从我部署了该网站的新版本以来已经一个多小时了。看起来服务工作者本身没有任何标头,这也许就是为什么它不断加载旧文件的原因


我已将此代码添加到中firebase.json,然后npm run build尝试删除服务工作者,但仍然存在问题

Firebase.json

{
  "hosting": {
    "public": "dist",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ],
    "headers": [
      { "source":"/service-worker.js", "headers": [{"key": "Cache-Control", "value": "no-cache"}] }
    ]
  }
}

上一个项目的服务人员代码

我在新部署的版本上不使用任何服务人员。但是以前的部署注册了服务人员

我正在使用Polymer 1.0框架库中的默认sw-precache组件,该组件是在我使用的预先配置的Polymer入门工具包模板中构建的。服务人员是在构建时生成的

捆绑> service-worker.js: https ://jsfiddle.net/uydjzw13/

取消捆绑> service-worker.js: https ://jsfiddle.net/t42fdgow/


题:

有没有办法从所有站点访问者的浏览器中删除该旧服务工作者,以便他们始终获得新部署的版本?也许我可以通过Webpack或Firebase做到这一点?


如果我只是从Firebase中删除带有服务工作程序的先前部署的版本,它将得到解决吗?

或者,如果可以的话,我可以使用服务工作者部署另一个版本,该服务工作者具有删除所有先前缓存并取消注册先前服务工作者的唯一功能(如果可能)?

还是可以使用类似的方法?:https : //developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration/unregister

我不确定如何正确地做到这一点,并且不确定是否会注册更多我也无法摆脱的服务人员。

联合国1

我终于找到了解决方案!

因此,如果您遇到相同的问题,请执行以下操作:

1安装webpack插件(如果您在项目中使用webpack)

npm install webpack-remove-serviceworker-plugin

2在webpack.prod.conf.js文件中创建常量(或任何称为生产配置的常量

const RemoveServiceWorkerPlugin = require('webpack-remove-serviceworker-plugin')

3将插件添加到该文件的插件中:[];如果您不在项目中使用它们,则不要放在其中):

new RemoveServiceWorkerPlugin({ filename: 'service-worker.js' });

4将那个service-worker.js文件名更改为您以前调用的服务工作者(您需要删除的文件名。加载页面时,您可以在开发人员工具的网络标签中找到其名称)

5再次构建项目并部署


如果您不使用webpack,则可以尝试执行此操作-用注销自己的旧service worker代替:

registration.unregister().then(async () => {
  // optionally, get controlled pages to refresh:
  for (const client of await clients.matchAll()) {
    client.navigate(client.url);
  }
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章