В чем разница между XMLHttpRequest и Service Worker API для предварительной загрузки ресурсов моего веб-приложения - PullRequest
0 голосов
/ 30 марта 2020

У меня есть код ниже, чтобы предварительно загрузить указанные c файлы в кеш, и он отлично работает, используя XMLHttpRequest.

Вопрос в том, в чем разница между моим подходом и использованием Service Worker API , если я хочу использовать его только на Chrome.

Каковы плюсы и минусы Service Worker API по сравнению с использованием XMLHttpRequest?

Если они оба сохраняют данные в кэш браузера , почему я должен использовать Service Worker?

preload();

function preload(){

(function (global, factory) {
	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
	typeof define === 'function' && define.amd ? define(factory) :
	(global.Preload = factory());
}(this, (function () { 'use strict';

	function preloadOne(url, done) {
		const xhr = new XMLHttpRequest();
		xhr.open('GET', url, true);
		xhr.responseType = 'blob';
		xhr.onprogress = event => {
			if (!event.lengthComputable) return false
			let item = this.getItemByUrl(event.target.responseURL);
			item.completion = parseInt((event.loaded / event.total) * 100);
			item.downloaded = event.loaded;
			item.total = event.total;
			this.updateProgressBar(item);
		};
		xhr.onload = event => {
			let type = event.target.response.type;
			let blob = new Blob([event.target.response], { type: type });
			let url = URL.createObjectURL(blob);
			let responseURL = event.target.responseURL;
			let item = this.getItemByUrl(responseURL);
			item.blobUrl = url;
			item.fileName = responseURL.substring(responseURL.lastIndexOf('/') + 1);
			item.type = type;
			item.size = blob.size;
			done(item);
		};
		
		xhr.onerror = event => {
        console.log('Error has happend so we restart the preloading..');
        preload();
        };
        
		xhr.send();
	}

	function updateProgressBar(item) {
		var sumCompletion = 0;
		var maxCompletion = this.status.length * 100;

		for (var itemStatus of this.status) {
			if (itemStatus.completion) {
				sumCompletion += itemStatus.completion;
			}
		}
		var totalCompletion = parseInt((sumCompletion / maxCompletion) * 100);

		if (!isNaN(totalCompletion)) {
			this.onprogress({
				progress: totalCompletion,
				item: item
			});
		}
	}

	function getItemByUrl(rawUrl) {
	    for (var item of this.status) {
	        if (item.url == rawUrl) return item
	    }
	}

	function fetch(list) {	
		return new Promise((resolve, reject) => {
			this.loaded = list.length;
			for (let item of list) {
				this.status.push({ url: item });
				this.preloadOne(item, item => {
					this.onfetched(item);
					this.loaded--;
					if (this.loaded == 0) {
						this.oncomplete(this.status);
						resolve(this.status);
					}
				});
			}
		})
	}

	function Preload() {
		return {
			status: [],
			loaded: false,
			onprogress: () => {},
			oncomplete: () => {},
			onfetched: () => {},
			fetch,
			updateProgressBar,
			preloadOne,
			getItemByUrl
		}
	}

	return Preload;

})));


	const preload = Preload();

	preload.fetch([
	    'https://round-arm-authority.000webhostapp.com/Ultimate%20Video%20Hack/videos/vid1.mp4'

	]).then(items => {
	  // use either a promise or 'oncomplete'
	  console.log(items);
	});

	preload.oncomplete = items => {
	  console.log(items);
	}

	preload.onprogress = event => {
	  console.log(event.progress + '%');
	}

	preload.onfetched = item => {
	  console.log(item);
	}
	
};

1 Ответ

1 голос
/ 31 марта 2020

Сервисный работник позволяет перехватывать запросы навигации и обслуживать HTML непосредственно из кэша, при этом все еще имея внеполосный механизм для обновления этого HTML при развертывании изменений в вашем site.

Сервисный работник позволяет вам использовать более сложные стратегии обновления и восстановления для своих подресурсов, чем позволяет HTTP-кеш.

...