index.tsx 5.8 KB

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