Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 将2个或多个动态导入合并到webpack的一个块中_Reactjs_Webpack_Code Splitting - Fatal编程技术网

Reactjs 将2个或多个动态导入合并到webpack的一个块中

Reactjs 将2个或多个动态导入合并到webpack的一个块中,reactjs,webpack,code-splitting,Reactjs,Webpack,Code Splitting,我正在根据browserRouter中加载的路由对react Web包应用程序进行代码拆分。现在我想将2个或更多动态导入打包到一个块中。例如,我有一个路由/a,它呈现仪表板的详细信息,另一个路由/a/{id},它显示单个项目的详细信息视图。因为,当我的用户导航到仪表板时,他们很可能也会打开某个项目的详细信息视图,所以我希望将两个动态导入的组件打包到同一块中。这可能吗 让详细信息:任意; 让aDashboard:任何; const[IsLoadedDashboard,SetIsLoadedDash

我正在根据browserRouter中加载的路由对react Web包应用程序进行代码拆分。现在我想将2个或更多动态导入打包到一个块中。例如,我有一个路由
/a
,它呈现仪表板的详细信息,另一个路由
/a/{id}
,它显示单个项目的详细信息视图。因为,当我的用户导航到仪表板时,他们很可能也会打开某个项目的详细信息视图,所以我希望将两个动态导入的组件打包到同一块中。这可能吗

让详细信息:任意;
让aDashboard:任何;
const[IsLoadedDashboard,SetIsLoadedDashboard]=useState(false);
const[IsLoadedDetails,SetIsLoadedDetails]=useState(false);
返回(
{
导入('../A/Dashboard')。然后((mod)=>{
aDashboard=mod.default;
SetLoadedDashboard(真);
});
返回仪表板(
) : ;
}}
/>
{
导入('../A/Details')。然后((mod)=>{
aDetails=mod.default;
setLoadedDetails(true);
});
返回详细信息(
) : ;
}}
/>
);

创建代理模块,该模块包括两个您需要位于一个块中的模块:

import Dashboard from 'Dashboard';
import Details from 'Details';

export {Dashboard, Details};
现在让我们假设上面模块的名称为“Proxy”(仅举个例子),它与您的模块位于同一目录中。您可以动态加载它:

 <Route
    exact
    path="/A"
    render={(props) => {
        import('../A/Proxy').then((mod) => {
            aDashboard = mod.Dashboard;
            setLoadedADashboard(true);
        });
        return loadedADashboard ? (
            <aDashboard />
        ) : <div />;
    }}
 />
 <Route
    exact
    path="/A/{id}"
    render={(props) => {
        import('../A/Proxy').then((mod) => {
            aDetails = mod.Details;
            setLoadedADetails(true);
        });
        return loadedADetails ? (
            <aDetails />
        ) : <div />;
    }}
 />
{
导入('../A/Proxy')。然后((mod)=>{
aDashboard=模块仪表板;
SetLoadedDashboard(真);
});
返回仪表板(
) : ;
}}
/>
{
导入('../A/Proxy')。然后((mod)=>{
aDetails=模块详细信息;
setLoadedDetails(true);
});
返回详细信息(
) : ;
}}
/>

您可以尝试在动态导入中使用webpack magic注释。对于这两个动态导入,请使用相同的WebPackageChunkName以确保两个文件捆绑在同一块下

import(/* webpackChunkName: 'dashboard' */'../A/Dashboard').then((mod) => {
  aDashboard = mod.default;
  setLoadedADashboard(true);
});
import(/* webpackChunkName: 'dashboard' */'../A/Details').then((mod) => {
  aDetails = mod.default;
  setLoadedADetails(true);
});

注意:我们对两个导入使用相同的块名称。

非常感谢您的回复!这是我已经考虑过的,但现在的问题是我们的代码的组织方式,以这种方式构建我的导入将意味着一些重要的重构,所以我正在寻找一种不需要太多代码更改的方法。就像一个网页包插件或者我可以把它作为配置而不是代码添加的东西。