微前端中,Vue动态设置浏览器图标可火狐浏览器却不采用主应用图标的问题

有一个需求,需要根据系统(使用乾坤微前端搭建的系统,里面有多个子应用)的配置,去修改系统在浏览器中标签页的图标。
而 Vue 的图标默认是这个:
在这里插入图片描述
BASE_URL 是 process.env 环境中的一个变量,默认是根目录,而它下面的 favicon.ico 就是 index.html 旁边的 favicon.ico 文件了,一般是 Vue 自带的图标。在这里插入图片描述
首先我想到了两个思路去处理这个动态设置图标的需求:

  1. 设置一个变量,通过修改这个变量,达到动态修改图标
  2. 直接用获取这个 link 节点的方式,去修改它的 href 属性

我本想用第一种方式去实现这个效果,但是发现动态修改系统变量不是那么简单,毕竟启动了一个项目,系统变量基本保持不变,有时修改的时候,还需要重新启动项目才行。就算不用项目系统环境的变量,而用一个全局的变量,类似挂载在 window 下的那种,感觉还是有点多余(别人要是知道了这个变量然后修改,或是环境有污染,岂不是遭了),所以就直接跳过第一种方式了。

决定采用第二种方式后,因为系统的配置信息之前就已经存在 Vuex 中,所以定义了一个方法,专门获取 link icon 节点,然后重新给它的 href 复制的方法。
在这里插入图片描述
结果是很轻易的实现了,提交了代码就以为完成了任务。

问题:火狐浏览器切换子应用的时候,标签页用的却是子应用的图标

前面我已经修改了主应用的 link icon 的 href,但是子应用的 link icon 的 href 还是保持原来的,造成了在切换子应用的时候,图标切换回 Vue 项目自带的图标,而不是系统配置的编码64格式地址的图标。这个问题在 谷歌浏览器 是没有的,在 火狐浏览器 才有这种问题。
一开始我尝试去掉子应用的 link icon 标签,但是没用,页面还是存在子应用的这个标签,把下图所示的 pwa 去掉也没用。
在这里插入图片描述

好像 Vue 在不设置 link icon 的情况下,还是默认会用根目录下的那个 favicon.ico 文件。所以还是得靠最原始的方法—获取它的节点,然后改变。

但是在主应用中,在哪里可以获取到已加载的子应用的节点呢?我一开始是想写在主应用的路由拦截里,在路由加载完成后去获取节点修改。可发现失效,路由虽然加载了,可是子应用还没加载完。所以最好还是写在子应用的生命周期函数的 afterMount 中,这样不用每次路由跳转就要获取一次节点,而是启动一个新的子应用的时候才去修改它的 link icon,同时也可以保证以后在火狐这样的浏览器中,子应用的 link icon 不会影响主应用的图标,使得浏览器的标签页显示的是子应用的图标。
在这里插入图片描述
最后成功了:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43589827/article/details/118631446