index.tsx 5.3 KB

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