动态导入和延迟加载 React 组件

Rub*_*ada 5 lazy-evaluation reactjs

我正在尝试加载选项卡组件内的组件以进行反应。这个想法是有一个带有以下语法的 json (或更好的 yaml):

interface TabType {
    name: string;
    components: string[];
}

interface Templates {
    tabs: TabType[];
}

const templateTabsModules: Templates = {
    tabs: [
        {
            name: "Title for Tab 1",
            components: ["./components/OneComponent"]
        },
        {
            name: "Title for Tab 2",
            components: ["./components/TwoComponent"]
        }
    ]
};
Run Code Online (Sandbox Code Playgroud)

因此,在主组件内部执行以下操作:

<Tabs id="tab">
   {templateTabsModules.tabs.map(tab => {
      return (
        <Tab title={tab.name}>
          <p>The component should appears bellow:</p>
          <Suspense fallback={<div>Loading</div>}>
           {tab.components.map(component => {
              const Comp = lazy(() => import(component));
              return (<Comp />)
           })}
          </Suspense>
         </Tab>
       );
    })}
</Tabs>
Run Code Online (Sandbox Code Playgroud)

但是这段代码不起作用,我可以看到,如果我仅使用路径作为字符串const Comp = lazy(() => import('./components/OneComponent'));,那么它就可以工作,但如果我使用动态变量则不会。

Rub*_*ada 5

我找到了一个可能的解决方案,可以通过执行以下操作来完成我需要的操作,而无需在组件之前进行声明:

<Tabs id="tab">
  {templateTabsModules.tabs.map((tab, index) => {
     return (
        <Tab title={tab.name} key={index}>
            <p>The component should appears bellow:</p>
            <Suspense fallback={<div>Loading</div>}>
             tab.components.map(component => {
               const Comp = lazy(() => import(
                 /* webpackChunkName: "my-chunk-name" */
                 /* webpackMode: "lazy" */
                 `${component}`
               ).then(comp => comp));

               return (<Comp />)

             })}
            </Suspense>
        </Tab>
      );
   })}
</Tabs>
Run Code Online (Sandbox Code Playgroud)

因此 Webpack 可以加载组件并将其作为 Promise 返回

示例-> https://codesandbox.io/s/lazy-components-with-react-mix9y