Skip to content

Commit 6e70911

Browse files
committed
workers PWA
1 parent 4f1e582 commit 6e70911

File tree

1 file changed

+43
-17
lines changed

1 file changed

+43
-17
lines changed

src/index.js

Lines changed: 43 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ class HelloMessage extends React.Component {
8585
}
8686
const header = `<!DOCTYPE html>
8787
<html lang="en">
88-
<title>Cloudflare Workers React Example</title>
88+
<title>Cloudflare Workers React PWA Example</title>
8989
<meta name="viewport" content="width=device-width, initial-scale=1">
9090
<style>
9191
#app {
@@ -125,19 +125,12 @@ body {
125125
.App-link {
126126
color: #61dafb;
127127
}
128-
@keyframes React-Logo-spin {
129-
from {
130-
transform: rotate(0deg);
131-
}
132-
to {
133-
transform: rotate(360deg);
134-
}
135-
}
136-
137128
</style>
138-
<body><div id="app">`;
129+
<body>
130+
<div id="app">`;
139131

140132
const footer = `</div>
133+
<style src="/worker.js"></script>
141134
</body>
142135
</html>`;
143136

@@ -147,14 +140,47 @@ let routes = {
147140

148141
async function handleRequest(event) {
149142
const u = new URL(event.request.url);
150-
let rendered = ReactDOMServer.renderToString(routes[u.pathname]);
151-
return new Response(header + rendered + footer, {
152-
headers: {
153-
"Content-Type": "text/html"
154-
}
155-
});
143+
if (u.pathname in routes) {
144+
let rendered = ReactDOMServer.renderToString(routes[u.pathname]);
145+
return new Response(header + rendered + footer, {
146+
headers: {
147+
"Content-Type": "text/html"
148+
}
149+
});
150+
}
151+
let cache = await caches.open("sevki-react");
152+
let response = await cache.match(event.request);
153+
154+
if (!response) {
155+
response = await fetch(event.request);
156+
event.waitUntil(cache.put(event.request, response.clone()));
157+
}
158+
159+
return response;
156160
}
157161

158162
self.addEventListener("fetch", event => {
159163
event.respondWith(handleRequest(event));
160164
});
165+
166+
if (typeof navigator !== "undefined") {
167+
if ("serviceWorker" in navigator) {
168+
window.addEventListener("load", function() {
169+
const app = document.querySelector("#app");
170+
ReactDOM.hydrate(routes[location.pathname], app);
171+
navigator.serviceWorker.register("/worker.js").then(
172+
function(registration) {
173+
// Registration was successful
174+
console.log(
175+
"ServiceWorker registration successful with scope: ",
176+
registration.scope
177+
);
178+
},
179+
function(err) {
180+
// registration failed :(
181+
console.log("ServiceWorker registration failed: ", err);
182+
}
183+
);
184+
});
185+
}
186+
}

0 commit comments

Comments
 (0)