đ§âđĢ React Lazy Loading
āĻāĻžāĻŦā§āύ āĻāĻĒāύāĻŋ āĻŦāϞāĻā§āύ â
âāĻĻā§āϏā§āϤ, āĻāĻžāύ⧠āϤā§, āĻāĻŽāϰāĻž āϝāĻāύ āĻ ā§āϝāĻžāĻĒ āĻŦāĻžāύāĻžāĻ, āϤāĻāύ āϏāĻŦ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻāĻāϏāĻžāĻĨā§ āĻāĻŽā§āĻĒā§āϰā§āĻ āĻāϰāĻŋāĨ¤ āĻāĻŋāύā§āϤ⧠āϏāĻŦ āϏāĻŽā§ āϤ⧠āĻāĻāĻāĻžāϰ āϏāĻŦ āĻĒā§āĻāĻā§ āϝāĻžā§ āύāĻž, āϤāĻžāĻ āύāĻž?â
āĻāĻ āĻāĻŋāύā§āϤāĻž āĻĨā§āĻā§āĻ āĻāϏ⧠đ Lazy Loading â āϝā§āĻāĻž āĻŦāϞā§:
"āϝāĻāύ āĻĻāϰāĻāĻžāϰ āϤāĻāύāĻ āϞā§āĻĄ āĻāϰā§, āĻāĻā§ āύāĻžāĨ¤"
đĨ āĻāϏāϞ āϏāĻŽāϏā§āϝāĻž āĻā§?
React āĻ āĻāĻŽāϰāĻž āϏāĻžāϧāĻžāϰāĻŖāϤ āϏāĻŦ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻāĻāϏāĻžāĻĨā§ āĻāĻŽā§āĻĒā§āϰā§āĻ āĻāϰāĻŋ:
import MarkdownPreview from "./MarkdownPreview.js";āϤāĻžāϤ⧠āĻšā§ āĻā§?
- āĻĒā§āϰ⧠āĻ ā§āϝāĻžāĻĒ āĻāĻāϏāĻžāĻĨā§ āĻŦāĻžāύā§āĻĄā§āϞ āĻšā§
- āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰ āϏāĻžāĻāĻ āĻā§āϞāĻžāϰ āϏāĻŽā§ āϏāĻŦ āĻāĻŋāĻā§āĻ āĻĄāĻžāĻāύāϞā§āĻĄ āĻšā§
- āĻāĻāĻāĻžāϰ āĻšā§ āĻŦāĻŋāϰāĻā§āϤ đĢ
đĄ āϏāĻŽāĻžāϧāĻžāύ: Lazy Loading
React āĻāĻŽāĻžāĻĻā§āϰ āĻāύā§āϝ āĻĻāĻŋā§ā§āĻā§ đ React.lazy()
āϝā§āĻāĻž āĻŦāϞā§: âāĻāĻŽāĻŋ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āϤāĻāύāĻ āĻāĻŽā§āĻĒā§āϰā§āĻ āĻāϰāĻŦ, āϝāĻāύ āĻāĻāĻāĻžāϰ āĻāĻāĻž āĻĻā§āĻāϤ⧠āĻāĻžāĻāĻŦā§āĨ¤â
đ āϧāĻžāĻĒā§ āϧāĻžāĻĒā§ Lazy Loading āĻļā§āĻāĻž āϝāĻžāĻ
đ§Š Step 1: Lazy āĻāϰ⧠āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻāĻŽā§āĻĒā§āϰā§āĻ
import { lazy } from "react";
const MarkdownPreview = lazy(() => import("./MarkdownPreview.js"));đĄ āĻŽāύ⧠āϰāĻžāĻā§:
- āĻāĻ
import()asynchronous - āϤāĻžāĻ āĻāĻāĻž āϤāĻāύāĻ āĻāĻžāĻ āĻāϰāĻŦā§, āϝāĻĻāĻŋ āϤā§āĻŽāĻŋ āĻāĻāĻžāĻā§
SuspenseāĻĻāĻŋā§ā§ wrap āĻāϰā§
đ§Š Step 2: Suspense āĻĻāĻŋā§ā§ āϧāϰā§
import { Suspense } from "react";
<Suspense fallback={<p>âŗ Loading...</p>}>
<MarkdownPreview markdown="Hello, **world**!" />
</Suspense>;đ āĻāĻ fallback UI āĻšāĻā§āĻā§ āĻāĻĒāύāĻžāϰ loading spinner āĻŦāĻž skeletonāĨ¤ MarkdownPreview āϝāϤāĻā§āώāĻŖ āύāĻž āĻāϏāĻā§, React āĻāĻ fallback āĻĻā§āĻāĻžāĻŦā§āĨ¤
đŽ āĻāϞ āĻāĻāĻāĻž āĻŦāĻžāϏā§āϤāĻŦ āĻāĻĻāĻžāĻšāϰāĻŖ āĻŦāĻžāύāĻžāĻ
â āĻāĻĒāύāĻŋ āĻāĻžāĻāĻā§āύ, Preview āĻŦāĻžāĻāύ āĻāĻžāĻĒāϞā§āĻ Lazy Component āϞā§āĻĄ āĻšā§āĻ
import React, { lazy, Suspense, useState } from "react";
const MarkdownPreview = lazy(() => import("./MarkdownPreview.js"));
function App() {
const [showPreview, setShowPreview] = useState(false);
return (
<div>
<h1>React Lazy Loading Example</h1>
<button onClick={() => setShowPreview((prev) => !prev)}>
Toggle Preview
</button>
<hr />
{showPreview && (
<Suspense fallback={<p>đ Loading preview...</p>}>
<h2>Preview</h2>
<MarkdownPreview markdown="Hello, **world**!" />
</Suspense>
)}
</div>
);
}đ¯ āĻāĻāύ āĻā§ āĻšāĻŦā§?
- āĻĒā§āϰāĻĨāĻŽā§
MarkdownPreview.jsāĻĢāĻžāĻāϞ āϞā§āĻĄ āĻšāĻŦā§ āύāĻž - āĻŦāĻžāĻāύ āĻā§āϞāĻŋāĻ āĻāϰāϞ⧠React āĻŦā§āĻāĻŦā§: āĻāĻš! āĻāĻ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻĻāϰāĻāĻžāϰ
- āϤāĻāύ āĻĢāĻžāĻāϞ āĻĄāĻžāĻāύāĻžāĻŽāĻŋāĻāĻžāϞāĻŋ āĻāĻŽā§āĻĒā§āϰā§āĻ āĻšāĻŦā§
- āϝāϤāĻā§āώāĻŖ āύāĻž āĻšā§, fallback āĻĻā§āĻāĻžāĻŦā§
đĄ āĻā§āĻā§āĻ āĻā§āϰāĻŋāĻ: āĻĄāĻžāĻāύāĻžāĻŽāĻŋāĻāϞāĻŋ āϝā§āĻā§āύ⧠āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āϞā§āĻĄ āĻāϰā§
import { lazy } from "react";
export function importDemo(file) {
return lazy(() => import(`../components/${file}.js`));
}const DemoComponent = importDemo("ColorDemo");đ§Ē āĻāĻāĻāĻŋ āĻŽāĻāĻžāϰ Example App
- āĻāĻĒāύāĻŋ āĻāĻāĻāĻž āĻŦāĻžāĻāύ⧠āĻā§āϞāĻŋāĻ āĻāϰāĻā§āύ
- āĻļā§āϧ⧠āϏā§āĻ āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§āϰ āĻĢāĻžāĻāϞāĻ āϞā§āĻĄ āĻšāĻā§āĻā§
- Network āĻā§āϝāĻžāĻŦ āĻā§āϞ⧠āĻĻā§āĻā§āύ, āĻŦā§āĻāϤ⧠āĻĒāĻžāϰāĻŦā§āύ live!
â Best Practice
| āĻā§āϞ | āĻ āĻŋāĻ |
|---|---|
āĻāĻŽā§āĻĒā§āύā§āύā§āĻā§āϰ āĻāĻŋāϤāϰ⧠lazy() | āĻĢāĻžāĻāϞā§āϰ āĻŦāĻžāĻāϰ⧠āĻāĻĒ āϞā§āĻā§āϞ⧠|
| Error handling āύāĻž āĻāϰāĻž | Always wrap in ErrorBoundary |
| āϏāĻŦ āĻāĻŋāĻā§ lazy āĻāϰ⧠āĻĢā§āϞāĻž | āĻļā§āϧ⧠āϝā§āĻā§āϞ⧠āĻĻā§āϰāĻŋāϤ⧠āĻĻāϰāĻāĻžāϰ, āϏā§āĻā§āϞ⧠lazy āĻāϰ⧠|
đĄī¸ ErrorBoundary āĻŦā§āϝāĻŦāĻšāĻžāϰ āύāĻž āĻāϰāϞā§?
āϝāĻĻāĻŋ āϞā§āĻāĻŋ āĻĢāĻžāĻāϞ āϞā§āĻĄ āύāĻž āĻšā§ (āϝā§āĻŽāύ āύā§āĻāĻā§āĻžāϰā§āĻ error), āϤāĻāύ āĻ ā§āϝāĻžāĻĒ āĻā§āϰā§āϝāĻžāĻļ āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻāύā§āϝ:
<ErrorBoundary>
<Suspense fallback={<Loading />}>
<MyLazyComponent />
</Suspense>
</ErrorBoundary>⥠āύā§āĻā§āϏāĻ.āĻā§āĻāϏ⧠āϤāĻžāĻšāϞ⧠āĻĻāϰāĻāĻžāϰ āύāĻžāĻ?
āĻšā§āϝāĻžāĻ, Next.js by default route-based lazy loading āĻāϰā§āĨ¤
āϤāĻŦā§āĻ, āϝāĻĻāĻŋ āĻāĻĒāύāĻŋ āĻā§āύ⧠modal, preview, āĻŦāĻž chart.js heavy āĻāĻŽā§āĻĒā§āύā§āύā§āĻ lazy āĻāϰāϤ⧠āĻāĻžāύâāĻāĻāĻž āϤāĻāύāĻ āĻāϰā§āϰāĻŋāĨ¤
đ§ŧ āϏāĻžāϰāĻžāĻāĻļ
| āĻļāĻŋāĻāϞāĻžāĻŽ | āĻŽāĻžāύ⧠|
|---|---|
React.lazy() | āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻļā§āϧ⧠āĻĻāϰāĻāĻžāϰ āĻšāϞ⧠āϞā§āĻĄ |
Suspense fallback | āϝāĻāύ āϞā§āĻĄāĻŋāĻ āĻšāĻā§āĻā§, āϤāĻāύ āĻā§ āĻĻā§āĻāĻžāĻŦ |
Lazy āĻĢāĻžāĻāϞ default export āĻšāϤ⧠āĻšāĻŦā§ | āύāĻž āĻšāϞ⧠āĻāϞāĻŦā§ āύāĻž |
āĻĢāĻžāĻāϞā§āϰ āĻŦāĻžāĻāϰ⧠lazy() | āύāĻž āĻšāϞ⧠āĻŦāĻžāϰāĻŦāĻžāϰ āϰā§āύā§āĻĄāĻžāϰ āĻšāĻŦā§ |
| ErrorBoundary | fallback āĻāϰāϰ āϧāϰāϤ⧠āϏāĻšāĻžā§ |
âī¸ āĻļā§āώ āĻāĻĨāĻž
React Lazy Loading āĻšāĻā§āĻā§ āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒāĻā§ âāĻŦā§āĻĻā§āϧāĻŋāĻŽāĻžāύâ āĻŦāĻžāύāĻžāύā§āϰ āĻāĻĒāĻžā§āĨ¤ āϝā§āĻāĻž āĻŦāϞā§ââāĻāĻŽāĻŋ āϏāĻŦ āĻāĻžāύāĻŋ āύāĻž, āĻāĻŋāύā§āϤ⧠āϝā§āĻā§āĻā§ āĻĻāϰāĻāĻžāϰ, āĻāĻā§āĻā§āĻ āĻļāĻŋāĻāĻŋ, āϤāĻžāĻ āϏāĻŽā§āĻŽāϤā§āĨ¤â đ