当前位置: 首页 > 面试题库 >

动态加载React组件

宦兴朝
2023-03-14
问题内容

我正在考虑构建一个Web应用程序,人们可以在其中安装插件。我希望插件能够定义将呈现到页面的React组件,而无需在安装插件后重新编译主JavaScript包。

所以这是我正在考虑的方法:

  • 使用webpack 将主要的JavaScript与React作为外部库捆绑在一起。
  • 也让插件作者使用React作为外部库来编译其组件。

这样,我只运行一个React实例。我可能可以对其他一些经常使用的库执行相同的操作。

然后,问题是如何从服务器动态加载这些插件组件。假设我有以下组件:

class PluginRenderer extends React.Component{
  componentWillMount() {
    getPluginComponent(`/plugins/${this.props.plugin}/component.js`).then((com) => {
      this.setState({pluginComponent: com});
    })
  }

  render() {
    var Plugin = this.state.pluginComponent;
    return Plugin ? <Plugin {...this.props} /> : "Loading..."
  }
}

如何getPluginComponent实施?


问题答案:

几个月前,我还在客户工作中遇到了一个有趣的问题,而且我没有看到太多的文档方法。我们所做的是:

  1. 各个插件将是单独的Webpack项目,我们为它们提供模板或生成项目模板的CLI工具。

  2. 在这个项目中,我们externals为核心应用程序中已使用的共享供应商库定义Webpack :React,Redux等。这告诉插件不将其包含在捆绑软件中,而是从window我们在核心应用程序中设置的变量中获取它们。我知道,听起来很烂,但是比让所有插件重新包含1000个共享模块要好得多。

  3. 重复使用的这一概念external,核心应用程序还通过窗口对象向插件提供了一些服务。最重要的一种PluginService.register()方法是插件初始化时必须调用的方法。我们在这里反转控制:该插件负责向核心应用程序说“嗨,我在这里,这是我的主要输出(如果是UI插件,则是Component)”。

  4. 核心应用程序具有一个PluginCache类/模块,该类/模块仅保存已加载插件的缓存(pluginId->导出的插件,fn,class或其他内容)。如果某些代码需要插件来呈现,它将向该缓存请求。这样的好处是允许在插件未正确加载时返回<Loading /><Error />组件,依此类推。

  5. 对于插件加载,此PluginService / Manager加载插件配置(我应该加载哪个插件?),然后创建动态注入的script标签来加载每个插件包。捆绑包完成后,将register调用步骤3中描述的调用,并且步骤4中的缓存将具有该组件。

  6. 与其尝试直接从组件中加载插件,不如从缓存中请求插件。

这是一个非常高层次的概述,与当时的需求密切相关(这是一个类似于仪表板的应用程序,用户可以在其中动态添加/删除面板,而所有这些小部件都作为插件实现)。

根据您的情况,您甚至可以用<Provider store={ theCoreStore }>
包裹插件,以便它们必须访问Redux,或设置某种事件总线,以便插件可以彼此交互…有很多东西需要弄清楚。:)

祝您好运,希望对您有所帮助!



 类似资料:
  • 问题内容: 我的目标是在页面/父组件上动态添加组件。 我从这样的一些基本示例模板开始: main.js: App.js: SampleComponent.js: 此处已安装到预写在模板中的节点上。但是,如果我需要向App组件中添加不确定数量的组件怎么办?显然,我不能将所有必需的 div都 坐在那里。 在阅读了一些教程之后,我仍然不了解如何动态创建组件并将其动态添加到父组件。有什么办法呢? 问题答案

  • 问题内容: 我需要动态加载React组件。 我从用户获取要加载为字符串的组件名称。我正在使用 webpack 。 如何动态加载组件,而不要使用静态import语句。似乎不评估表达式。我想要实现的是这样的事情。 但这似乎不起作用。 问题答案: 基本上,它可以归结为预先创建您将需要的所有块。然后,您只需要一种动态引用它们的方法。这是我基于的解决方案: http://henleyedition.com/

  • 动态加载QML不同组成部分最简单的方法是使用加载元素项(Loader element)。它作为一个占位符项用来加载项。项的加载通过资源属性(source property)或者资源组件(sourceCompontent)属性控制。加载元素项通过给定的URL链接加载项,然后实例化一个组件。 加载元素项(loader)作为一个占位符用于被加载项的加载。它的大小基于被加载项的大小而定,反之亦然。如果加载

  • 问题内容: 在React JSX中,似乎无法执行以下操作: 我收到一个解析错误:意外令牌{。这不是React可以处理的吗? 我正在设计此组件,以便在内部隐藏的值将包含有效的HTML元素(h1,p等)。有什么办法可以使这项工作吗? 问题答案: 您不应该将组件子弹放在花括号中: 这是一个有效的小提琴:http : //jsfiddle.net/kb3gN/6668/ 此外,您还可以找到JSX编译器,有

  • 问题内容: 我有一个页面,可根据用户输入呈现不同的组件。目前,我已经对每个组件的导入进行了硬编码,如下所示: 但是,我一直都在更改/添加组件。有没有办法使文件仅存储组件的名称和路径,然后将它们动态导入另一个文件中? 问题答案: 我认为对于我想要实现的目标可能有些困惑。我设法解决了我遇到的问题,并在下面显示了我的代码,其中显示了我的解决方法。 单独的文件(ComponentIndex.js): 主文

  • 问题内容: 我的index.html 在该函数中,我打印到控制台以查看其运行时间。 当我加载页面时,经常会 在 react组件 之后 加载。 Login.js 在调试器中,您可以看到脚本正在组件之后加载 如果我刷新页面几次,则可以正常工作。但是有时它起作用,有时却不起作用。 为什么? 问题答案: 我认为在react中加载脚本的最好方法是使用容器组件。这是一个非常简单的组件,它允许您编写将脚本导入组