【问题标题】:React loadable import connect componentReact 可加载导入连接组件
【发布时间】:2018-07-09 14:20:49
【问题描述】:

我正在尝试使用 ServerSide Rendering 使 react-loadable 工作。我有一个相当大的应用程序,它使用多个 HOC,其中 connect 组件,添加路由器等。

组件似乎没问题,而是通过react-redux 或其他 HOC 连接的智能组件。 react-loadable 似乎并没有将其作为单独的模块,并且在创建 undefined.json 中被抛出。

正确加载的dumb组件示例:

"common/HeaderTitle": [
    {
      "id": 667,
      "name": "./src/app/components/common/HeaderTitle.jsx",
      "file": "0.650d44243e1a15fa7627.js"
    },
    {
      "id": 667,
      "name": "./src/app/components/common/HeaderTitle.jsx",
      "file": "0.650d44243e1a15fa7627.js.map"
    },
    ...
],

不加载的智能组件示例:

"undefined": [
    {
      "id": 626,
      "name": "./src/app/components/modules/Home/index.jsx",
      "file": "0.650d44243e1a15fa7627.js"
    },
    ...
],

我的服务器的 html 呈现如下所示。这里的所有内容都是从官方文档中复制的:

app.use((req, res) => {
    const modules = [];

    const html = SSR ? renderToString(
        <Provider store={store}>
            <StaticRouter location={req.url} context={{}}>
                <Loadable.Capture report={moduleName => modules.push(moduleName)}>
                    <App />
                </Loadable.Capture>
            </StaticRouter>
        </Provider>,
    ) : ' ';

    console.log('modules', modules);
    const bundles = getBundles(stats, modules);
    console.log('bundles', bundles);

    res.status(200).send(renderFullPage({ html, bundles }));
});

哪些日志符合预期:

modules [ './modules/Home' ]
bundles [ undefined ]
TypeError: Cannot read property 'file' of undefined

这真的让我发疯了。这个包看起来真的很好,我想使用它。但是我找不到任何关于此类问题的信息,而且 Github 上也没有问题部分。

欢迎任何建议或帮助。提前致谢。

【问题讨论】:

  • 如何使用 react-loadable 导入异步组件?
  • 你的问题解决了吗@ronnyrr?

标签: reactjs asynchronous react-redux connect react-loadable


【解决方案1】:

只是一个疯狂的猜测,但我认为这与您正在导入 index.js 的事实有关,并且 react-loadable 在 Loadable.Capture 中没有发现这一点。或者 wepback 插件没有在 react-loadable.json 文件中创建正确的映射。

我在生产应用程序(包括 react-router、redux、react-loadable)中使用的一个技巧是使用 webpack 的命名块:

const AsyncComponent = Loadable({
    loader: () => import(/* webpackChunkName: "myNamedChunk" */ './SomeComponent'),
    modules: ['myNamedChunk']
});

这样你可以控制模块名称并明确告诉 react-loadable 映射什么。

我还写了一篇文章,介绍如何在 create-react-app 项目中实现这一点:https://medium.com/bucharestjs/upgrading-a-create-react-app-project-to-a-ssr-code-splitting-setup-9da57df2040a

【讨论】:

  • 感谢您的回复。不知道块名称。我确实添加了块名称,这是一个很大的改进。不幸的是,这并不能解决我的问题。 Webpack 很好地创建了块,但在 react-loadable 中它一直在 undefined 中缩进它。但似乎模块甚至无法正常工作。我为NotFound 组件添加了模块404,但在json 中它仍然引用"./common/NotFound"。还检查了您的文章,也没有看到任何重大变化。但再次感谢您的回复。会尝试一些其他的东西..
猜你喜欢
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
  • 2020-10-20
  • 2017-01-14
  • 1970-01-01
  • 2018-10-15
  • 2020-12-03
  • 2019-06-21
相关资源
最近更新 更多