Skip to content

懒加载

在 Nexjs 中有两种方式实现懒加载

  1. 使用 React.lazy()Suspense

  2. 使用 next/dynamic 实现动态导入

默认情况下,服务端组件自动进行代码分隔,并且可以使用流将 UI 片段逐步发送到客户端,所以懒加载应用于客户端。

React.lazy 与 Suspense

我们先讲讲 React 的 lazy 方法,lazy 可以实现延迟加载组件代码,直到组件首次被渲染。

换句话说,直到组件需要渲染的时候才加载组件的代码。使用示例如下:

ts
import { Suspense, lazy } from "react";

const MarkdownPreview = lazy(() => import("./MarkdownPreview.js"));

export default function Page() {
  return (
    <Suspense fallback={"loading"}>
      <h2>Preview</h2>
      <MarkdownPreview />
    </Suspense>
  );
}

next/dynamic

不过开发 Next.js 应用的时候,大部分时候并不需要用到 React.lazySuspense,使用 next/dynamic 即可,它本质就是 React.lazySuspense 的复合实现。在 apppages 目录下都可以使用。

  • 基本示例:
ts
// app/page.js
import dynamic from "next/dynamic";

// Server Component:
const ServerComponent = dynamic(() => import("../components/ServerComponent"));

export default function ServerComponentExample() {
  return (
    <div>
      <ServerComponent />
    </div>
  );
}

跳过 SSR

ts
// app/page.js
import dynamic from "next/dynamic";

// Server Component:
const ServerComponent = dynamic(() => import("../components/ServerComponent"), {
  ssr: false,
});

export default function ServerComponentExample() {
  return (
    <div>
      <ServerComponent />
    </div>
  );
}