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

时间:2019-08-27 07:15:14

标签: reactjs lazy-evaluation

我正在尝试在Tab组件内部加载组件以进行反应。这个想法是使用此syntanx制作的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"]
        }
    ]
};

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

<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>

但是此代码不起作用,我可以看到,如果通过执行const Comp = lazy(() => import('./components/OneComponent'));仅将路径用作字符串,则可以,但是如果使用动态变量,则不能。

2 个答案:

答案 0 :(得分:1)

Webpack正在尝试最好排除所有不需要的文件。

我认为,如果您之前定义了const并在循环中引用它们,那应该会起作用

const Comp1 = lazy(() => import('./components/OneComponent'));
const Comp2 = lazy(() => import('./components/TwoComponent'));

...

tabs: [
    {
        name: "Title for Tab 1",
        component: Comp1
    },
    {
        name: "Title for Tab 2",
        component: Comp2
    }
]

...

      <Suspense fallback={<div>Loading</div>}>
       {tabs.map(tab => tab.component)}
      </Suspense>

答案 1 :(得分:1)

我找到了一种可能的解决方案,该解决方案无需执行以下操作即可完成我需要的工作:

<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>

因此,Webpack可以加载组件并按承诺将其返回

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