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'; export default defineComponent({ name: 'router-error', setup() { const router = useRouter(); const dialog = useDialog(); let refreshing = false; 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() if(flag&&!refreshing){ sessionStorage.setItem('isRouter','true') showModalMask.value = true // 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 } refreshing = true; }); } } const isChromeError = (error:any) => { console.log(error, 'error===>isChromeError') if (!refreshing && !error.message) { refreshing = true; return sessionStorage.setItem('isRouter', 'true') reloadPage() } } window.addEventListener('error', isChromeError, true) console.log(route.path,'route.path') checkNewVersion() onBeforeUnmount(()=>{ sessionStorage.removeItem('isRouter') window.removeEventListener('error', isChromeError,) }) 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 } window.location.reload(); } // 版本监控 const versionCheck = async () => { console.log(import.meta.env.MODE,'import.meta.env') 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,__APP_VERSION__ !== response.data.version) if (__APP_VERSION__ !== response.data.version) { // eslint-disable-next-line no-undef return true }else { return false } } return () =>
为提升您的用户体验,请刷新页面后使用
{/*