index.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import { NButton, NModal, NSpace, useDialog } from 'naive-ui';
  2. import { defineComponent, onBeforeUnmount, ref } from 'vue';
  3. import { useRouter } from 'vue-router';
  4. import downBg from './images/downBg.png'
  5. import rocketIcon from './images/rocketIcon.png'
  6. import styles from './index.module.less'
  7. export default defineComponent({
  8. name: 'router-error',
  9. setup() {
  10. const router = useRouter();
  11. const dialog = useDialog();
  12. let refreshing = false;
  13. const showModalMask = ref(false)
  14. router.onError((error, to, form) => {
  15. const str = error.message + '';
  16. const isChunkLoadFailed = str.indexOf('imported');
  17. console.log(error, to)
  18. // const targetPath = router.history.pending.fullPath
  19. if (isChunkLoadFailed != -1 && !refreshing) {
  20. refreshing = true;
  21. console.log('onError刷新');
  22. sessionStorage.setItem('isRouter','true')
  23. showModalMask.value = true;
  24. router.push(to.path)
  25. // dialog.warning({
  26. // title: '更新提示',
  27. // content: '网站有更新请点击确定刷新页面?',
  28. // positiveText: '确定',
  29. // negativeText: '取消',
  30. // onPositiveClick: () => {
  31. // }
  32. // });
  33. }
  34. });
  35. const checkNewVersion = async () => {
  36. if ('serviceWorker' in navigator) {
  37. // let refreshing = false
  38. const flag = (await caches.keys()).length > 0;
  39. // console.log(caches.keys(), `0904路由更新有缓存${flag}`);
  40. caches.keys().then(function (cacheNames) {
  41. cacheNames.forEach(function (cacheName) {
  42. caches.delete(cacheName);
  43. });
  44. if (flag) {
  45. // window.location.reload();
  46. // dialog.warning({
  47. // title: '更新提示',
  48. // content: '网站有更新请点击确定刷新页面?',
  49. // positiveText: '确定',
  50. // negativeText: '取消',
  51. // onPositiveClick: () => {
  52. // }
  53. // });
  54. }
  55. });
  56. // 尝试监听install
  57. navigator.serviceWorker.addEventListener('controllerchange', () => {
  58. console.log('controllerchange刷新');
  59. if (refreshing) {
  60. return;
  61. }
  62. const isRouter = sessionStorage.getItem('isRouter')
  63. if(!isRouter){
  64. showModalMask.value = true
  65. }
  66. refreshing = true;
  67. });
  68. }
  69. }
  70. onBeforeUnmount(()=>{
  71. sessionStorage.removeItem('isRouter')
  72. })
  73. checkNewVersion()
  74. const reloadPage = ()=>{
  75. window.location.reload();
  76. }
  77. return () => <div>
  78. <NModal v-model:show={showModalMask.value} mask-closable={false}>
  79. <div class={styles.downMove}>
  80. <img src={rocketIcon} class={styles.dingPng} alt="" />
  81. <img src={downBg} class={styles.downMoveBg} alt="" />
  82. <h2>发现新版本</h2>
  83. <p>
  84. 为提升您的用户体验,请刷新页面后使用
  85. </p>
  86. {/* <NButton>确定</NButton> */}
  87. <NSpace style={{ padding: '25px 0 0 0' }} justify="center">
  88. <NButton
  89. class={styles.submitAppBtn}
  90. round
  91. type="primary" onClick={reloadPage}>
  92. 立即刷新
  93. </NButton>
  94. </NSpace>
  95. </div>
  96. </NModal>
  97. </div>;
  98. }
  99. });