gpt4 book ai didi

reactjs - 使用 Lazy + Suspense react 预加载组件

转载 作者:行者123 更新时间:2023-12-03 13:22:32 24 4
gpt4 key购买 nike

我目前正在使用 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

上加载

enter image description here

我在这里缺少什么?

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()和Suspense在幕后所做的事情存在误解。

React.lazy() 的唯一期望是它需要一个返回 Promise 的函数,该 Promise 使用默认组件解析。

React.lazy(() => Promise<{default: MyComponent}>)

所以如果你想预加载,你所要做的就是提前自己执行 promise 。

// So change this, which will NOT preload
import React from 'react';
const MyLazyComp = React.lazy(() => import('./path/to/component'));

/*********************************************/

// To this, which WILL preload
import React from 'react';

// kicks off immediately when the current file is imported
const componentPromise = import('./path/to/component');

// by the time this gets rendered, your component is probably already loaded
// Suspense still works exactly the same with this.
const MyLazyComp = React.lazy(() => componentPromise);

事实上,这是一个已知的签名,因此它对于各种其他情况都很有用。例如,我有一堆依赖于动态加载的谷歌地图 api 的组件,我能够创建一个加载谷歌地图 api 然后导入该组件的函数。我不会详细介绍这个示例的内部结构,因为它是一个切线,但重点是我为自己创建了一个函数,它执行一堆异步操作,然后返回一个带有 {default: Component} 对象的 Promise。

import React from 'react';
const MyLazyComp = React.lazy(() => importMapsComponent('./path/to/comp'));

关于reactjs - 使用 Lazy + Suspense react 预加载组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53252861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com