Revert "feat(service): 添加 Service Worker 支持并优化图片缓存"
This reverts commit 65b6da1bf7.
This commit is contained in:
@@ -22,7 +22,7 @@ export default {
|
|||||||
const name = this.$route.name
|
const name = this.$route.name
|
||||||
if (name === "service") {
|
if (name === "service") {
|
||||||
const ecosystem = this.$route.params.ecosystem
|
const ecosystem = this.$route.params.ecosystem
|
||||||
return getAlias(ecosystem)
|
return getAlias(getEcosystem(ecosystem))
|
||||||
}
|
}
|
||||||
return this.$route.meta.title
|
return this.$route.meta.title
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,145 +0,0 @@
|
|||||||
// Service Worker 版本号,更新时需要修改此值
|
|
||||||
const CACHE_VERSION = 'service-info-cache-v1';
|
|
||||||
|
|
||||||
// 需要缓存的图片域名或路径前缀,可根据实际情况修改
|
|
||||||
const IMAGE_CACHE_URLS = [
|
|
||||||
'https://img.yzcdn.cn/',
|
|
||||||
'https://imgcdn.happy.cn/',
|
|
||||||
// 其他可能的图片域名
|
|
||||||
];
|
|
||||||
|
|
||||||
// 安装事件 - 预缓存关键资源
|
|
||||||
self.addEventListener('install', (event) => {
|
|
||||||
console.log('Service Worker 安装中...');
|
|
||||||
|
|
||||||
// 强制激活新的Service Worker
|
|
||||||
self.skipWaiting();
|
|
||||||
|
|
||||||
// 预缓存一些基本资源,可选
|
|
||||||
event.waitUntil(
|
|
||||||
caches.open(CACHE_VERSION)
|
|
||||||
.then((cache) => {
|
|
||||||
return cache.addAll([
|
|
||||||
// 可以添加需要预缓存的资源
|
|
||||||
// '/service-info.css',
|
|
||||||
// '/service-info.js'
|
|
||||||
]);
|
|
||||||
})
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
// 激活事件 - 清理旧缓存
|
|
||||||
self.addEventListener('activate', (event) => {
|
|
||||||
console.log('Service Worker 已激活');
|
|
||||||
|
|
||||||
// 控制所有客户端页面
|
|
||||||
event.waitUntil(clients.claim());
|
|
||||||
|
|
||||||
// 清除旧版本缓存
|
|
||||||
event.waitUntil(
|
|
||||||
caches.keys().then((cacheNames) => {
|
|
||||||
return Promise.all(
|
|
||||||
cacheNames.map((cacheName) => {
|
|
||||||
if (cacheName !== CACHE_VERSION) {
|
|
||||||
console.log('Service Worker: 删除旧缓存', cacheName);
|
|
||||||
return caches.delete(cacheName);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
})
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
// 判断请求是否为图片
|
|
||||||
function isImageRequest(request) {
|
|
||||||
// 检查请求的URL是否符合我们要缓存的图片URL模式
|
|
||||||
const url = new URL(request.url);
|
|
||||||
|
|
||||||
// 检查是否为已知图片域名
|
|
||||||
const isKnownImageDomain = IMAGE_CACHE_URLS.some(domain => url.href.startsWith(domain));
|
|
||||||
|
|
||||||
// 检查URL是否有图片扩展名
|
|
||||||
const hasImageExtension = /\.(jpg|jpeg|png|gif|bmp|webp|svg)$/i.test(url.pathname);
|
|
||||||
|
|
||||||
// 如果请求包含Accept头,检查是否是图片类型
|
|
||||||
const acceptHeader = request.headers.get('Accept');
|
|
||||||
const isImageAccept = acceptHeader && acceptHeader.includes('image/');
|
|
||||||
|
|
||||||
return isKnownImageDomain || hasImageExtension || isImageAccept;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 拦截请求 - 缓存图片资源
|
|
||||||
self.addEventListener('fetch', (event) => {
|
|
||||||
// 获取请求
|
|
||||||
const request = event.request;
|
|
||||||
|
|
||||||
// 只处理GET请求
|
|
||||||
if (request.method !== 'GET') return;
|
|
||||||
|
|
||||||
// 判断是否是图片请求
|
|
||||||
const isImage = isImageRequest(request);
|
|
||||||
|
|
||||||
if (isImage) {
|
|
||||||
// 处理图片请求:使用缓存优先策略
|
|
||||||
event.respondWith(
|
|
||||||
caches.open(CACHE_VERSION).then((cache) => {
|
|
||||||
return cache.match(request).then((cachedResponse) => {
|
|
||||||
// 返回缓存的响应,如果有
|
|
||||||
if (cachedResponse) {
|
|
||||||
console.log('Service Worker: 从缓存返回图片', request.url);
|
|
||||||
return cachedResponse;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 如果没有缓存,则发送网络请求
|
|
||||||
return fetch(request).then((networkResponse) => {
|
|
||||||
// 检查响应是否有效
|
|
||||||
if (!networkResponse || networkResponse.status !== 200 || networkResponse.type !== 'basic') {
|
|
||||||
return networkResponse;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 复制响应,因为响应是流,只能使用一次
|
|
||||||
const responseToCache = networkResponse.clone();
|
|
||||||
|
|
||||||
// 将响应添加到缓存
|
|
||||||
console.log('Service Worker: 缓存新图片', request.url);
|
|
||||||
cache.put(request, responseToCache);
|
|
||||||
|
|
||||||
return networkResponse;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 当网络连接恢复时尝试重新加载失败的图片
|
|
||||||
self.addEventListener('sync', (event) => {
|
|
||||||
if (event.tag === 'image-sync') {
|
|
||||||
event.waitUntil(
|
|
||||||
// 这里可以实现重新加载失败的图片逻辑
|
|
||||||
// 例如从IndexedDB中读取失败的图片URL并重试
|
|
||||||
Promise.resolve()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 处理来自页面的消息
|
|
||||||
self.addEventListener('message', (event) => {
|
|
||||||
// 如果收到预缓存图片的消息
|
|
||||||
if (event.data && event.data.type === 'CACHE_IMAGES' && event.data.urls) {
|
|
||||||
const urls = event.data.urls;
|
|
||||||
|
|
||||||
caches.open(CACHE_VERSION).then((cache) => {
|
|
||||||
console.log('Service Worker: 预缓存图片', urls);
|
|
||||||
urls.forEach((url) => {
|
|
||||||
fetch(url)
|
|
||||||
.then((response) => {
|
|
||||||
if (response.ok) {
|
|
||||||
cache.put(url, response);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch((error) => console.error('缓存图片失败:', url, error));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
@@ -60,7 +60,6 @@ import BScroll from 'better-scroll'
|
|||||||
import { shopList } from '@/views/service/js/mock/shop-list'
|
import { shopList } from '@/views/service/js/mock/shop-list'
|
||||||
import { fetchServiceList } from "@/api/service-list"
|
import { fetchServiceList } from "@/api/service-list"
|
||||||
import { ecosystem } from "./js/status"
|
import { ecosystem } from "./js/status"
|
||||||
import { getEcosystemByValue } from '@/assets/js/utils/ecosystem'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
@@ -115,7 +114,7 @@ export default {
|
|||||||
created() {
|
created() {
|
||||||
|
|
||||||
// 获取 list 内容
|
// 获取 list 内容
|
||||||
fetchServiceList({ menuCode: getEcosystemByValue(this.$route.params.ecosystem) }).then(res => {
|
fetchServiceList({ menuCode: (this.$route.params.ecosystem) }).then(res => {
|
||||||
this.shopList = res.content.content[0].children
|
this.shopList = res.content.content[0].children
|
||||||
// 在数据加载完成后,等待DOM更新后再初始化滚动
|
// 在数据加载完成后,等待DOM更新后再初始化滚动
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
|
|||||||
@@ -58,53 +58,9 @@ export default {
|
|||||||
if (newId) {
|
if (newId) {
|
||||||
this.scrollToBlock();
|
this.scrollToBlock();
|
||||||
}
|
}
|
||||||
},
|
|
||||||
// 监听blocks变化,有新的图片时预缓存
|
|
||||||
'blocks': {
|
|
||||||
handler() {
|
|
||||||
this.cacheImagesInServiceWorker();
|
|
||||||
},
|
|
||||||
deep: true
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
// 注册Service Worker
|
|
||||||
registerServiceWorker() {
|
|
||||||
if ('serviceWorker' in navigator) {
|
|
||||||
navigator.serviceWorker.register('/views/service/js/service-worker.js')
|
|
||||||
.then(registration => {
|
|
||||||
console.log('Service Worker 注册成功:', registration.scope);
|
|
||||||
})
|
|
||||||
.catch(error => {
|
|
||||||
console.error('Service Worker 注册失败:', error);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// 使用Service Worker缓存当前页面的图片
|
|
||||||
cacheImagesInServiceWorker() {
|
|
||||||
// 确保有图片可供缓存
|
|
||||||
if (!this.blocks || !this.blocks.length) return;
|
|
||||||
|
|
||||||
// 提取所有图片URL
|
|
||||||
const imageUrls = this.blocks
|
|
||||||
.filter(block => block.pic && typeof block.pic === 'string' && block.pic.startsWith('http'))
|
|
||||||
.map(block => block.pic);
|
|
||||||
|
|
||||||
// 如果没有图片URL,则不需要发送消息
|
|
||||||
if (!imageUrls.length) return;
|
|
||||||
|
|
||||||
// 确保Service Worker已激活
|
|
||||||
if (navigator.serviceWorker && navigator.serviceWorker.controller) {
|
|
||||||
// 发送图片URL到Service Worker进行缓存
|
|
||||||
console.log('发送图片缓存请求,图片数量:', imageUrls.length);
|
|
||||||
navigator.serviceWorker.controller.postMessage({
|
|
||||||
type: 'CACHE_IMAGES',
|
|
||||||
urls: imageUrls
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// 滚动到指定块
|
// 滚动到指定块
|
||||||
scrollToBlock() {
|
scrollToBlock() {
|
||||||
const position = this.currentBlockId;
|
const position = this.currentBlockId;
|
||||||
@@ -124,11 +80,10 @@ export default {
|
|||||||
// 滚动到元素位置
|
// 滚动到元素位置
|
||||||
window.scrollTo({
|
window.scrollTo({
|
||||||
top: element.offsetTop - 70, // 偏移70px给顶部留出空间
|
top: element.offsetTop - 70, // 偏移70px给顶部留出空间
|
||||||
// behavior: 'smooth'
|
|
||||||
});
|
});
|
||||||
this.hasScrolled = true;
|
this.hasScrolled = true;
|
||||||
}
|
}
|
||||||
}, 300); // 添加短暂延迟确保DOM已更新
|
}, 800); // 添加短暂延迟确保DOM已更新
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -147,14 +102,6 @@ export default {
|
|||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.scrollToBlock();
|
this.scrollToBlock();
|
||||||
|
|
||||||
// 注册Service Worker
|
|
||||||
this.registerServiceWorker();
|
|
||||||
|
|
||||||
// 预缓存图片
|
|
||||||
this.$nextTick(() => {
|
|
||||||
this.cacheImagesInServiceWorker();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
Reference in New Issue
Block a user