import { NButton, NModal, NSpace, useDialog } from 'naive-ui'; import { defineComponent, onBeforeUnmount, ref } from 'vue'; import { useRoute, useRouter } from 'vue-router'; import downBg from './images/downBg.png'; import rocketIcon from './images/rocketIcon.png'; import styles from './index.module.less'; import axios from 'axios'; let refreshing = false; let isError = false; const reloadPage = async () => { if ('serviceWorker' in navigator) { // let refreshing = false const flag = (await caches.keys()).length > 0; // console.log(caches.keys(), `0904路由更新有缓存${flag}`); caches.keys().then(function (cacheNames) { cacheNames.forEach(function (cacheName) { caches.delete(cacheName); }); }); // 尝试监听install } console.log('route index'); window.location.reload(); }; const isChromeError = (error: any) => { console.log(error, 'error===>isChromeError', refreshing); isError = true; const tagName = error.target.tagName; const notIncoudle = ['IMG']; setTimeout(() => { if (!refreshing && !error.message && !notIncoudle.includes(tagName)) { refreshing = true; sessionStorage.setItem('isRouter', 'true'); // reloadPage(); } }, 500); }; window.addEventListener('error', isChromeError, true); export default defineComponent({ name: 'router-error', setup() { const router = useRouter(); const dialog = useDialog(); const showModalMask = ref(false); const route = useRoute(); // router.onError((error, to, form) => { // const str = error.message + ''; // const isChunkLoadFailed = str.indexOf('imported'); // console.log(error, to) // // const targetPath = router.history.pending.fullPath // if (isChunkLoadFailed != -1 && !refreshing) { // refreshing = true; // console.log('onError刷新'); // sessionStorage.setItem('isRouter','true') // // showModalMask.value = true; // // router.push(to.path) // } // }); router.beforeEach(async (to, from, next) => { const flag = await versionCheck(); console.log('路由之前弹窗', `refreshing${refreshing},flag:${flag}`); if (flag && !refreshing) { refreshing = true; // console.log('修改刷新',refreshing) sessionStorage.setItem('isRouter', 'true'); // reloadPage(); // showModalMask.value = true // setTimeout(()=>{ // const dom = document.getElementById('updateModel') // if(isError&&!dom){ // reloadPage() // } // },1000) // setTimeout(()=>{ // sessionStorage.removeItem('isRouter') // },60000) } next(); }); const checkNewVersion = async () => { if ('serviceWorker' in navigator) { // let refreshing = false const flag = (await caches.keys()).length > 0; // console.log(caches.keys(), `0904路由更新有缓存${flag}`); caches.keys().then(function (cacheNames) { cacheNames.forEach(function (cacheName) { caches.delete(cacheName); }); if (flag) { // window.location.reload(); // dialog.warning({ // title: '更新提示', // content: '网站有更新请点击确定刷新页面?', // positiveText: '确定', // negativeText: '取消', // onPositiveClick: () => { // } // }); } }); // 尝试监听install navigator.serviceWorker.addEventListener( 'controllerchange', async () => { console.log('controllerchange刷新', route.path, 'path'); const flag = await versionCheck(); if (refreshing || route.path == '/attend-class' || !flag) { return; } const isRouter = sessionStorage.getItem('isRouter'); if (!isRouter) { // showModalMask.value = true reloadPage(); } refreshing = true; } ); } }; console.log(route.path, 'route.path'); checkNewVersion(); onBeforeUnmount(() => { sessionStorage.removeItem('isRouter'); window.removeEventListener('error', isChromeError); }); // 版本监控 const versionCheck = async () => { console.log(import.meta.env.MODE, 'import.meta.env', __APP_VERSION__); if (import.meta.env.MODE === 'development') return; const response = await axios.get('version.json'); // eslint-disable-next-line no-undef console.log(__APP_VERSION__, response.data.version); if (__APP_VERSION__ !== response.data.version) { // eslint-disable-next-line no-undef return true; } else { return false; } }; return () => (
为提升您的用户体验,请刷新页面后使用
{/*