index.tsx 4.1 KB

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