#javascript #file #asynchronous #xmlhttprequest #browser-cache
#javascript #файл #асинхронный #xmlhttprequest #браузер-кэш
Вопрос:
Эй! Недавно я создал небольшую платформу для создания своих небольших веб-страниц и проектов поверх.
Сегодня я просматриваю множество статей о хитростях для ускорения работы. Я заинтересован в улучшении скорости xhr.
Я читал и обнаружил, что некоторые расширения файлов обычно кэшируются по умолчанию, а другие — нет.
Я использую специальное расширение filename.ff в своих фреймворках, чтобы знать, какие файлы я хочу использовать при доступе к ресурсу.
В качестве живого примера https://bugs.stringmanolo.ga/#projects/fastframework загружается с https://github.com/StringManolo/bugWriteups/blob/master/projects/fastframework/fastframework .ff с использованием XHR при нажатии на ссылку fastframework на этой странице https://bugs.stringmanolo.ga/#projects
Мой вопрос: если я изменю расширение с fastframework.ff на fastframework.ff.js кэшируется ли файл браузером, и тогда он будет загружен быстрее? Также будет работать в автономном режиме? Или оно уже кэшировано? Изменение используемого кода фреймворка.ff.js это вообще не будет иметь никакого значения?
Комментарии:
1. Если вам нужно кэширование, почему бы не установить заголовки управления кэшем для нужных вам ресурсов, вместо того, чтобы полагаться на функциональность, которая может быть или не быть в разных браузерах?
2. Потому что я не знаю, где будет работать фреймворк. Работает как в blogger, так и на сайте. Также я использую netlify для размещения своих проектов.
Ответ №1:
Я, наконец, решил это лучшим способом, используя service workers и cache api. Я предоставляю вам код, который я использовал здесь, так что, возможно, это поможет кому-то в будущем.
ff.js (ff — это объект ff = {})
/*** Cache Service Workers Code */
ff.cache = {}
ff.cache.resources = [];
ff.cache.start = function(swName, ttl) {
let tl = 0;
tl = localStorage.cacheTTL;
if ( tl) {
const now = new Date();
if (now.getTime() > localStorage.cacheTTL) {
localStorage.cacheTTL = 0;
caches.delete("cachev1").then(function() {
});
}
} else {
navigator.serviceWorker.register(swName, {
scope: './'
})
.then(function(reg) {
caches.open("cachev1")
.then(function(cache) {
cache.addAll(ff.cache.resources)
.then(function() {
localStorage.cacheTTL = (new Date().getTime()) ttl;
});
});
})
.catch(function(err) {
});
}
};
ff.cache.clean = function() {
caches.delete("cachev1").then(function() {
});
};
/* End Cache Service Workers Code ***/
cache.js (это сервисный работник, перехватывающий запросы)
self.addEventListener('fetch', (e) => {
e.respondWith(caches.match(e.request).then((response) => {
if(response)
return response
else
return fetch(e.request)
}) )
})
main.js (это основной файл, включенный в index.html файл)
ff.cache.resources = [
"./logs/dev/historylogs.ff",
"./blogEntries/xss/xss1.ff",
"./blogEntries/xss/w3schoolsxss1.ff",
"./blogEntries/csrf/w3schoolscsrf1.ff",
"./projects/fastframework/fastframework.ff",
"./projects/jex/jex.ff",
"./ff.js",
"./main.js",
"./main.css",
"./index.html",
"./resources/w3schoolspayload.png",
"./resources/w3schoolsxsslanscape.png",
"./resources/w3schoolsxss.png"];
ff.cache.start("./cache.js", 104800000);
/* 604800000 milliseconds equals 1 week */
Вы можете протестировать его в режиме реального времени в https://bugs.stringmanolo.ga/index.html размещается из репозитория github на случай, если вам понадобится просмотреть больше кода.