外部包导出的 React 和 Webpack 渲染组件

IT技术 javascript node.js reactjs webpack
2021-05-20 03:37:32

我正在尝试使用在我的主要 React 应用程序(bundle B)中的外部脚本(bundle A) 中公开的 React 组件

外部 React 'header' 组件(包 A)通过 a 加载<script>并使用 Webpack暴露加载器作为全局窗口变量公开

然后,我的站点按以下顺序引用这些包:

  1. React/ReactDOM 包
  2. 外部标头组件包(包 A)
  3. 主应用程序包(包 B)

然后可以通过window.appHeaderBundleMain 应用程序(包 B)中引用外部标头组件,例如

在此处输入图片说明

在我的主应用程序中,我尝试引用该组件const Header = window.appHeaderBundle.default;,然后render()将其用作普通 jsx <Header />

这确实开始运行组件代码,但因错误而爆炸:

未捕获的错误:元素 ref 被指定为字符串 (searchForm),但未设置所有者。您可能加载了多个 React 副本。

我正在尝试做的事情是否可行,如果可以,我该如何让我的组件进行渲染?

编辑:这种方法确实适用于一个只呈现<h1>test</h1>. 使用的ref是什么破东西!


这背后的想法是可以将外部包放入多个站点。更新外部包然后将反映在所有站点中。目前,每个站点都通过 NPM 加载它,但这需要每个站点在进行更改时提高版本号,因此为什么我要采用这种方法。

2个回答

该错误表示您有不同的 React 副本。您应该显示“插件”(外部组件)的 webpack 配置。您评论答案中,我解释说插件的 webpack 配置将 React 定义为外部。

这当然意味着您的主应用程序应该window.React = React在包含延迟加载的组件之前设置,以便它们工作。他们不应该再次包含 React 本身,这违背了将单个 React(或更一般地说是一个vendor)包和延迟加载组件定义为完全独立的 Javascript 项目的目的。

https://webpack.js.org/configuration/externals/

这个错误很奇怪,但它闻起来好像你没有这样做,因此 Header 包包含它自己的 React 副本。

我个人没有遇到过这个错误,但是您是否尝试过执行此页面上列出的任何修复

根据您的解释,您使用外部组件的方式应该是可能的。我不确定您使用外部包的理由npm是否正确。

  • 使用npm会为这个外部组件节省一个额外的 HTTP 请求。
  • 当外部组件发生重大更改时会发生什么?如果这个外部组件的用户不知道它,他们的 Web 应用程序可能会中断。使用npm将防止这种情况。