如何使用 Webpack 5 加载 Service Worker?

Ric*_*nho 5 javascript reactjs webpack service-worker

我正在使用 Webpack 5,并且我想要一个 Service Worker,它可以在不访问网络的情况下拦截获取请求并在本地返回响应。我还希望能够在 Service Worker 中导入 npm 模块。我曾经为此使用一个名为serviceworker-webpack-plugin的库,但它不再维护,(并且在我使用时抛出错误)。Webpack 文档建议使用 Workbox,但据我所知,这似乎只是用于在 Service Worker 中缓存资产。有人能告诉我 2020 年使用 Webpack 5 创建 Service Worker 的正确方法是什么吗?

pfg*_*pfg 11

将 Service Worker 添加到您的 webpack.config.js 条目字段

entry: {
    'app': "./src/index.js",
    'service-worker': "./src/service-worker.ts",
},
output: {
    filename: "[name].js",
},
Run Code Online (Sandbox Code Playgroud)

这将发出dist/app.jsdist/service-worker.js,并且可以在两者中导入内容。

serviceworker-webpack-plugin还为 serviceworker 提供了一种查看应缓存的所有捆绑文件列表的方法,但该功能无法直接使用,需要制作 webpack 插件才能获取。


Ifa*_*uki -2

不要把它搞得太复杂。

只需 2 步即可让软件工作。创建一个sw并注册它。

创建一个 .js 文件,sw.js并在其中写入:

self.addEventListener('fetch', function (event) {
  event.respondWith(
    caches.open('mysite-dynamic').then(function (cache) {
      return cache.match(event.request).then(function (response) {
        var fetchPromise = fetch(event.request).then(function (networkResponse) {
          cache.put(event.request, networkResponse.clone());
          return networkResponse;
        });
        return response || fetchPromise;
      });
    }),
  );
});
Run Code Online (Sandbox Code Playgroud)

这就是重新验证时过时的方法

现在就注册吧。

if ('serviceWorker' in navigator) {
  window.addEventListener('load', function() {
    navigator.serviceWorker.register('/sw.js').then(function(registration) {
      // Registration was successful
      console.log('ServiceWorker registration successful with scope: ', registration.scope);
    }, function(err) {
      // registration failed :(
      console.log('ServiceWorker registration failed: ', err);
    });
  });
}
Run Code Online (Sandbox Code Playgroud)

  • 这是行不通的,因为 Service Worker 必须位于构建文件夹中,如果 Webpack 不知道它,它就不会把它放在那里。 (8认同)