我目前正在使用React 16与Suspense和Lazy来拆分我的代码库。虽然我想要预加载组件。
在我的以下示例中,我有两个路由。是否有办法在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;
lazy
对于预加载情况没有任何好处,因为它会在渲染时加载组件。2和3方法乍一看似乎不错,但是你在1和2中遇到的错误让我想要查看modules/Demo
的代码,因为似乎有些东西导致了循环依赖。 - Ryan Cogswellmodules/Demo.jsx
和modules/Prime.jsx
。我并不是说你现在的做法是“错误”的,但是使用Demo/index.jsx
而不是我熟悉的方法会让我在给出更自信的指导时感到困惑。 - Ryan Cogswell