14 代码分割之lazy:Suspense与路由懒加载

本文探讨了React.js中的代码分割技术,重点介绍了如何使用`lazy`方法进行组件懒加载,以及结合内置组件`Suspense`实现加载指示器。通过这种方式,可以减小打包体积并延迟加载非首屏组件。同时,文章也提及了在路由中应用懒加载时需要注意的本地调试问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

lazy内置方法 Suspense内置组件

  • lazy是React提供的懒(动态)加载组件的方法,React.lazy()

  • 能减少打包体积、延迟加载首屏不需要渲染的组件

  • 依赖内置组件Suspense:给lazy加上loading指示器组件的一个容器组件

  • Suspense目前只和lazy配合实现组件等待加载指示器的功能

  • React.lazy 接受一个函数,这个函数需要动态调用 import()。它必须返回一个 Promise,该 Promise 需要 resolve 一个 default export 的 React 组件。所以要用类返回render而不是函数

  • index.jsx

import Loading from './loading'
const MyMain = React.lazy(() => import('./main.jsx'))
function App() {
    return (
        <div>
            {/* 注意 fallback这里是组件 */}
            <React.Suspense fallback={<Loading />}>
                <MyMain />
            </React.Suspense>
        </div>
    )
}

ReactDOM.render(
    <App />,
    document.getElementById('app')
)
  • main.jsx
// export function Main() {
//     return (
//         <div>
//             显示内容
//         </div>
//     )
// }
// React.lazy 接受一个函数,这个函数需要动态调用 import()。
// 它必须返回一个 Promise,该 Promise 需要 resolve 一个 default export 的 React 组件。
export default class Main extends React.Component {
    render() {
        return (
            <div>
                显示内容
            </div>
        )
    }
}
  • Loading.jsx
export default function Loading() {
    return (
        <div>
            <h1>Loading...</h1>
            <h1>Loading...</h1>
            <h1>Loading...</h1>
        </div>
    )
}

路由懒加载

  • yarn add react-router react-router-dom
  • 本地调试时,path和文件名同名,会变成访问文件
  • index.jsx
import Loading from './loading'
import React, { lazy, Suspense } from 'react'
import { BrowserRouter } from 'react-router-dom'
import { Switch, Route } from 'react-router'
const MyMain = lazy(() => import('./main.jsx'))
function App() {
    return (
        <div>
            {/* 注意 fallback这里是组件 */}
            <Suspense fallback={<Loading />}>
                <div>
                    <MyMain />
                    <Switch>
                        <Route path="/mypage1" component={lazy(() => import('./page1.jsx'))} />
                        <Route path="/mypage2" component={lazy(() => import('./page2.jsx'))} />
                    </Switch>
                </div>
            </Suspense>
        </div>
    )
}

// 路由懒加载
ReactDOM.render(
    <React.StrictMode>
        <BrowserRouter>
            <App />
        </BrowserRouter>
    </React.StrictMode>,
    document.getElementById('app')
);

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值