带有工作箱的服务工作者 - 未捕获的语法错误:意外的标记“<”..跳过等待

Pav*_*sko 5 javascript reactjs service-worker workbox

我已经用 CRA 创建了 React 应用程序。我想要定制软件。我正在使用workbox-build 和injectManifest 来创建我的SW。但我仍然坚持等待激活 =/ 和 Uncaught SyntaxError: Unexpected token '<'。或者..

如果我使用 sw-template2.js .. 我可以跳过等待.. 但我仍然收到 Uncaught SyntaxError: Unexpected token '<' 和白页,我需要手动刷新页面才能查看内容。有什么建议如何使用该软件顺利更新我的页面吗?

我的registerServiceWorker.js:

// In production, we register a service worker to serve assets from local cache.

// This lets the app load faster on subsequent visits in production, and gives
// it offline capabilities. However, it also means that developers (and users)
// will only see deployed updates on the "N+1" visit to a page, since previously
// cached resources are updated in the background.

// To learn more about the benefits of this model, read .
// This link also includes instructions on opting out of this behavior.

const isLocalhost = Boolean(
    window.location.hostname === 'localhost' ||
    // [::1] is the IPv6 localhost address.
    window.location.hostname === '[::1]' ||
    // 127.0.0.1/8 is considered localhost for IPv4.
    window.location.hostname.match(
        /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
    )
);

export default function register() {
    if ('serviceWorker' in navigator) {
        // The URL constructor is available in all browsers that support SW.
        const publicUrl = new URL(process.env.PUBLIC_URL, window.location);
        if (publicUrl.origin !== window.location.origin) {
            // Our service worker won't work if PUBLIC_URL is on a different origin
            // from what our page is served on. This might happen if a CDN is used to
            // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374
            return;
        }

        window.addEventListener('load', () => {
            const swUrl = `${process.env.PUBLIC_URL}/sw.js`;

            if (isLocalhost) {
                // This is running on localhost. Lets check if a service worker still exists or not.
                // checkValidServiceWorker(swUrl);
                registerValidSW(swUrl);
            } else {
                // Is not local host. Just register service worker
                registerValidSW(swUrl);
            }
        });
    }
}

function registerValidSW(swUrl) {
    console.log('register ' + swUrl);

    navigator.serviceWorker.register(swUrl)
        .then(registration => {
            registration.onupdatefound = () => {
                const installingWorker = registration.installing;

                if (installingWorker) {
                    installingWorker.onstatechange = () => {
                        console.log('state ' + installingWorker.state);

                        if (installingWorker.state === 'installed') {
                            console.log('installed ' + navigator.serviceWorker.controller);

                            if (navigator.serviceWorker.controller) {
                                // At this point, the old content will have been purged and
                                // the fresh content will have been added to the cache.
                                // It's the perfect time to display a "New content is
                                // available; please refresh." message in your web app.
                                console.log('New content is available; please refresh.');

                                try {
                                    console.log('active start');
                                    let worker = registration.waiting
                                    if (worker) {
                                        console.log('worker start');
                                        worker.postMessage({ type: 'SKIP_WAITING' });
                                        console.log('worker finish');
                                    }
                                    registration.active.postMessage({ type: 'SKIP_WAITING' });
                                    console.log('active finish');
                                } catch (e) {
                                }
                            } else {
                                // At this point, everything has been precached.
                                // It's the perfect time to display a
                                // "Content is cached for offline use." message.
                                console.log('Content is cached for offline use.');
                            }
                        }
                    };
                }
            };
        })
        .catch(error => {
            console.error('Error during service worker registration:', error);
        });
}

function checkValidServiceWorker(swUrl) {
    // Check if the service worker can be found. If it can't reload the page.
    fetch(swUrl)
        .then(response => {
            // Ensure service worker exists, and that we really are getting a JS file.
            if (
                response.status === 404 ||
                response.headers.get('content-type').indexOf('javascript') === -1
            ) {
                // No service worker found. Probably a different app. Reload the page.
                navigator.serviceWorker.ready.then(registration => {
                    registration.unregister().then(() => {
                        window.location.reload();
                    });
                });
            } else {
                // Service worker found. Proceed as normal.
                registerValidSW(swUrl);
            }
        })
        .catch(() => {
            console.log(
                'No internet connection found. App is running in offline mode.'
            );
        });
}

export function unregister() {
    if ('serviceWorker' in navigator) {
        navigator.serviceWorker.ready.then(registration => {
            registration.unregister();
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

我的 sw-template.js

if (typeof importScripts === 'function') {
    importScripts('https://storage.googleapis.com/workbox-cdn/releases/5.1.3/workbox-sw.js');

    /* global workbox */
    if (workbox) {
        console.log('Workbox is loaded');

        self.addEventListener('message', (event) => {
            console.log(`The client sent me a message: ${event.data}`);

            if (event.data && event.data.type === 'SKIP_WAITING') {
                console.log('skipWaiting');
                self.skipWaiting();
            }
        });

        workbox.core.clientsClaim();

        /* injection point for manifest files.  */
        workbox.precaching.precacheAndRoute(self.__WB_MANIFEST);

        /* custom cache rules*/
        workbox.routing.registerRoute(
            new workbox.routing.NavigationRoute(
                workbox.precaching.createHandlerBoundToURL("/index.html"),
                {
                    denylist: [/^\/_/, /\/[^/?]+\.[^/]+$/],
                }
            ))

        workbox.googleAnalytics.initialize()

        workbox.routing.registerRoute(
            /.*\.(?:png|jpg|jpeg|svg|gif)/,
            new workbox.strategies.CacheFirst({
                cacheName: 'images',
            })
        );
    } else {
        console.log('Workbox could not be loaded. No Offline support');
    }
}
Run Code Online (Sandbox Code Playgroud)

sw-template2.js

if (typeof importScripts === 'function') {
    importScripts('https://storage.googleapis.com/workbox-cdn/releases/5.1.3/workbox-sw.js');

    /* global workbox */
    if (workbox) {
        console.log('Workbox is loaded');

        //self.addEventListener('message', (event) => {
        //    console.log(`The client sent me a message: ${event.data}`);

        //    if (event.data && event.data.type === 'SKIP_WAITING') {
        //        console.log('skipWaiting');
        //        self.skipWaiting();
        //    }
        //});

        self.addEventListener('install', function (event) {
            console.log('skipWaiting');
            self.skipWaiting();
        });

        workbox.core.clientsClaim();

        /* injection point for manifest files.  */
        workbox.precaching.precacheAndRoute(self.__WB_MANIFEST);

        /* custom cache rules*/
        workbox.routing.registerRoute(
            new workbox.routing.NavigationRoute(
                workbox.precaching.createHandlerBoundToURL("/index.html"),
                {
                    denylist: [/^\/_/, /\/[^/?]+\.[^/]+$/],
                }
            ))

        workbox.googleAnalytics.initialize()

        workbox.routing.registerRoute(
            /.*\.(?:png|jpg|jpeg|svg|gif)/,
            new workbox.strategies.CacheFirst({
                cacheName: 'images',
            })
        );
    } else {
        console.log('Workbox could not be loaded. No Offline support');
    }
}
Run Code Online (Sandbox Code Playgroud)