vite3 + vue3 异步加载路由后挂载 APP 实例,生产环境下页面空白问题解决

问题描述

由于我希望路由初始化完成后再挂载 APP 实例,所以在 main.ts 中有以下代码

// main.ts

console.log("execute 111"); 
// 路由初始化完成后挂载 APP 实例,使用了顶层 await 进行异步加载
await router.isReady();
console.log("execute 222"); 

app.mount("#app");

在开发环境环境下,运行开发服务器,打开浏览器控制台,execute 111execute 222 都会打印,页面路由也能正常访问;但是打包部署后,生产环境下只有 execute 111 打印了,页面空白,而且控制台没有报错。

问题处理 - 方法一

控制台没有报错,那应该不会进入到 catch,我也尝试了用 try…catch… 包裹 await,在 catch 阶段输出,并没有输出错误,所以可以排除这种情况。接着我打开我的路由配置文件:

import { App } from "vue";
import { createRouter, createWebHashHistory, RouteRecordRaw } from "vue-router";

const constantRoutes: RouteRecordRaw[] = [
  {
    path: "/",
    name: "home",
    component: () => import("@/views/home/index.vue"),
  },
  {
    path: "/:pathMatch(.*)",
    name: "404",
    component: () => import("@/views/error/404.vue"),
  },
];

发现了问题所在,component: () => import("@/views/home/index.vue"), 的写法属于异步懒加载的方式,而 await router.isReady(); 的写法属于顶层 await 的方式(它会阻塞资源获取)。这不就出现了死循环,前者说有访问者访问时我才加载,后者说我要拦住所有访问者,除非有访问者访问你了我才放开所有访问者,最后不就一直等下去了。所以我们可以改一下首页路由配置,让其变成直接加载的方式,其它页面继续保留懒加载不需要变动,修改如下:

// router/index.ts

import { App } from "vue";
import { createRouter, createWebHashHistory, RouteRecordRaw } from "vue-router";
import Home from "@/views/home/index.vue";

const constantRoutes: RouteRecordRaw[] = [
  {
    path: "/",
    name: "home",
    // - component: () => import("@/views/home/index.vue"),
    component: Home, // + 
  },
  {
    path: "/:pathMatch(.*)",
    name: "404",
    component: () => import("@/views/error/404.vue"),
  },
];

这样就保证了首页路由可以一开始就完成初始化操作,此时再打包部署,首页就可以加载出来了。

问题处理 - 方法二

如果我们不想变动 router/index.ts 文件的内容,就希望里面的路由是处于懒加载状态,也是可以的。我们知道了顶层 await 具有阻塞资源获取的特性,导致了资源无法加载,那么我们就不用顶层 await,用 .then() 去实现异步加载也是可以的,修改 main.ts 代码:

// main.ts

router
  .isReady()
  .then(() => {
    app.mount("#app");
  })
  .catch((err) => {
    console.log(err);
  });

.then() 不会阻塞资源获取,此时再打包部署,首页也是可以加载出来的。

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值