javascript - Service Worker 抛出错误 "Uncaught (in promise) DOMException"

标签 javascript css html service-worker

我在 HTML5 中运行单页登陆,我使用了 bitsofcode 的教程 ( https://bitsofco.de/setting-up-a-basic-service-worker/ ) 来实现我的第一个服务 worker 。

页面在 one.com 上设置并通过 cloudflare 运行。

我已经添加了一些缓存文件,但其他的是它的源文件是完整的。

Chrome 控制台给我这个错误:

Uncaught (in promise) DOMException service-worker.js:1

我知道它会启动,因为在我得到错误之前:

[ServiceWorker] Installed [ServiceWorker] Caching cacheFiles

查看日志,我看到了这些消息:

Console: {
  "lineNumber":24,
  "message":"[ServiceWorker] Installed",
  "message_level":1,
  "sourceIdentifier":3,
  "sourceURL":"https://WWW.MYURL.COM/service-worker.js"
}

Console: {
  "lineNumber":33,
  "message":"[ServiceWorker] Caching cacheFiles",
  "message_level":1,
  "sourceIdentifier":3,
  "sourceURL":"https://WWW.MYURL.COM/service-worker.js"
}

Error: {
  "columnNumber":-1,
  "lineNumber":-1,
  "message":"ServiceWorker failed to install: ServiceWorker failed to handle event (event.waitUntil Promise rejected)",
  "sourceURL":""
}

Console: {
  "lineNumber":0,
  "message":"Uncaught (in promise) InvalidStateError: Cache.addAll(): duplicate requests (https://WWW.MYURL.COM/favicon-32x32.png)",
  "message_level":3,
  "sourceIdentifier":1,
  "sourceURL":"https://WWW.MYURL.COM/service-worker.js"
}

服务 worker .js

var cacheName = 'v7'; 

// Default files to always cache
var cacheFiles = [
    './',
    './index.html',
    './favicon-96x96.png',
    './favicon-196x196.png',
    './favicon-128.png',
    './favicon-16x16.png',
    './favicon-32x32.png',
    './favicon-32x32.png',
    './manifest.json',
    './assets/css/images/bg2.jpg',
    './assets/css/images/bg2.webp',
    './assets/css/font-awesome.min.css',
    './assets/fonts/fontawesome-webfont.woff2?v=4.7.0',
    './assets/css/main.css',
    'https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,900'
]


self.addEventListener('install', function(e) {
    console.log('[ServiceWorker] Installed');

    // e.waitUntil Delays the event until the Promise is resolved
    e.waitUntil(

        // Open the cache
        caches.open(cacheName).then(function(cache) {

            // Add all the default files to the cache
            console.log('[ServiceWorker] Caching cacheFiles');
            return cache.addAll(cacheFiles);
        })
    ); // end e.waitUntil
});


self.addEventListener('activate', function(e) {
    console.log('[ServiceWorker] Activated');

    e.waitUntil(

        // Get all the cache keys (cacheName)
        caches.keys().then(function(cacheNames) {
            return Promise.all(cacheNames.map(function(thisCacheName) {

                // If a cached item is saved under a previous cacheName
                if (thisCacheName !== cacheName) {

                    // Delete that cached file
                    console.log('[ServiceWorker] Removing Cached Files from Cache - ', thisCacheName);
                    return caches.delete(thisCacheName);
                }
            }));
        })
    ); // end e.waitUntil

});


self.addEventListener('fetch', function(e) {
    console.log('[ServiceWorker] Fetch', e.request.url);

    // e.respondWidth Responds to the fetch event
    e.respondWith(

        // Check in cache for the request being made
        caches.match(e.request)


            .then(function(response) {

                // If the request is in the cache
                if ( response ) {
                    console.log("[ServiceWorker] Found in Cache", e.request.url, response);
                    // Return the cached version
                    return response;
                }

                // If the request is NOT in the cache, fetch and cache

                var requestClone = e.request.clone();
                fetch(requestClone)
                    .then(function(response) {

                        if ( !response ) {
                            console.log("[ServiceWorker] No response from fetch ")
                            return response;
                        }

                        var responseClone = response.clone();

                        //  Open the cache
                        caches.open(cacheName).then(function(cache) {

                            // Put the fetched response in the cache
                            cache.put(e.request, responseClone);
                            console.log('[ServiceWorker] New Data Cached', e.request.url);

                            // Return the response
                            return response;

                        }); // end caches.open

                    })
                    .catch(function(err) {
                        console.log('[ServiceWorker] Error Fetching & Caching New Data', err);
                    });


            }) // end caches.match(e.request)
    ); // end e.respondWith
});

和 SW 的注册(放在我的 html 正文的最后)

<script type="text/javascript">
        if ('serviceWorker' in navigator) {
          navigator.serviceWorker.register('service-worker.js');
        };      
</script>

最佳答案

您不能多次将相同的资源提供给 Cache.addAll。

您有两次 favicon-32x32.png。您也可以从最后一条控制台消息中看到这一点 :)

关于javascript - Service Worker 抛出错误 "Uncaught (in promise) DOMException",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55733682/

相关文章:

javascript - 无法显示 :none my mobile menu button

c# - 将域名附加到编辑器的电子邮件中

javascript - 如何使用 shadow-dom web 组件实现一致的焦点轮廓颜色?

javascript - 如何使用 JavaScript 或 jQuery 克隆 HTML 元素的样式对象?

jQuery onClick 导航选项卡 - 需要拉入正文内容

html - 如何限制html中文件上传的数量?

javascript - React - 从字节字符串中的 API 响应正文下载 Zip 文件?

jquery - 在具有特定视口(viewport)(例如低于 320 像素)的设备上显示完整(桌面 View )网站?

html - 为什么 'use' 标签大小与它引用的 svg 元素不匹配?

javascript - 避免在 underscorejs 上使用全局变量