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,38 +31,72 @@ 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
- if ( ! installingWorker ) {
30
- return ;
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
+ }
42
+ } ) ;
43
+ }
44
+ }
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.' ) ;
31
65
}
66
+ }
67
+ } ;
68
+ } ;
69
+ } )
70
+ . catch ( error => {
71
+ console . error ( 'Error during service worker registration:' , error ) ;
72
+ } ) ;
73
+ }
32
74
33
- installingWorker . onstatechange = ( ) => {
34
- if ( installingWorker . state === 'installed' ) {
35
- if ( navigator . serviceWorker . controller ) {
36
- // At this point, the old content will have been purged and
37
- // the fresh content will have been added to the cache.
38
- // It's the perfect time to display a "New content is
39
- // available; please refresh." message in your web app.
40
- console . log ( 'New content is available; please refresh.' ) ; // tslint:disable-line
41
- } else {
42
- // At this point, everything has been precached.
43
- // It's the perfect time to display a
44
- // "Content is cached for offline use." message.
45
- console . log ( 'Content is cached for offline use.' ) ; // tslint:disable-line
46
- }
47
- }
48
- } ;
49
- } ;
50
- } )
51
- . catch ( error => {
52
- console . error ( 'Error during service worker registration:' , error ) ; // tslint:disable-line
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
+ } ) ;
53
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
+ ) ;
54
99
} ) ;
55
- }
56
100
}
57
101
58
102
export function unregister ( ) {
0 commit comments