polymer - 服务 worker : How to build "Fresh" version of website for each new deployment?

标签 polymer service-worker firebase-polymer polymer-cli sw-precache

问题

我在生产中的网站(使用 Polymer Shop 模板构建)存在问题,尽管我进行了新的和改进的部署,但该网站仍提供旧版本的代码。

我正在使用 Polymer CLI $ polymer build命令与 Firebase 工具一起使用 $ firebase deploy命令将更改推送到 Firebase 托管。部署完成后,我导航到该网站只看到没有更新的更改:

  • Chrome :我首先看到网站的旧版本,并且必须“硬刷新”才能显示更改。
  • 火狐:我首先看到网站的旧版本,并且必须“硬刷新”才能显示更改。


  • Here's the before n' after shot:



    enter image description here

    服务 worker 工作流程?

    我试图找出最好的工作流程是什么。我想进行设置,以便每次进行新部署时,整个站点都被清除干净,服务人员通过互联网重置自己,我将 100% 确保现有用户将获得新部署的体验

    with out having to hard refresh or use incognito mode.



    我是不是该...
  • 删除 service worker 并在没有它的情况下部署新版本(坏主意)?
  • 在 Firebase 控制台中创建一个“新项目”并重新链接自定义域(乏味)?
  • 在 Firebase 控制台中找到“魔术按钮”以进行重置(是否存在)?
  • 编辑 sw-precache-config.js文件(不确定如何)?
  • $ polymer build 中处理此问题配置 sw-precache (不确定如何)?
  • 一些甚至不知道的很棒的东西 ¯\_(ツ)_/¯ ?


  • 我知道问题存在于 sw-precache-config.js 内部文件,但我不确定这是否是我应该解决的地方。
    module.exports = {
      staticFileGlobs: [
        '/index.html',
        '/manifest.json',
        '/bower_components/webcomponentsjs/webcomponents-lite.min.js',
        '/images/*'
      ],
      navigateFallback: '/index.html',
      navigateFallbackWhitelist: [/^(?!.*\.html$|\/data\/).*/],
      runtimeCaching: [
        {
          urlPattern: /\/data\/images\/.*/,
          handler: 'cacheFirst',
          options: {
            cache: {
              maxEntries: 200,
              name: 'items-cache'
            }
          }
        },
        {
          urlPattern: /\/data\/.*json/,
          handler: 'fastest',
          options: {
            cache: {
              maxEntries: 100,
              name: 'data-cache'
            }
          }
        }
      ]
    };
    

    Service Worker 是一个了不起的工具,我绝对希望在我的项目中使用它。我只需要学习如何驯服野兽。

    最佳答案

    我不知道 polymer ,但这是我通常与服务人员一起做的流程。
    - 在客户端我检查是否有更新,如果他/她想要更新,应用程序会通知用户。
    - 用户接受新版本,然后客户端向 sw 发送消息到 跳过观看 .
    client.js:

    navigator.serviceWorker.register('/serviceWorker.js').then(function(reg) {
        reg.addEventListener('updatefound', function() {
    
          reg.installing.addEventListener('statechange', function() {
    
            if (reg.installing.state == 'installed') {
              // Notify the user, there is a app new version.
              // User accept
               reg.installing.postMessage({msg: 'skipwaiting'});
            }
          });
        });
    });
    

    - 在 service worker 中听 留言 如果用户接受新版本,则跳过。
    serviceWorker.js:
    self.addEventListener('message', function(event) {
      if (event.data.msg === 'skipwaiting') {
        self.skipWaiting();
      }
    });
    

    客户端在 Service Worker 更改状态后刷新应用程序。
    client.js:
    let refreshing;
    
    navigator.serviceWorker.addEventListener('controllerchange', function() {
        if (refreshing) 
        return;
        window.location.reload();
        refreshing = true;
    });
    

    也许这可以给你一个想法。

    关于polymer - 服务 worker : How to build "Fresh" version of website for each new deployment?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40446098/

    相关文章:

    javascript - Polymer 1.X - 复杂的观察者不开火

    javascript - 激活 serviceworker 时使用 fetch 创建 indexeddb

    service-worker - 我可以使用 service worker 缓存 mp3 文件吗?

    javascript - 如何增加 'chrome push notification' 可见时间?

    javascript - 聚合物 firebase..使用密码和电子邮件进行身份验证

    data-binding - 如何在 dom-repeat 中嵌套两个 Polymer 的 firebase-collection 元素?

    firebase - 有没有办法监控 Firebase 命令行的变化,例如 "nodemon"?

    javascript - 我们如何在脚本标签中正确使用 polymer 属性?

    polymer - Polymer 1.0 中的数据绑定(bind)

    javascript - 使用具有 firebase 功能的 polymer 和 firebase 的网络推送通知