微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Service Worker 不会停止初始请求,并且只出现一次

如何解决Service Worker 不会停止初始请求,并且只出现一次

I asked a question last week 关于这个并得到了一个非常有帮助的答案,但我仍然在努力让它按预期工作,尽管在这一点上我不完全确定我被要求做的是可能。

因此,当 ?testMode=true 被添加到 URL 时,这个 service worker 应该被激活,这似乎发生了。然后,Service Worker 应该在特定请求发生之前拦截它们,然后将其重定向到模拟数据。我目前所拥有的将存储模拟数据并在发出特定请求时调用它,但它实际上并没有阻止初始请求的发生,因为它仍然出现在网络选项卡中。

因此,例如,如果请求包含 /units/all?availability=Active&roomTypeHandle=kitchens,则 Service Worker 旨在拦截该请求,而不是通过该请求,应该使用 mock-data/unitData.json .

这是我目前所拥有的:

TestMode.ts

class TestMode {
    constructor() {
        if (!this.isEnabled()) {
            return;
        }

        if (!('serviceWorker' in navigator)) {
            console.log('browser does not support service workers');
            return;
        }

        this.init();
    }

    private init(): void {
        navigator.serviceWorker
            .register('planner-worker/js/worker.min.js')
            .then(this.handleRegistration)
            .catch((error) => { throw new Error('Service Worker registration Failed: ' + error.message); });

        navigator.serviceWorker.addEventListener('message',event => {
            // event is a MessageEvent object
            console.log(`The service worker sent me a message: ${event.data}`);
        });

        navigator.serviceWorker.ready.then( registration => {
            if (!registration.active) {
                console.log('Failed to communicate')

                return;
            }

            registration.active.postMessage("Hi service worker");
        });
    }

    private handleRegistration(registration: ServiceWorkerRegistration): void {
        registration.update();

        console.log('Registration successful,scope is:',registration.scope);
    }

    private isEnabled(): boolean {
        return locationService.hasParam('testMode');
    }
}

export default new TestMode(); 

serviceWorker.js

const CACHE_NAME = 'mockData-cache';

const MOCK_DATA = {
    '/units/all?availability=Active&roomTypeHandle=kitchens': 'mock-data/unitData.json','/frontal-ranges/kitchens?' : 'mock-data/kitchensData.json','/carcase-ranges/?availability=Active&roomTypeHandle=kitchens' : 'mock-data/carcaseRangesData.json','/products/830368/related?roomTypeHandle=kitchens&productStateHandle=Active&limit=1000&campaignPhaseId=183&retailStore=Finishing%20touches%20%28Extra%29'
    : 'mock-data/relatedItems.json'
};


self.addEventListener('install',event => {
    console.log('Attempting to install service worker and cache static assets');
    event.waitUntil(
        caches.open(CACHE_NAME)
            .then(cache => {
                return cache.addAll(Object.values(MOCK_DATA));
            })
    );
});


self.addEventListener('activate',function(event) {
    return self.clients.claim();
});

self.addEventListener('fetch',(event) => {
    const url = new URL(event.request.url);
    const pathAndQuery = url.pathname + url.search;

    if (pathAndQuery in MOCK_DATA) {
        const cacheKey = MOCK_DATA[pathAndQuery];
        event.respondWith(
            caches.match(cacheKey,{
                cacheName: CACHE_NAME,})
        );
    }
});

另一件我不知道如何解决的事情是 fetch 事件只发生一次。我的意思是,当对 serviceWorker.js 进行更改时,模拟数据存储在缓存中,文件出现在开发工具的网络选项卡中,但是如果我刷新页面,或关闭它并在另一个选项卡中重新打开,模拟数据不再位于网络选项卡中,就好像根本没有使用 Service Worker。我怎样才能更新它以便它总是被使用?我可以在控制台日志中看到 Service Worker 已注册,但它似乎没有被使用。

如果我不应该在 1 个帖子中问 2 个问题,我深表歉意,只是真的不知道如何解决我的问题。提前感谢您的指导。

解决方法

原来我的问题是范围一。一旦移动到 Service Worker 的存储位置,它就开始按预期工作。当我发现 fetch 事件实际上并未触发时,我意识到情况确实如此。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。