javascript - 了解 Chrome 中 Service Worker 缓存文件的时间统计信息

标签 javascript service-worker

我试图了解 Chrome 开发工具中的网络选项卡告诉我来自 Service Worker 的缓存文件的内容。

我看到控制台中记录了缓存命中(请参阅下面的服务工作线程代码),但网络选项卡使其看起来像常规网络负载。 230 毫秒对于缓存命中来说似乎有点大。而且该值通常会发生少量变化(下一次加载可能是 217 毫秒),因此它不会向我显示首次缓存时的原始加载时间,正如我所想的那样。

enter image description here

注册Service Worker的代码是这样的

if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('swRoot.js').then(() => {
        console.log('registered');

        System.import('react');
        System.import('react-dom');
        System.import('a').then(({ a }) => console.log('value from a', a));
    }, err => console.log(err));
}

swRoot.js 的全部内容如下

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

    console.log('ADDING CACHE FILES');
    event.waitUntil(
        caches.open('v1').then(function(cache) {
            return cache.addAll([
                '/react-redux/node_modules/react/dist/react-with-addons.js',
                '/react-redux/node_modules/react-dom/dist/react-dom.js',
                '/react-redux/a.js'
            ]).then(function(){ console.log('cache filling success'); }).catch(function(){ console.log('cache filling failure') });
        })
    );
});

console.log('ADDING FETCH at root level');
self.addEventListener('fetch', function(event) {
    event.respondWith(
        caches.match(event.request)
            .then(function(response) {
                // Cache hit - return response
                if (response) {
                    console.log('cache hit', event.request);
                    return response;
                }
                return fetch(event.request);
            })
    );
});


self.addEventListener('activate', function(event) {
    console.log('ACTIVATE');
});

最佳答案

这个previous answer对于如何解释 Service Worker 参与网络面板中的条目有一些背景知识。

您提供的屏幕截图显示了从服务工作人员返回的响应,没有任何网络参与,因此它可能直接来自缓存。 (如果您的屏幕截图中未包含另一个条目,并且旁边有一个小齿轮图标,那么那就另当别论了。)

“网络”面板中显示的约 200 毫秒的计时反射(reflect)了发出请求的页面与获取响应的页面之间经过的总时间量。当涉及 Service Worker 时,如果页面的主线程正在执行其他任务,则发出请求和处理响应都可能会延迟。在您的示例中,我假设主线程由于 System.import() 调用而忙于评估和执行一堆 JavaScript,因此大约 200 毫秒的开销可能可以由此解释。

Chromium 团队正在评估从请求/响应关键路径中删除主线程的方法,并且正在 https://bugs.chromium.org/p/chromium/issues/detail?id=443374 上对此进行跟踪。

关于javascript - 了解 Chrome 中 Service Worker 缓存文件的时间统计信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41081611/

相关文章:

javascript - Gulp livereload SyntaxError : Unexpected token . 如何修复?

javascript - Mongoose,使用查找选择特定字段

javascript - jQuery 验证插件无法正常工作

javascript - 如何将 Service Worker 预取与跨导航取结合起来?

reactjs - 创建 React App PWA - 更改 Service Worker 的缓存策略

javascript - 需要更简单的 JS 代码,只有一个 ID 属性

javascript - 这个正则表达式有什么问题 - 与不情愿的量词有关吗?

javascript - 了解 ServiceWorker 注册

javascript - firebase web 通知 - 如何在 firebase-messaging-sw.js 中使用 document 或 window.document

reactjs - 带有 CommonsChunkPlugin 的 Serviceworker Chunk 不起作用,未定义 webpackJsonp