部分逻辑不完善,可能导致的白屏问题 #500
Replies: 7 comments 5 replies
-
@timi137137 多此一举吗? |
Beta Was this translation helpful? Give feedback.
-
@uyarn 白屏能出现的不止上面那一种,还有一种就是后端返回的菜单数据 复现方式白屏效果 |
Beta Was this translation helpful? Give feedback.
-
(看了一眼项目的 releases 和 pull requests ,应该是个中文社区,如果不对请指出,谢谢) 既然这里是讨论区,还是发个评论支持楼主一下,应该也不算是灌水。 尽管楼主发的 PR 可能不那么完美,比如可能文本介绍的没那么详细(指的是 PR 正文中的“需求背景和解决方案”和“更新日志”部分);也许可能 @timi137137 曾面对过或正在面对大量灌水、无意义的 issue 和 pull request ,因此耐心很有限。 但楼主这个 PR 可以一眼看出来是确实遇到了实际问题,进行了 debug 并找到了一种可行的解决方式,并付出一定的时间精力无偿来提 pull request,我认为至少是值得尊重和平等沟通的。
而从“多此一举”等其他言论中,让人感受到这个社区是极其不友好、不尊重开发者的。别人贡献付出的时间精力,在你的眼中只是“多此一举”。这不是一个社区该有的样子,这种行为会极大的损害楼主等其他开发者在你们社区甚至整个中文社区的热情和积极性。 哪怕这个 PR 不是你需要的,也请有一点礼貌和尊重,有一点包容。 |
Beta Was this translation helpful? Give feedback.
-
本人以个人身份仅代表个人言论和行为,请勿牵扯至任何组织,公司,团队 @Senorsen 首先我很感谢你总结出来了整个问题所在并且公平的看待所有情况,对此我表示很感谢。 我相信许多人看完就会理解一些我的行为了,不过在此我强调一点。我,只是个免费为爱发电的贡献者,并非腾讯员工,我并不是你口中说的 在这里,我再一次对我用词不当过激行为向各位所有人道歉。但是,题主你应该清楚地理解上面说的一句话
后面你提出的问题 以下我会对你有疑惑的地方进行排错 // Token是否存在?如果不存在,跳转到登录页面强制登录
if (token) {
// 要前往的页面是登录页面?如果是,直接跳转到登录页面
if (to.path === '/login') {
next();
return;
}
// 错误预处理
try {
// 尝试获取用户信息
await userStore.getUserInfo();
} catch (error) {
// 如果获取用户信息失败,跳转到登录页面强制登录
MessagePlugin.error(error);
next({
path: '/login',
query: { redirect: encodeURIComponent(to.fullPath) },
});
NProgress.done();
}
// 如果获取用户信息成功,则认为用户已经登录,后端正常
const { asyncRoutes } = permissionStore;
// 如果没有动态路由,尝试获取动态路由
if (asyncRoutes && asyncRoutes.length === 0) {
// 获取动态路由表
const routeList = await permissionStore.buildAsyncRoutes();
// 遍历动态路由表,添加到路由器中
routeList.forEach((item: RouteRecordRaw) => {
// 此处不会出错,因为item强制规范为RouteRecordRaw类型,除非手动修改any
router.addRoute(item);
}); async initRoutes() {
const accessedRouters = this.asyncRoutes;
// 在菜单展示全部路由
this.routers = [...homepageRouterList, ...accessedRouters, ...fixedRouterList];
// 在菜单只展示动态路由和首页
// this.routers = [...homepageRouterList, ...accessedRouters];
// 在菜单只展示动态路由
// this.routers = [...accessedRouters];
},
async buildAsyncRoutes() {
// 错误预处理
try {
// 发起菜单权限请求 获取菜单列表
const asyncRoutes: Array<RouteItem> = (await getMenuList()).list;
// 转换菜单列表为路由列表
this.asyncRoutes = transformObjectToRoute(asyncRoutes);
// 初始化路由
await this.initRoutes();
// 返回路由列表
return this.asyncRoutes;
} catch (error) {
// 如果在上面任何一步出现错误都将会在控制台打印错误信息
// 当出现该情况时,证明代码不应该放到生产环境中,因为该错误会导致路由无法正常加载
throw new Error("Can't build routes");
}
}, // 处理请求数据。如果数据不是预期格式,可直接抛出错误
transformRequestHook: (res, options) => {
const { isTransformResponse, isReturnNativeResponse } = options;
// 如果204无内容直接返回
const method = res.config.method?.toLowerCase();
if (res.status === 204 || method === 'put' || method === 'patch') {
return res;
}
// 是否返回原生响应头 比如:需要获取响应头时使用该属性
if (isReturnNativeResponse) {
return res;
}
// 不进行任何处理,直接返回
// 用于页面代码可能需要直接获取code,data,message这些信息时开启
if (!isTransformResponse) {
return res.data;
}
// 错误的时候返回
const { data } = res;
if (!data) {
// router.push('/login'); 或者其他操作
throw new Error('请求接口错误');
}
// 这里 code为 后台统一的字段,需要在 types.ts内修改为项目自己的接口返回格式
const { code } = data;
// 这里逻辑可以根据项目进行修改
const hasSuccess = data && code === 0;
if (hasSuccess) {
return data.data;
}
throw new Error(`请求接口错误, 错误码: ${code}`);
},
在回答最后我再一次郑重地为自己过激的用词向各位道歉 |
Beta Was this translation helpful? Give feedback.
-
_ 我也是从题主这个时期走过来的,我在以往也被开源社区的核心贡献者“们”喷过,但是当我学的更多了,到达了现在这个水平_
|
Beta Was this translation helpful? Give feedback.
-
_ 如果你觉得以你的知识不够解决或处理某些问题,那么就去学,而不是要求他人必须为你着想。社区没有这个义务和责任_ 我不是问问题,也不是提需求,这是pr,也不是白嫖,技术和业务不同观点不同,我们求同存异,怎么就成了社区为我个人定制开发似的,你为何总是一副高高在上的姿态?你只是贡献者之一,你一个打杂的怎么就那么看不起别人的,为何权利如此之大? |
Beta Was this translation helpful? Give feedback.
-
那这里 #502 c89f434 进行了修复,可以理解为提的问题是合理的吗?这个处理只是扩大 |
Beta Was this translation helpful? Give feedback.
-
前言
#497 有大瓜,都来看看,本贴只是证明问题确实存在发生的可能,供任不了任何有效的解决办法。
白屏bug
这段代码如果被
try catch
捕获到异常,也就是当出throw new Error("Can't build routes");
被执行,则会发生白屏!需要优化的点
生产上任何错误不应该出现白屏,白屏时无任何有用信息提供,则很难定位缩写排查点。(虽然这只是个模板,但是估计不少人会在该模板上进行生产级别项目开发)
白屏时由于缺少处理,顶部加载条还在继续慢慢向前走,给人一种是网络问题,迫使用户长时间等待,等待奇迹的发生,还不知直接给个白屏。
演示视频:
TDesign.Vue.Next.Starter.-.-.Microsoft.Edge.2023-05-11.18-59-54.mp4
关于态度问题比项目本身更重要
多此一举
Beta Was this translation helpful? Give feedback.
All reactions