封装 React 应用程序的最佳方式是什么?

What is the best way to encapsulate React app?

我正在尝试将 React 应用程序 封装到 Web 组件的 Shadow RootiFrame 构建一个 小部件 用于像 Intercom 小部件这样的 Chatbot 信使。

我正在使用:

React 16.8.6
Typescript 3.5.3
Redux 4.0.4 
Styled-components 4.3.2 
Material-UI 4.3.3

我的 Web 组件选择基于 this React 官方文档 (没有提到我的任何问题)

首先,我遇到了一些风格问题,styled-components和Material-UI,因为他们都把自己的风格放在了光DOM header。但是,我想出了如何处理这两个 问题(我可以帮助遇到同样问题的任何人)。 [已解决]

然后我的组件渲染没有问题,但是事件不工作,经过一些研究我发现当你在 Shadow DOM 事件中渲染一个反应组件时不会被派遣反应。 IE。当用户点击你的 React 组件时,什么也没有发生。所以我使用 this repo 来解决这个问题,并 重新定位和调度事件 到 React。 [PARTIALLY-SOLVED]

但不幸的是,这还不够,因为像onChange这样的事件没有得到修复,而像Material-UI这样的深度添加了他们自己的事件,问题在于React它自检这个 issue 并且他们没有那么积极地在近期修复它。[问题]

所以我决定转向另一种封装选择iFrame。我还没有找到有用的 tuto、repo 或线程,所有现有的 npm 模块都没有更新,也没有针对 Typescript 进行优化。 我需要一种清晰的方法来将我的应用程序封装在 iFrame#document 中。

请提出一个回购协议。或者给我任何实施的想法,任何想法都可能非常有帮助。

最后,我成功地将我的应用程序封装在 iframe#document 中。

// Create iframe.
const iFrame: any = document.createElement("iframe")
document.body.appendChild(iFrame)
// Create react entry point.
const mountPoint = document.createElement("div")
iFrame.contentWindow.document.body.appendChild(mountPoint)
ReactDOM.render(<App />, mountPoint)

我只是忘记指向 x.contentWindow.document.body 元素,而是直接指向 iframe