Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

vite4子应用切换 样式丢失 #434

Closed
Ttou opened this issue Mar 9, 2023 · 14 comments
Closed

vite4子应用切换 样式丢失 #434

Ttou opened this issue Mar 9, 2023 · 14 comments

Comments

@Ttou
Copy link

Ttou commented Mar 9, 2023

描述bug

  • vue2 项目的 ElementUI 字体图标无法显示
  • 子应用不保活时切路由后再回来,样式消失
  • 切换应用时,路由报警告

如何复现

错误截图
iShot_2023-03-09_16 42 45

最小复现仓库或者地址
复现仓库

@Ttou
Copy link
Author

Ttou commented Mar 13, 2023

试了下样式丢失和vite的版本有关,vite2.7正常,vite4丢失

@Ttou
Copy link
Author

Ttou commented Mar 13, 2023

路由警告改成vue2做主应用就不报了

@Ttou
Copy link
Author

Ttou commented Mar 14, 2023

字体问题和vite版本有关,vite2.9正常

@codeflyA
Copy link

遇到了同样的问题 vite4下 vant的字体图标不显示,单独打开子应用的项目没问题,放到wujie框架下vant的字体图标不显示。

@Ttou
Copy link
Author

Ttou commented Apr 20, 2023

基于 vite2.9 + vue-cli5 + wujie1.0.14 的演示项目:
仓库地址:https://gitee.com/jh_shot/wujie-template
演示地址:https://jh_shot.gitee.io/wujie-template

@yiludege
Copy link
Collaborator

vite 4 加载样式的代码:
ve(ovite resoweStyle(v
这个 __vite__updateStyle 具体代码实现:
documnt hesd oprerdoitd(styte) style - style (disableds false, Redia: -》

无界子应用如果是单例模式,js只会执行一遍,动态加载进来的样式,无界需要收集起来,等子应用下次切换回来,再将这些样式恢复,对于 document.body.appendChild,和 document.head.appendChild 这样的方法 无界内部已经劫持进行收集,但是vite4上面的代码可以看到采用了 style.InsertAdjacentElement 这样的方法导致无界没有收集到,所以采用下面的插件修改一下 style.InsertAdjacentElement 成 document.head.appendChild可以了,当然也可以不修改InsertAdjacentElement,将InsertAdjacentElement进来的样式放进 iframeWindow.__WUJIE.styleSheetElements里面,下次渲染就可以将样式还原了

      plugins: [
        {
          patchElementHook(element, iframeWindow) {
            if (element.nodeName === "STYLE") {
              element.insertAdjacentElement = function (_position, ele) {
                iframeWindow.document.head.appendChild(ele);
              };
            }
          },
        },
      ]

@yiludege yiludege changed the title 与vite一起使用时遇到的问题 vite4子应用切换 样式丢失 Jun 30, 2023
@Ttou
Copy link
Author

Ttou commented Jul 2, 2023

试了下,确实可以,不过vite4+vue3+element-plus设置为保活,也需要加上这个配置,不然组件的样式会丢失

@wen403
Copy link

wen403 commented Oct 14, 2023

这个插件在哪使用

@wen403
Copy link

wen403 commented Oct 14, 2023

已解决,完美解决使用不了iconfont的问题,感谢大佬
image

@FBin001
Copy link

FBin001 commented Nov 28, 2023

vite 4 加载样式的代码: ve(ovite resoweStyle(v 这个 __vite__updateStyle 具体代码实现: documnt hesd oprerdoitd(styte) style - style (disableds false, Redia: -》

无界子应用如果是单例模式,js只会执行一遍,动态加载进来的样式,无界需要收集起来,等子应用下次切换回来,再将这些样式恢复,对于 document.body.appendChild,和 document.head.appendChild 这样的方法 无界内部已经劫持进行收集,但是vite4上面的代码可以看到采用了 style.InsertAdjacentElement 这样的方法导致无界没有收集到,所以采用下面的插件修改一下 style.InsertAdjacentElement 成 document.head.appendChild可以了,当然也可以不修改InsertAdjacentElement,将InsertAdjacentElement进来的样式放进 iframeWindow.__WUJIE.styleSheetElements里面,下次渲染就可以将样式还原了

      plugins: [
        {
          patchElementHook(element, iframeWindow) {
            if (element.nodeName === "STYLE") {
              element.insertAdjacentElement = function (_position, ele) {
                iframeWindow.document.head.appendChild(ele);
              };
            }
          },
        },
      ]

patchElementHook 切换子应用2次后不再执行

@PanZhangOne
Copy link

vite 4 加载样式的代码: ve(ovite resoweStyle(v 这个 __vite__updateStyle 具体代码实现: documnt hesd oprerdoitd(styte) style - style (disableds false, Redia: -》
无界子应用如果是单例模式,js只会执行一遍,动态加载进来的样式,无界需要收集起来,等子应用下次切换回来,再将这些样式恢复,对于 document.body.appendChild,和 document.head.appendChild 这样的方法 无界内部已经劫持进行收集,但是vite4上面的代码可以看到采用了 style.InsertAdjacentElement 这样的方法导致无界没有收集到,所以采用下面的插件修改一下 style.InsertAdjacentElement 成 document.head.appendChild可以了,当然也可以不修改InsertAdjacentElement,将InsertAdjacentElement进来的样式放进 iframeWindow.__WUJIE.styleSheetElements里面,下次渲染就可以将样式还原了

      plugins: [
        {
          patchElementHook(element, iframeWindow) {
            if (element.nodeName === "STYLE") {
              element.insertAdjacentElement = function (_position, ele) {
                iframeWindow.document.head.appendChild(ele);
              };
            }
          },
        },
      ]

patchElementHook 切换子应用2次后不再执行

也遇到同样的问题,请问有没有解决啊

@wangliang01
Copy link

Vite4搭建的子应用,在切换路由2次后,页面就无法正常加载,有遇到类似的问题吗?另一个子应用是使用webpack + vue2搭建的子应用,就是正常的

@weizhigang55
Copy link

已解决,完美解决使用不了iconfont的问题,感谢大佬

image

好兄弟,想问下具体怎么使用的,有点不太明白稍微

@wen403
Copy link

wen403 commented Apr 29, 2024

yiludege

@yiludege发的插件放进去就行了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

8 participants