umijs / qiankun

📦 🚀 Blazing fast, simple and complete solution for micro frontends.
https://qiankun.umijs.org
MIT License
15.57k stars 2k forks source link

[Bug] react-jss 非首个样式使用 node.parent.insertBefore 插入,dynamicStyleSheetElements无法记录相应style #1533

Open LincWong opened 3 years ago

LincWong commented 3 years ago

What happens?

父应用切换路由后,子应用 react-jss插入的样式丢失

父应用:vue2 子应用:react17 + react-jss

问题原因

react-jss 库的样式插入逻辑 避开了qiankun的劫持

https://github.com/cssinjs/jss/blob/18c2dd913d2d289c95c68ab3daf841716d78c65f/packages/jss/src/DomRenderer.js#L231

本地实测 注释 231-237行则可以解决该问题;

问题过程

第一次插入style,触发qiankun劫持的appendChild,会被挪到子应用container中。 第二次插入style,直接进到node.parent.insertBefore,这时node.parent是子应用的container,所以qiankun的所有劫持都感知不到插入的style;

问题现象

直接导致rebuild后,子应用样式丢失。

建议修复方案

子应用容器也加上appendChild、insertBefore监听 应该能解决这个问题?

相关环境信息

LincWong commented 3 years ago

https://www.npmjs.com/package/react-jss

该库 Weekly Downloads 166,733 是 React CSS IN JS 最多人使用的解决方案,请 @kuitos 跟进处理一下

nantunes commented 2 years ago

JSS keeps references to unmounted <style> elements in its global sheets registry. It always start its search for the insertion point at this global registry, even if a new SheetsRegistry is created on each micro app mount (or even if a new JSS instance is created).

In my use case I had to do:

import { sheets } from "jss";
// [...]
sheets.reset();

This works if only one micro app using JSS is rendered at one time (singular/singleton scenario). Additional logic might be needed when rendering more than one.

github-actions[bot] commented 2 years ago

Hello @LincWong. We totally like your proposal/feedback, welcome to send us a Pull Request for it. Please be sure to fill in the default template in the Pull Request, provide changelog/documentation/test cases if needed and make sure CI passed, we will review it soon. We appreciate your effort in advance and looking forward to your contribution!

你好 @LincWong,我们完全同意你的提议/反馈,欢迎直接在此仓库创建一个 Pull Request 来解决这个问题。请务必填写 Pull Request 内的预设模板,提供改动所需相应的 changelog、测试用例、文档等,并确保 CI 通过,我们会尽快进行 Review,提前感谢和期待您的贡献。

yurizhang commented 2 years ago

我同时手动加载多个子应用,也遇到这样的情况,样式 丢失了~

cl1107 commented 2 years ago

https://www.npmjs.com/package/react-jss

该库 Weekly Downloads 166,733 是 React CSS IN JS 最多人使用的解决方案,请 @kuitos 跟进处理一下

你解决这个问题了吗?

LincWong commented 2 years ago

你好,我已经收到你的邮件了。

haoyinag commented 1 year ago

同问。 基座和子应用都用到了jss库,子应用之间切换的时候,切回已加载过的子应用,会引起jss内部sheet的取值不正确,引起sheet.cssRules null的报错。

关闭沙箱模式后不存在这个问题,,但关闭沙箱担心引起作用域污染等问题。

LincWong commented 1 year ago

你好,我已经收到你的邮件了。

Baoyx007 commented 1 year ago

emotion 在微前端切换时, 也会导致丢失样式. 本地开发不会出现, 生产会出现.

LincWong commented 1 year ago

你好,我已经收到你的邮件了。

Ybbbb commented 1 year ago

emotion 在微前端切换时, 也会导致丢失样式. 本地开发不会出现, 生产会出现. 请问有解决方案了吗

LincWong commented 1 year ago

你好,我已经收到你的邮件了。

szk930929 commented 4 months ago

https://www.npmjs.com/package/react-jss

该库 Weekly Downloads 166,733 是 React CSS IN JS 最多人使用的解决方案,请 @kuitos 跟进处理一下

最新版本qiankun使用@ant-design/use-emotion-css也会有同样的问题,请问这个问题是否会解决

LincWong commented 4 months ago

你好,我已经收到你的邮件了。