-
Notifications
You must be signed in to change notification settings - Fork 2k
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
fix: 修复styled-components兼容性问题 #2606
base: master
Are you sure you want to change the base?
Conversation
Someone is attempting to deploy a commit to a Personal Account owned by @umijs on Vercel. @umijs first needs to authorize it. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
没看懂,这个修复是怎么 work 的?
styled-component 的问题在于 recordStyledComponentsCSSRules 在调用时,因为 styleElement 可能已经被从文档上移除了,导致 styleElement.sheet.cssRules 获取到的是空的。这个 pr 劫持了 insertRule 这些方法,但没看到怎么记录的,而且这个时候应用已经在卸载了,劫持起不到任何效果了。
"styled-component 的问题在于 recordStyledComponentsCSSRules 在调用时,因为 styleElement 可能已经被从文档上移除了,导致 styleElement.sheet.cssRules 获取到的是空的",这个问题我暂时没有复现过,styleElement.sheet.cssRules一直都是有的,我并不是要解决cssRules为空的问题。 这个PR要解决的是style节点从document移除,然后rebuil之后styleElement.sheet引用变动导致新增样式失效的问题。举个例子,document上有一个style节点style1,sheet1 = style1.sheet,然后移除style节点再重新插入到document上(模拟应用切换style重建的过程),此时style1.sheet和sheet1是不相等的。然后styled-components内部只会记录sheet1,后续动态的样式只会往sheet1里插入,所以后续的样式都失效了。此PR拦截了sheet1的insert的逻辑,插入到重建后的style节点上,这样后续的动态样式就能生效了。 |
明白了。 |
比如主应用也监听了路由,路由变化的时候立马清空了容器 DOM,而 unmount 过程是异步的,这中间就可能出现子应用还在 unmount 执行过程中,但是 DOM 其实都已经被移除 document 文档流了。 |
确实会有这样的情况。 |
理论上是可行的,如果 styled component 都是通过 insertRule 在插入样式的话,可以劫持过程中记录一把。 |
hi @Aeero 按照前面聊的思路,提前记录一把应该是可行的,有兴趣直接一起修复了吗? |
嗯嗯,按照这个思路改过几版,但是还是有一些没有解决的问题,所以暂时还是WIP,大佬有空可以帮忙review一下这几个问题和解决思路
|
|
Checklist
npm test
passesDescription of change