优化一下博客的性能
This commit is contained in:
1 parent
15421ff0ac
commit
427b17d7a0
24 files changed
+2045
-148
No files matched your search
@@ -78,18 +78,96 @@
|
||||
var list = document.getElementById('links-list');
|
||||
if (!list) return;
|
||||
|
||||
fetch('https://rssapi.usj.cc/api/links?t=' + new Date().getTime())
|
||||
.then(function(res) { return res.json(); })
|
||||
.then(function(data) {
|
||||
var links = data.links || [];
|
||||
if (links.length === 0) return;
|
||||
var html = '';
|
||||
links.forEach(function(l) {
|
||||
html += '<li><a href="' + l.url + '" class="url-name" target="_blank">' + l.name + '</a><span style="margin-left: 13px;">' + (l.description || '') + '</span></li>';
|
||||
var CACHE_KEY = 'friend-links-v1';
|
||||
var CACHE_OPTIONS = {
|
||||
version: 2,
|
||||
softTtl: 6 * 60 * 60 * 1000,
|
||||
hardTtl: 24 * 60 * 60 * 1000,
|
||||
validate: function(data) {
|
||||
return !!data && Array.isArray(data.links);
|
||||
}
|
||||
};
|
||||
|
||||
function escapeHtml(value) {
|
||||
return String(value || '')
|
||||
.replace(/&/g, '&')
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>')
|
||||
.replace(/"/g, '"')
|
||||
.replace(/'/g, ''');
|
||||
}
|
||||
|
||||
function renderState(message, className) {
|
||||
list.innerHTML = '<li class="' + className + '">' + escapeHtml(message) + '</li>';
|
||||
}
|
||||
|
||||
function renderLinks(links) {
|
||||
if (!Array.isArray(links) || links.length === 0) {
|
||||
renderState('暂无友链数据', 'links-empty');
|
||||
return;
|
||||
}
|
||||
|
||||
var html = '';
|
||||
links.forEach(function(l) {
|
||||
html += '<li><a href="' + escapeHtml(l.url) + '" class="url-name" target="_blank" rel="noopener noreferrer">' + escapeHtml(l.name) + '</a><span style="margin-left: 13px;">' + escapeHtml(l.description || '') + '</span></li>';
|
||||
});
|
||||
list.innerHTML = html;
|
||||
}
|
||||
|
||||
function logCache(event, payload) {
|
||||
if (window.BrowserCache && typeof window.BrowserCache.log === 'function') {
|
||||
window.BrowserCache.log('[LinksCache][' + event + ']', payload);
|
||||
}
|
||||
}
|
||||
|
||||
function fetchLinks() {
|
||||
logCache('fetch', {
|
||||
key: window.BrowserCache ? window.BrowserCache.buildKey(CACHE_KEY) : CACHE_KEY,
|
||||
softTtl: window.BrowserCache ? window.BrowserCache.formatDuration(CACHE_OPTIONS.softTtl) : CACHE_OPTIONS.softTtl,
|
||||
hardTtl: window.BrowserCache ? window.BrowserCache.formatDuration(CACHE_OPTIONS.hardTtl) : CACHE_OPTIONS.hardTtl
|
||||
});
|
||||
return fetch('https://rssapi.usj.cc/api/links')
|
||||
.then(function(res) {
|
||||
if (!res.ok) throw new Error('Failed to fetch links');
|
||||
return res.json();
|
||||
})
|
||||
.then(function(data) {
|
||||
var links = Array.isArray(data.links) ? data.links : [];
|
||||
var payload = { links: links };
|
||||
window.BrowserCache.write(CACHE_KEY, CACHE_OPTIONS, payload);
|
||||
return payload;
|
||||
});
|
||||
list.innerHTML = html;
|
||||
}
|
||||
|
||||
var cached = window.BrowserCache && window.BrowserCache.read(CACHE_KEY, CACHE_OPTIONS);
|
||||
if (cached) {
|
||||
logCache('render', {
|
||||
key: cached.key,
|
||||
age: cached.ageText,
|
||||
isFresh: cached.isFresh,
|
||||
softTtl: cached.softTtlText,
|
||||
hardTtl: cached.hardTtlText
|
||||
});
|
||||
renderLinks(cached.data.links);
|
||||
if (cached.isFresh) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
renderState('友链加载中...', 'links-loading');
|
||||
}
|
||||
|
||||
fetchLinks()
|
||||
.then(function(payload) {
|
||||
renderLinks(payload.links);
|
||||
})
|
||||
.catch(function() {});
|
||||
.catch(function(err) {
|
||||
if (window.BrowserCache && window.BrowserCache.isDebug && window.BrowserCache.isDebug()) {
|
||||
console.error('Links Error:', err);
|
||||
}
|
||||
if (!cached) {
|
||||
renderState('友链加载失败,请稍后刷新重试', 'links-error');
|
||||
}
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</div>
|
||||
|
||||
Reference in new issue
Block a user