@@ -85,7 +85,7 @@ class HelloMessage extends React.Component {
8585}
8686const 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
140132const footer = `</div>
133+ <style src="/worker.js"></script>
141134</body>
142135</html>` ;
143136
@@ -147,14 +140,47 @@ let routes = {
147140
148141async 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
158162self . 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