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

提案:修改 ice 3 中 @ice/runtime 的一行代码以支持 React 16 #5739

Closed
AlbertXiao1994 opened this issue Dec 21, 2022 · 2 comments
Closed

Comments

@AlbertXiao1994
Copy link
Contributor

AlbertXiao1994 commented Dec 21, 2022

【背景】
团队内计划增量应用使用 ice 3,存量应用迁 ice 3。增量应用每年大概有几十个,存量应用有上百个。团队内的基础组件和业务代码,数量众多,都是基于 React 16 甚至 15 编写。哪怕是对于增量应用,如果使用了存量基础组件,都很难保证在 18 下的稳定性。我们期望在 ice 3 中使用 16。

【方案】
把 ice 3 的 React 和 ReactDOM 给 externals 掉,再通过一些 polyfill 代码在 16 中模拟 createRoot 等 API。这样做不影响 ice 3 基于 18 发展的策略,又能把 React 降到 16,让业务无成本迁移。

【进展】
我已跑通了 @ice/antd-pro-scaffold 该模板,但遇到了导航切换的问题。
屏幕录制2022-12-21 15 05 52

【错误定位】
@ice/runtime 中更新 AppContext 时,依赖了 18 的 Promise 自动批处理功能。导致在 16 下,@ice/plugin-store 中的 StoreProviderWrapper 第一次更新时获取不到新的 routeModules
image
image

【解决方案】
更换 @ice/runtime 中 setRouteState 和 setHistoryState 的顺序即可。该方案无需植入特别的 React 16 兼容逻辑,在 18 下setRouteState、 setHistoryState 的先后不影响执行结果,无副作用。
image

@luhc228
Copy link
Collaborator

luhc228 commented Dec 21, 2022

PR welcome.
@AlbertXiao1994

@AlbertXiao1994
Copy link
Contributor Author

PR welcome. @AlbertXiao1994

ok

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

3 participants