在反应中动态导入模块

Posted

技术标签:

【中文标题】在反应中动态导入模块【英文标题】:Dynamically import a module in react 【发布时间】:2020-07-18 11:54:54 【问题描述】:

我有一个基本的反应应用程序,它必须动态嵌入其他反应应用程序。例如

App1(基础应用) --> App2(子app1) --> App3(子app2)

App2 和 App3 是独立构建的 React 应用程序。 我需要一种将这些应用程序动态导入 App1 的方法。 我这样做的一种方法是将构建的 js 和 CSS 文件添加到节点模块中的相应文件夹中(请参阅文件结构的链接)

我正在尝试在 App1 中动态导入 app2 和 app3,

let path = `../../node-modules/$application.title/build/$application.title`
    let pathCss = `../../node-modules/$application.title/build/$application.title.css`
    import('' + pathCss)
    .then(component =>
    console.log('css file loaded', component)
    ).catch(error => 
    console.error(`"$application.title" not yet supported $error`);
    );
        
    import('' + path)
    .then(component =>
    this.setState(
    routeComponents: this.state.routeComponents.concat(component.App)
    )
    )
    .catch(error => 
        console.error(`"$application.title" not yet supported $error`);
    );
    

但这似乎没有找到应用程序,并给出了无法加载 src 文件夹之外的模块的错误。 关于如何实现这一点的任何建议?

【问题讨论】:

这行得通吗:***.com/a/58931464/11380693 ? 发布没问题,我们可以将repo发布到存储库。但是,动态加载不起作用。我正在尝试动态加载我的componentDidMount中的组件。这里不允许引用 src 文件夹之外的任何内容 不能引用 src 文件夹外的任何东西的原因是因为它是 create-react-app 的特殊限制。它在 ModuleScopePlugin 中实现,以确保文件驻留在 src 文件夹中 有没有其他方法可以动态导入打包在node-modules中的模块? 【参考方案1】:

看看这个解决方案https://codesandbox.io/s/busy-elgamal-l6po2

您可以看到Loading 组件在获取App1 组件时被渲染。

import React,  useState, useEffect  from "react";
import "./styles.css";

function Loading() 
  return <div>Loading</div>;


export default function App() 
  const [comp, setComp] = useState(Loading);

  useEffect(() => 
    const load = async () => 
      const App1 = (await import("./App1")).default;
      setComp(App1);
    ;

    load();
  , []);

  return <>comp</>;

【讨论】:

以上是关于在反应中动态导入模块的主要内容,如果未能解决你的问题,请参考以下文章

解析模块说明符时出错:从 API 进行动态导入时做出反应

使用最佳实践反应导入模块 [重复]

无法解析模块“反应”的路径。 (导入/未解决)

Python30 动态导入模块/断言

使用最佳实践反应导入模块[重复]

七. 使用反射动态导入模块