zoomla
Version:
16年专业研发|中文alexa排名第一的CMS品牌-基于dotNET core、功能强大,集成站群、微信开发、小程序与ERP及OA办公系统,支持国际语言和多民族语言,世界五百强与大型门户专用高端网站内核CMS系统
91 lines (85 loc) • 3.77 kB
JavaScript
// This is the "Offline page" service worker
const CACHE = "cms-page";
const version = "1.0.1";
var swUtil = {};
swUtil.getExt = function (fname) {
if (!fname) { return ""; }
fname = fname.split('?')[0].replace(/" "/g, "").toLowerCase();
if (fname.indexOf('/') > -1) { fname = fname.substring((fname.lastIndexOf("/") + 1), fname.length); }
if (fname.indexOf(".") < 0) { return ''; }
//-------------------------------------
var s = fname.lastIndexOf(".") + 1;
var ext = fname.substring(s, fname.length);
return ext;
}
swUtil.isExist = function (white, ext) {
for (i = 0; i < white.length; i++) {
if (white[i] == ext) { return true; }
}
return false;
}
swUtil.isIndex = function (url) {
var offline="";
if(!offline){return false;}//未定义离线页,则不判断
if (!url) { return false; }
if (url.indexOf("://") > -1) { url = url.split('://')[1]; }
url = url.toLowerCase().replace(location.host, "");
if (url == "" || url == "/" || url == "/default" || url.indexOf("/index.") == 0) { return true; }
return false;
}
swUtil.isAllowCache = function (url) {
var whiteExts = ["html", "shtml", "htm", "css", "scss", "map", "jpg", "png", "gif", "svg", "woff", "woff2", "ico"];
//"html|shtml|htm|css|scss|map|jpg|png|gif|svg|woff|woff2|ico"
var blackDirs = ["/user/", "/admin/", "/bar/", "/guest/", "/plat/", "/baike/", "/ask/"];
var ext = swUtil.getExt(url);
if (!url) { return false; }
url = url.toLowerCase();
//有后缀名,并且未在白名单中
if (ext && !swUtil.isExist(whiteExts, ext)) { return false; }
//不需要缓存的目录
for (var i = 0; i < blackDirs.length; i++) {
if (url.indexOf(blackDirs[i]) > -1) { return false; }
}
//无后缀名或在白名单中,允许缓存
return true;
}
//------------------------------------
self.addEventListener("install", function (event) {
console.log("[PWA Builder] Install Event processing", version);
event.waitUntil(
caches.open(CACHE).then(function (cache) {
//cache.add==fetch+cache.put
//两种缓存机制,一是此处静态写入,二是fetch中缓存已访问过的页面
return cache.addAll([
"/dist/css/bootstrap4.min.css","/dist/css/zico.min.css","/JS/jquery.min.js","/dist/js/popper.min.js","/dist/js/bootstrap4.min.js","/dist/css/animate.min.css","/dist/js/bootstrap.min.js",
]);
})
);
});
self.addEventListener('fetch', function (event) {
//白名单或无后缀名均允许cache
var url = event.request.url;
if (swUtil.isIndex(url)) {
event.respondWith(fetch(event.request).catch(function (error) {
return caches.open(CACHE).then(function (cache) { return cache.match(""); });
}));
}
if (event.request.method != "GET") { return false; }
if (!swUtil.isAllowCache(url)) { return false; }
event.respondWith(
caches.match(event.request).then(function (response) {
//已缓存的资源,直接返回
if (response) { return response; }
var fetchRequest = event.request.clone();
return fetch(fetchRequest).then(function (response) {
if (!response || response.status !== 200) { return response; }
var responseToCache = response.clone();
//将访问的资源加入缓存,离线时即可访问
console.log("sw", "cache_allow:" + url);
caches.open(CACHE).then(function (cache) { cache.put(event.request, responseToCache); });
return response;
}
);
})
);
});