8
8
// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.
9
9
// This link also includes instructions on opting out of this behavior.
10
10
11
+ const isLocalhost = Boolean (
12
+ window . location . hostname === 'localhost' ||
13
+ // [::1] is the IPv6 localhost address.
14
+ window . location . hostname === '[::1]' ||
15
+ // 127.0.0.1/8 is considered localhost for IPv4.
16
+ window . location . hostname . match (
17
+ / ^ 1 2 7 (?: \. (?: 2 5 [ 0 - 5 ] | 2 [ 0 - 4 ] [ 0 - 9 ] | [ 0 1 ] ? [ 0 - 9 ] [ 0 - 9 ] ? ) ) { 3 } $ /
18
+ )
19
+ ) ;
20
+
11
21
export default function register ( ) {
12
22
if ( process . env . NODE_ENV === 'production' && 'serviceWorker' in navigator ) {
13
23
// The URL constructor is available in all browsers that support SW.
@@ -21,36 +31,74 @@ export default function register() {
21
31
22
32
window . addEventListener ( 'load' , ( ) => {
23
33
const swUrl = `${ process . env . PUBLIC_URL } /service-worker.js` ;
24
- navigator . serviceWorker
25
- . register ( swUrl )
26
- . then ( registration => {
27
- registration . onupdatefound = ( ) => {
28
- const installingWorker = registration . installing ;
29
- installingWorker . onstatechange = ( ) => {
30
- if ( installingWorker . state === 'installed' ) {
31
- if ( navigator . serviceWorker . controller ) {
32
- // At this point, the old content will have been purged and
33
- // the fresh content will have been added to the cache.
34
- // It's the perfect time to display a "New content is
35
- // available; please refresh." message in your web app.
36
- console . log ( 'New content is available; please refresh.' ) ;
37
- } else {
38
- // At this point, everything has been precached.
39
- // It's the perfect time to display a
40
- // "Content is cached for offline use." message.
41
- console . log ( 'Content is cached for offline use.' ) ;
42
- }
43
- }
44
- } ;
45
- } ;
46
- } )
47
- . catch ( error => {
48
- console . error ( 'Error during service worker registration:' , error ) ;
49
- } ) ;
34
+
35
+ if ( ! isLocalhost ) {
36
+ // Is not local host. Just register service worker
37
+ registerValidSW ( swUrl ) ;
38
+ } else {
39
+ // This is running on localhost. Lets check if a service worker still exists or not.
40
+ checkValidServiceWorker ( swUrl ) ;
41
+ }
50
42
} ) ;
51
43
}
52
44
}
53
45
46
+ function registerValidSW ( swUrl ) {
47
+ navigator . serviceWorker
48
+ . register ( swUrl )
49
+ . then ( registration => {
50
+ registration . onupdatefound = ( ) => {
51
+ const installingWorker = registration . installing ;
52
+ installingWorker . onstatechange = ( ) => {
53
+ if ( installingWorker . state === 'installed' ) {
54
+ if ( navigator . serviceWorker . controller ) {
55
+ // At this point, the old content will have been purged and
56
+ // the fresh content will have been added to the cache.
57
+ // It's the perfect time to display a "New content is
58
+ // available; please refresh." message in your web app.
59
+ console . log ( 'New content is available; please refresh.' ) ;
60
+ } else {
61
+ // At this point, everything has been precached.
62
+ // It's the perfect time to display a
63
+ // "Content is cached for offline use." message.
64
+ console . log ( 'Content is cached for offline use.' ) ;
65
+ }
66
+ }
67
+ } ;
68
+ } ;
69
+ } )
70
+ . catch ( error => {
71
+ console . error ( 'Error during service worker registration:' , error ) ;
72
+ } ) ;
73
+ }
74
+
75
+ function checkValidServiceWorker ( swUrl ) {
76
+ // Check if the service worker can be found. If it can't reload the page.
77
+ fetch ( swUrl )
78
+ . then ( response => {
79
+ // Ensure service worker exists, and that we really are getting a JS file.
80
+ if (
81
+ response . status === 404 ||
82
+ response . headers . get ( 'content-type' ) . indexOf ( 'javascript' ) === - 1
83
+ ) {
84
+ // No service worker found. Probably a different app. Reload the page.
85
+ navigator . serviceWorker . ready . then ( registration => {
86
+ registration . unregister ( ) . then ( ( ) => {
87
+ window . location . reload ( ) ;
88
+ } ) ;
89
+ } ) ;
90
+ } else {
91
+ // Service worker found. Proceed as normal.
92
+ registerValidSW ( swUrl ) ;
93
+ }
94
+ } )
95
+ . catch ( ( ) => {
96
+ console . log (
97
+ 'No internet connection found. App is running in offline mode.'
98
+ ) ;
99
+ } ) ;
100
+ }
101
+
54
102
export function unregister ( ) {
55
103
if ( 'serviceWorker' in navigator ) {
56
104
navigator . serviceWorker . ready . then ( registration => {
0 commit comments