如何从webpack中的内存缓存加载Web Worker

pnwntuvh  于 2023-04-30  发布在  Webpack
关注(0)|答案(1)|浏览(157)

bounty明天到期。回答此问题可获得+500声望奖励。wvdz希望引起更多关注这个问题。

我用create-react-app创建了我的应用程序,它使用webpack@5.64.4
我有一个Web worker,它按照https://webpack.js.org/guides/web-workers/的指导加载如下

export function createWorker() {
  return new Worker(new URL('../worker/my-worker.ts', import.meta.url));
}

这一切都很完美,除了一个警告:当没有因特网连接时,它总是失败,即使worker已经在该高速缓存中。这打破了我的应用程序的离线体验。
在网络日志中,我可以看到我们总是发送一个网络请求来检查更新的worker chunk。服务器将回复304 NOT MODIFIED,之后它将正常工作。但是,如果无法访问服务器,则不会加载脚本,我们将失败。其他块从内存缓存中正确地提供,而无需调用服务器。

ulydmbyx

ulydmbyx1#

下面是sw的javascript代码。js,serviceworker文件将拦截网络请求并从缓存中提供服务:

const CACHE_NAME = "my-app-cache-v1";

self.addEventListener("fetch", event => {
    event.respondWith(
        fetch(event.request).then(response => { //if the response was successful, clone it and store it in the cache
            if (response.status === 200) {
                caches.open(CACHE_NAME).then(cache => {
                    cache.put(event.request.url, response.clone());
                });
            }
            return response;
        }).catch(() => { //if the request fails, try to serve it from the cache
            return caches.match(event.request).then(response => {
                return response || fetch(event.request);
            });
        })
    );
});

要注册它,请在您的页面上调用以下命令:

if ("serviceWorker" in navigator) {
    window.addEventListener("load", () => {
        navigator.serviceWorker.register("/sw.js");
    });
}

请注意,serviceworker将在您的域根目录下的任何页面中处于活动状态,而不仅仅是在调用此注册的页面中。
您可以在devtools中查看网络请求是否从网络、浏览器缓存或serviceworker提供服务,以确认它正在工作。

相关问题