useNewVersion.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { onMounted, onUnmounted } from "vue";
  2. /**
  3. * newVersionAvailable: boolean 是否有新版本
  4. * checkNewVersion 有版本更新返回true,函数内部处理;没版本更新则返回false
  5. */
  6. export function useNewVersion() {
  7. async function checkNewVersion(): Promise<boolean> {
  8. const myHeaders = new Headers();
  9. myHeaders.append("Content-Type", "application/javascript");
  10. myHeaders.append("Cache-Control", "no-cache");
  11. const response = await fetch(
  12. [...document.scripts].at(-1)?.src + "?x" + Date.now(),
  13. {
  14. method: import.meta.env.DEV ? "GET" : "HEAD",
  15. headers: myHeaders,
  16. }
  17. );
  18. if (!response.ok || newVersionAvailable) {
  19. if (
  20. response.ok &&
  21. newVersionAvailable &&
  22. localStorage.getItem("__swReload")
  23. ) {
  24. logger({
  25. cnl: ["local", "server"],
  26. pgu: "AUTO",
  27. dtl: "service worker刷新失败",
  28. });
  29. $message.info("请重新打开程序。", { duration: 24 * 60 * 60 * 1000 });
  30. return true;
  31. }
  32. logger({
  33. cnl: ["local", "server"],
  34. pgu: "AUTO",
  35. dtl: "新版本发布后,客户端自动刷新",
  36. });
  37. $message.info("正在获取新版本...");
  38. localStorage.setItem("__swReload", "anything");
  39. // disableLoginBtnBecauseRefreshServiceWorker = true;
  40. await new Promise((resolve) => setTimeout(resolve, 1000));
  41. location.reload();
  42. return true;
  43. }
  44. return false;
  45. }
  46. let newVersionAvailable = $ref(false);
  47. const checkNewVersionListener = () => {
  48. newVersionAvailable = true;
  49. };
  50. onMounted(async () => {
  51. document.addEventListener("__newSWAvailable", checkNewVersionListener, {
  52. once: true,
  53. });
  54. if (localStorage.getItem("__swReload")) {
  55. localStorage.removeItem("__swReload");
  56. $message.info("正在更新版本...");
  57. // disableLoginBtnBecauseRefreshServiceWorker = true;
  58. await new Promise((resolve) => setTimeout(resolve, 2000));
  59. location.reload();
  60. }
  61. });
  62. onUnmounted(() =>
  63. document.removeEventListener("__newSWAvailable", checkNewVersionListener)
  64. );
  65. return { newVersionAvailable: $$(newVersionAvailable), checkNewVersion };
  66. }