【发布时间】:2018-11-11 20:21:31
【问题描述】:
我目前正在使用带有 Suspense 和 Lazy 的 React 16 来对我的代码库进行代码拆分。虽然我想预加载组件。
在下面的示例中,我有两条路线。有没有办法在Prime 安装后立即预加载Demo?我试图在Prime 页面的componentDidMount 中创建另一个动态导入,但React.lazy 似乎没有得到与下面的动态导入相同的文件。
import React, { lazy, Suspense } from 'react';
import { Switch, Route, withRouter } from 'react-router-dom';
import GlobalStyle from 'styles';
import Loading from 'common/Loading';
const Prime = lazy(() => import(/* webpackChunkName: "Prime" */'modules/Prime'));
const Demo = lazy(() => import(/* webpackChunkName: "Demo" */'modules/Demo'));
const App = () => (
<main>
<GlobalStyle />
<Suspense fallback={<Loading>Loading...</Loading>}>
<Switch>
<Route path="/" component={Prime} exact />
<Route path="/demo" component={Demo} />
</Switch>
</Suspense>
</main>
);
export default withRouter(App);
所以我尝试了不同的方法,例如使用和不使用webpackChunkName 以及在componentDidMount 中导入其他组件的不同方法,如下所示。在componentDidMount 中导入文件的前两种方法导致了如下图底部所示的 Webpack 错误。只有第三个进行了,但是在图像中制作了文件2.[hash].js,仅在访问页面后加载,而不是在componentDidMount
我在这里缺少什么?
modules/Demo.jsx的代码:
import React from 'react';
import LogoIcon from 'vectors/logo.svg';
import PageLink from 'common/PageLink';
import Anchor from 'common/Anchor';
import CenteredSection from 'common/CenteredSection';
const Demo = () => (
<CenteredSection variant="green">
<LogoIcon />
<PageLink to="/" variant="green">Go to home page</PageLink>
</CenteredSection>
);
export default Demo;
【问题讨论】:
-
在 Prime 的 componentDidMount 中使用
lazy对预加载情况没有任何好处,因为它会导致组件在渲染时被加载。方法 2 和 3 乍一看似乎很好,但是您遇到的错误 1 和 2 让我想查看modules/Demo的代码,因为似乎有什么东西导致了循环依赖。 -
@RyanC 感谢您的回复。我已经添加了演示页面的代码。你也可以在这里查看代码库:github.com/JBostelaar/react-prime/tree/progressive-web-app/src 我也认为第一种方法行不通,但我仍然想展示我尝试过的内容。 2 给出错误,3 没有预加载页面。
-
代码结构与我预期的有点不同。我期待看到
modules/Demo.jsx和modules/Prime.jsx。我并不是说你所拥有的是“错误的”,而是拥有Demo/index.jsx只是偏离了我使用的方法,我可以给出更自信的方向。 -
感谢您的意见,但我很确定问题不在于我的文件夹结构或命名。
-
不错的 webpackChunkName 用法。不知道你可以这样命名你的块,谢谢;)
标签: reactjs preload dynamic-import react-16