如何在微前端架构中共享 redux store?

adi*_*070 7 reactjs redux react-redux micro-frontend

我正在尝试按照微前端文章创建一个小项目来实现微前端架构。我正在为每个 MFE(微前端)创建多个存储库,并为应用程序使用 Redux。我有以下架构:

  1. Frame- 一个集中式(主)存储库,负责根据路由呈现主应用程序部分和 MFE(我正在使用connected-react-router)。它初始化 Redux 存储并添加一个injectReducer函数来动态添加减速器,如redux文档中的代码拆分中所述。该框架获取特定 MFE 的清单并呈现它。该框架还具有一些用于身份验证的 redux 数据。
  2. MFEs - 这些是单独的功能应用程序,按帧呈现。

现在我有一个问题,我想在injectReducer我的 MFE 中使用函数来动态添加减速器来存储。为此,我需要访问store由框架创建的同一个实例。正如这个答案中提到的,理想的方法是导出创建的商店实例并使用它,但是我们如何在多个存储库中共享同一个商店实例?

And*_*rew 10

文章中有一条评论直接解决了这个问题:

如果您使用 redux,通常的方法是为整个应用程序建立一个单一的、全局的、共享的存储。然而,如果每个微前端都应该是自己独立的应用程序,那么每个微前端都有自己的 redux 存储是有意义的。redux 文档甚至提到“将 Redux 应用程序隔离为更大应用程序中的组件”作为拥有多个商店的正当理由。

长话短说:不要分享你的 redux store

在微前端之间共享任何内容不再使它们成为独立的实体,并且违背了它的全部目的。现在它只是一个过度设计的庞然大物。只需将这些各自的存储库转换为整体存储库中定义明确的模块即可。仍然可以在统一的存储库中将职责划分到各自的孤岛中。只是需要更多的纪律。


小智 5

使用合成事件进行跨微前端通信,eventListeners如下CustomEvent所示:

MF-1:

function Cart() {
  const [cartItems, addCartItems] = useState([]);

  const handleAddToCart = (event) => {
    addCartItems((currentItems) => [...currentItems,
    event.detail.item]);
  };

  useEffect(() => {
    window.addEventListener('addToCart', handleAddToCart);

    return () => {
      window.removeEventListener('addToCart', handleAddToCart)
    }
  }, [handleAddToCart]);
  ...
}
Run Code Online (Sandbox Code Playgroud)

MF-2:

function itemLookUp() {
  const handleSubmit = (item) => {
    const customEvent = new CustomEvent('message', { detail: item });
    window.dispatchEvent(customEvent)
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)