什么是正确的方法来删除webpack离线插件?

yacmzcpb  于 2023-01-21  发布在  Webpack
关注(0)|答案(3)|浏览(157)

我被分配到一个项目,他们有一个webpack离线插件在过去,但现在我们没有它,这是完全没有必要有它的项目。
它是这样安装的:

new OfflinePlugin({
  updateStrategy: 'changed',
  autoUpdate: 1000 * 60 * 10,
  minify: {
    removeComments: true,
    collapseWhitespace: true,
    removeRedundantAttributes: true,
    useShortDoctype: true,
    removeEmptyAttributes: true,
    removeStyleLinkTypeAttributes: true,
    keepClosingSlash: true,
    minifyJS: true,
    minifyCSS: true,
    minifyURLs: true,
  },
  ServiceWorker: {
    events: true,
    navigateFallbackURL: '/',
  },
})

现在我正在努力删除为生产域上的旧客户端创建的服务工人,这些客户端在离线插件被删除之前访问网站,最重要的是,每次我尝试再次刮取时,Facebookscraper工具似乎都会获得旧版本,这一点至关重要,因为我已经在生产中部署了新的SSR功能。
我已经尝试过:

  1. webpack-remove-serviceworker-plugin
    1.将以下代码添加到index.html
if (window.navigator && navigator.serviceWorker) {
      navigator.serviceWorker.getRegistrations()
        .then(function (registrations) {
          let registrationsLength = registrations.length;
          while(registrationsLength--) {
            registrations[registrationsLength].unregister();
          }
        });
    }

1.将sw.js替换为以下内容:

self.addEventListener('install', function(e) {
      self.skipWaiting();
    });
    
    self.addEventListener('activate', function () {
      self.registration.unregister().then(function () {
        return self.clients.matchAll();
      }).then(function (clients) {
        clients.forEach((client) => {
          if (client.url && 'navigate' in client) {
            client.navigate(client.url);
          }
        });
      });
    });

这些都没有解决我的问题。部署项目在一个新的服务器与另一个域的工作正常。任何提示或建议,这个问题?

qlzsbp2j

qlzsbp2j1#

我遇到了同样的问题,您需要旧的sw.js(通过OfflinePlugin生成)替换为包含以下内容的sw.js:

self.addEventListener('install', function(e) {
  self.skipWaiting();
});

self.addEventListener('activate', function(e) {
  self.registration.unregister()
    .then(function() {
      return self.clients.matchAll();
    })
    .then(function(clients) {
      clients.forEach(client => client.navigate(client.url))
    });
});

这帮我赶走了一个老服务员。

sq1bmfud

sq1bmfud2#

至于我,我只是用一个新的不存在的范围服务工人来代替旧的,

ServiceWorker: {
        events: true,
        // what range of URLs a service worker can control. Use a nonexistent path to disable ServiceWorker
        scope: '/disable-service-worker/',
      },

至于app.js,我添加以下代码来注销旧的sw:

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.getRegistrations().then(registrations => {
    for (const registration of registrations) {
      // keep only serviceWorker which scope is /disable-service-worker/, The purpose is to make serviceWorker useless
      if (registration.scope.includes('/disable-service-worker/') === false) {
        registration.unregister()
      }
    }
  });
  // clear cache of service worker
  caches.keys().then(keyList => {
    return Promise.all(
      keyList.map(key => {
        return caches.delete(key);
      }),
    );
  });
}

两个月后,几乎每个用户都在chrome中安装了新的sw.js,然后可以禁用离线插件,不影响用户

uqcuzwp8

uqcuzwp83#

我已成功解决了与https://stackoverflow.com/a/25039719/1964570相关的问题
原来网站被转移到另一个主机,我们有一些ipv6 AAAA DNS记录,优先于新的ipv4记录,所以在删除它们(加上仍然保留那些解决方案,以删除服务工人),并在清除缓存和2-3刷新后,网站恢复正常运行,facebook刮擦也得到修复

相关问题