service-worker - 改变什么来防止来自服务人员的双重请求?
问题描述
请不要标记为重复。这与 SO 上的其他类似问题并不完全相同。它更具体且完全可重复。
- 克隆这个repo。
yarn && yarn dev
- 转到
localhost:3000
并确保在 (F12)->Applications->Service Worker 下安装了 Service Worker。 - 转到网络选项卡并刷新几次(F5)
- 观察网络请求是如何加倍的。
或者,如果您想手动执行此操作,请按照以下说明操作:
yarn create-next-app app_name
cd app_name && yarn
- 在公用文件夹中,创建名为
service-worker.js
并粘贴以下代码的文件:
addEventListener("install", (event) => {
self.skipWaiting();
console.log("Service worker installed!");
});
self.addEventListener("fetch", (event) => {
event.respondWith(
(async function () {
const promiseChain = fetch(event.request.clone()); // clone makes no difference
event.waitUntil(promiseChain); // makes no difference
return promiseChain;
})()
);
});
- 打开
pages/index.js
并在下面import Head from "next/head";
粘贴以下代码:
if (typeof window !== "undefined" && "serviceWorker" in navigator) {
window.addEventListener("load", function () {
// there probably needs to be some check if sw is already registered
navigator.serviceWorker
.register("/service-worker.js", { scope: "/" })
.then(function (registration) {
console.log("SW registered: ", registration);
})
.catch(function (registrationError) {
console.log("SW registration failed: ", registrationError);
});
});
}
yarn dev
- 转到
localhost:3000
并确保已在 (F12)Applications/Service Workers 下加载了 service worker - 转到网络选项卡并刷新页面几次。查看 service worker 如何为每个请求发送两个请求
我需要在service-worker.js
代码中更改什么以便没有双重请求?
解决方案
这就是 Chrome DevTools 显示请求和预期的方式。
有从客户端 JavaScript 到 Service Worker 的资源请求和从 Service Worker 到服务器的请求。除非服务工作者缓存了响应并且不需要检查服务器是否有更新,否则这种情况总是会发生。
推荐阅读
- linux - 迭代文件中的变量以检查 bash 中的特定值
- java - 从 PriorityQueue 转换为 ArrayList
- php - 带有 OpenSSL 的 PHP 中的 chacha20-poly1305
- c - 从不同的文件(主文件)访问 C 结构成员
- lotus-notes - 附件在笔记文档上显示两次
- django - 什么是 django 中的块用户工具?
- node.js - 使用 http-proxy-middleware 时无法传递 req.params ... NodeJS/Express
- javascript - 如何在 jQuery 中选择除对象和对象子项之外的所有内容(使用事件委托)
- r - R:理解与制作多边形相关的错误消息的问题
- mysql - 当我将数据从 servlet 存储到 mysql 数据库时,像“<”、“>”这样的字符被存储为像 u003c 这样的 unicode 格式,而不是实际的符号