-
Notifications
You must be signed in to change notification settings - Fork 565
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
子应用通过css加载的图片无法显示 #19
Comments
已知问题: |
目前需要用户采用css-loader来手动的将相对地址替换成绝对地址,后续官方会出一个plugin来解决这个问题 |
好的感谢,所以目前css-loader只能通过正则匹配替换了? |
是的,如果这块框架做了的话,也是采用正则匹配来做的,不知道webpack有没有什么插件可以将这个相对地址变成绝对地址 |
似乎并没有返回当前子应用的url噢 |
再次加载子应用的时候 似乎不会重新载入css了 |
这个和qiankun是一致的,子应用做了生命周期适配的话,切换子应用只是对比如vue实例的销毁和重建,js和css并不会重新执行,css框架会记录样式等切换的时候直接加上 |
这个地方确实可能存在bug,我需要验证一下 |
data-dpr在切换子应用没有生效的原因不是对应的css丢失了,而是html丢失了data-dpr属性,因为flexible只会执行一次,然后计算dpr然后添加到html标签属性上,切走子应用后子应用的dom全部销毁,切换回来由于flexible不会运行导致html没有添加上data-dpr, 解决方案: let dataDpr = null
beforeUnmount = (appwindow) => dataDpr = appwindow.document.documentElement.documentElement.getAttribute('data-dpr')
afterMount = (appwindow) => dataDpr && appwindow.document.documentElement.documentElement.setAttribute('data-dpr', dataDpr) |
感谢!搞定了dpr 但是又发现新问题了 问题:访问Vue2 / 弹窗 样式丢失 情况二、预加载[关] 降级[关] 刷新 介绍 -> vue2 -> 弹窗 样式生效 刷新 介绍 -> vue2 -> 介绍 -> vue2 -> Tab 弹窗 【样式丢失】 -> Tab 首页 -> Tab 弹窗 【样式丢失】 -> 介绍 -> vue2 -> 弹窗 样式生效 总结:看起来在首次加载子应用的时候,未加载路由样式会在第二次重新访问的时候丢失,在第三次访问的时候恢复 样式显示如下图,略显粗暴😂:
按照这个套路,给vue2第三个Tab 路由,也加上样式出现同样的情况,但是都在再次加载vue2之后恢复样式,应该还是有bug的。 // Location.vue
|
@Sapphire2k 非常感谢提供重要的线索和复现路径 目前排查的出结果,涉及的代码如下: 代码地址:webpack:///node_modules/vue-style-loader/lib/addStylesClient.js // 获取head,缓存下来
var head = hasDocument && (document.head || document.getElementsByTagName('head')[0])
// 将样式代码添加到head元素上去
function createStyleElement () {
var styleElement = document.createElement('style')
styleElement.type = 'text/css'
head.appendChild(styleElement)
return styleElement
} 代码缓存了head元素而不是实时通过document.head去获取 而对于无界子应用单例模式,每次切换子应用包括从预加载成功到正式渲染,子应用都会经历渲染、卸载、重新渲染的过程,承载子应用的 shadow 也是如此,导致shadow内部的 head 每次都是重新生成,所以往缓存下来的 head 里面添加样式完全无法生效 我考虑一下应该怎么做才对 |
记录一下三种解决方案: 1、复用head和body元素,但是需要清除上面的事件(目前最好的方案) 2、proxy返回一个proxy,这样缓存的head也就是一个proxy,每次都可以拿到最新的head(兼容性差) 3、只针对head、body的 appendChild、insertBefore 单独做处理(只能解决这两个接口,无法解决缓存的问题) |
已经发版解决,采用方案 1 |
问题解决了,感谢! 又发现一个新问题,子应用Vue实例缓存了,导致再次加载的时候,body下动态创建的dom丢失了也不会重新创建,感觉应该是比较常见的情况🤔 // vue2 / Home.vue
|
@Sapphire2k 这个不是 bug,只能说使用微前端需要理解这个心智模型,用乾坤或者 micro-app 同样有这个问题 首先要理解的问题:为什么使用微前端子应用切换起来会比较快?
// 清理副作用
beforeDestroy() {
Vue.prototype.$dialogEle = null;
},
|
@yiludege 明白的,但是原有项目里面的很多插件可能都得经过清理再重新挂载了,相对于一开始理解低成本接入子应用,这块成本比较高,最好在文档有所说明。 保活模式确实能够解决这个问题。 |
请问你是怎么解决的,我尝试使用cssLoader,但是没有什么思路,cssLoader的参数都没什么用 |
子应用独立运行可以正确显示 i 标签的图片
但是在主应用里运行子应用的时候就失效了
The text was updated successfully, but these errors were encountered: