lazy γ‚’δ½Ώγ†γ“γ¨γ§γ€γ‚γ‚‹γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒεˆγ‚γ¦γƒ¬γƒ³γƒ€γƒΌγ•γ‚Œγ‚‹γΎγ§γ€γοΏ½?コード�?θͺ­γΏθΎΌγΏγ‚’ι…ε»Άγ•γ›γ‚‹γ“γ¨γŒγ§γγΎγ™γ€‚

const SomeComponent = lazy(load)

γƒͺフゑレンス

lazy(load)

lazy γ‚’γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?倖部で呼び出し、遅廢θͺ­γΏθΎΌγΏγ•γ‚Œγ‚‹ React γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’οΏ½?�言します。

import { lazy } from 'react';

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

さらに例を見る

εΌ•ζ•°

  • load: Promise または thenable(then γƒ‘γ‚½γƒƒγƒ‰γ‚’ζŒγ€ Promise οΏ½?γ‚ˆγ†γͺγ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆοΌ‰γ‚’θΏ”γ™ι–’ζ•°γ€‚θΏ”γ•γ‚ŒγŸγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’εˆγ‚γ¦γƒ¬γƒ³γƒ€γƒΌγ—γ‚ˆγ†γ¨γ™γ‚‹γ¨γγΎγ§ React は load を呼び出しません。React γŒεˆγ‚γ¦ load γ‚’ε‘Όγ³ε‡Ίγ—γŸεΎŒγ€γγ‚ŒγŒθ§£ζ±Ί (resolve) する�?γ‚’εΎ…γ‘γ€θ§£ζ±Ίγ—γŸε€€οΏ½? .default γ‚’ React γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ¨γ—γ¦γƒ¬γƒ³γƒ€γƒΌγ—γΎγ™γ€‚θΏ”γ•γ‚ŒγŸ Promise と解決済み�?倀は丑方ともキャッシγƒ₯γ•γ‚Œγ‚‹γŸγ‚γ€React は load γ‚’ 2 εΊ¦δ»₯δΈŠε‘Όγ³ε‡Ίγ—γΎγ›γ‚“γ€‚Promise が reject γ•γ‚ŒγŸε ΄εˆγ€React はそ�?理由を throw γ—γ€ζœ€γ‚‚θΏ‘γ„γ‚¨γƒ©γƒΌγƒγ‚¦γƒ³γƒ€γƒͺγ§ε‡¦η†γ§γγ‚‹γ‚ˆγ†γ«γ—γΎγ™γ€‚

θΏ”γ‚Šε€€

lazy は、ツγƒͺー内でレンダーできる React γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’θΏ”γ—γΎγ™γ€‚ι…ε»Άγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?γ‚³γƒΌγƒ‰γŒγΎγ θͺ­γΏθΎΌγΎγ‚Œγ¦γ„γͺγ„ι–“γ€γƒ¬γƒ³γƒ€γƒΌγ—γ‚ˆγ†γ¨γ™γ‚‹γ¨γ‚΅γ‚Ήγƒšγƒ³γƒ‰ (suspend) します。<Suspense> を使用して、θͺ­γΏθΎΌγΏδΈ­γ«γƒ­γƒΌγƒ‡γ‚£γƒ³γ‚°γ‚€γƒ³γ‚Έγ‚±γƒΌγ‚Ώγ‚’葨瀺します。


load ι–’ζ•°

εΌ•ζ•°

load γ―εΌ•ζ•°γ‚’ε—γ‘ε–γ‚ŠγΎγ›γ‚“γ€‚

θΏ”γ‚Šε€€

Promise γΎγŸγ―δ½•γ‚‰γ‹οΏ½? thenable(then γƒ‘γ‚½γƒƒγƒ‰γ‚’ζŒγ€ Promise οΏ½?γ‚ˆγ†γͺγ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆοΌ‰γ‚’θΏ”γ™εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚ζœ€η΅‚ηš„γ«γ€ζœ‰εŠΉγͺ React γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆεž‹γ€γ€γΎγ‚ŠδΎ‹γˆγ°ι–’ζ•°γ€memoγ€γΎγŸγ― forwardRef γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?γ‚ˆγ†γͺγ‚‚οΏ½?γ‚’ .default γƒ—γƒ­γƒ‘γƒ†γ‚£γ¨γ—γ¦ζŒγ€γ‚ͺγƒ–γ‚Έγ‚§γ‚―γƒˆγ«θ§£ζ±Ίγ•γ‚Œγ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚


使用法

γ‚΅γ‚Ήγƒšγƒ³γ‚Ήγ‚’δ½Ώγ£γŸγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?遅廢θͺ­γΏθΎΌγΏ

ι€šεΈΈγ€γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ―ι™ηš„γͺ import οΏ½?οΏ½θ¨€γ‚’δ½Ώγ£γ¦γ‚€γƒ³γƒγƒΌγƒˆγ—γΎγ™γ€‚

import MarkdownPreview from './MarkdownPreview.js';

こ�?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?コード�?θͺ­γΏθΎΌγΏγ‚’γ€εˆγ‚γ¦γƒ¬γƒ³γƒ€γƒΌγ•γ‚Œγ‚‹γ¨γγΎγ§ι…ε»Άγ•γ›γ‚‹γ«γ―、こ�?γ‚€γƒ³γƒγƒΌγƒˆγ‚’δ»₯δΈ‹οΏ½?γ‚ˆγ†γ«οΏ½?γζ›γˆγΎγ™γ€‚

import { lazy } from 'react';

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

こ�?γ‚³γƒΌγƒ‰γ―γƒ€γ‚€γƒŠγƒŸγƒƒγ‚― import() γ‚’η”¨γ„γ¦γŠγ‚Šγ€γ‚γͺた�?バンドラやフレームワークから�?γ‚΅γƒγƒΌγƒˆγŒεΏ…θ¦γ‹γ‚‚γ—γ‚ŒγΎγ›γ‚“γ€‚γ“οΏ½?γƒ‘γ‚ΏγƒΌγƒ³γ‚’η”¨γ„γ‚‹ε ΄εˆγ―γ€ι…ε»Άγ‚€γƒ³γƒγƒΌγƒˆγ—γ‚ˆγ†γ¨γ—γ¦γ„γ‚‹γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγŒ default γ§γ‚¨γ‚―γ‚ΉγƒγƒΌγƒˆγ•γ‚Œγ¦γ„γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚

γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?γ‚³γƒΌγƒ‰γŒγ‚ͺγƒ³γƒ‡γƒžγƒ³γƒ‰γ§θͺ­γΏθΎΌγΎγ‚Œγ‚‹γ‚ˆγ†γ«γͺった�?で、θͺ­γΏθΎΌγΏοΏ½?ζœ€δΈ­γ«γ―δ½•γ‚’θ‘¨η€Ίγ™γ‚‹γΉγγ‹γ‚’ζŒ‡οΏ½?οΏ½γ™γ‚‹εΏ…θ¦γŒγ‚γ‚ŠγΎγ™γ€‚γ“γ‚Œγ―γ€ι…ε»Άγ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγΎγŸγ―γοΏ½?θ¦ͺοΏ½?γ„γšγ‚Œγ‹γ‚’ <Suspense> バウンダγƒͺγ§γƒ©γƒƒγƒ—γ™γ‚‹γ“γ¨γ§θ‘Œγ†γ“γ¨γŒγ§γγΎγ™γ€‚

<Suspense fallback={<Loading />}>
<h2>Preview</h2>
<MarkdownPreview />
</Suspense>

こ�?例では、MarkdownPreview οΏ½?γ‚³γƒΌγƒ‰γ―γƒ¬γƒ³γƒ€γƒΌγ—γ‚ˆγ†γ¨γ™γ‚‹γΎγ§θͺ­γΏθΎΌγΎγ‚ŒγΎγ›γ‚“。もし MarkdownPreview がまだθͺ­γΏθΎΌγΎγ‚Œγ¦γ„γͺγ„ε ΄εˆγ€γοΏ½?δ»£γ‚γ‚Šγ« Loading γŒθ‘¨η€Ίγ•γ‚ŒγΎγ™γ€‚γƒγ‚§γƒƒγ‚―γƒœγƒƒγ‚―γ‚Ήγ‚’γ‚ͺンにしてみてください。

import { useState, Suspense, lazy } from 'react';
import Loading from './Loading.js';

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

export default function MarkdownEditor() {
  const [showPreview, setShowPreview] = useState(false);
  const [markdown, setMarkdown] = useState('Hello, **world**!');
  return (
    <>
      <textarea value={markdown} onChange={e => setMarkdown(e.target.value)} />
      <label>
        <input type="checkbox" checked={showPreview} onChange={e => setShowPreview(e.target.checked)} />
        Show preview
      </label>
      <hr />
      {showPreview && (
        <Suspense fallback={<Loading />}>
          <h2>Preview</h2>
          <MarkdownPreview markdown={markdown} />
        </Suspense>
      )}
    </>
  );
}

// Add a fixed delay so you can see the loading state
function delayForDemo(promise) {
  return new Promise(resolve => {
    setTimeout(resolve, 2000);
  }).then(() => promise);
}

こ�?γƒ‡γƒ’γ―δΊΊη‚Ίηš„γ«ι…ε»Άγ•γ›γ¦θͺ­γΏθΎΌγΎγ‚ŒγΎγ™γ€‚γ‚‚γ†δΈ€εΊ¦γƒγ‚§γƒƒγ‚―γƒœγƒƒγ‚―γ‚Ήγ‚’γ‚ͺフにしてからγ‚ͺンにすると、Preview はキャッシγƒ₯γ•γ‚Œγ¦γ„γ‚‹οΏ½?γ§γ€γƒ­γƒΌγƒ‡γ‚£γƒ³γ‚°ηŠΆζ…‹γ―θ‘¨η€Ίγ•γ‚ŒγΎγ›γ‚“γ€‚ε†εΊ¦γƒ­γƒΌγƒ‡γ‚£γƒ³γ‚°ηŠΆζ…‹γ‚’θ‘¨η€Ίγ™γ‚‹γ«γ―γ€γ‚΅γƒ³γƒ‰γƒœγƒƒγ‚―γ‚ΉοΏ½? β€œReset” γ‚’γ‚―γƒͺックしてください。

γ‚΅γ‚Ήγƒšγƒ³γ‚Ήγ‚’δ½Ώγ£γŸγƒ­γƒΌγƒ‡γ‚£γƒ³γ‚°ηŠΆζ…‹οΏ½?οΏ½?�理に぀いてもっと学ぢ


γƒˆγƒ©γƒ–γƒ«γ‚·γƒ₯ーティング

lazy γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½? state γŒδΊˆζœŸγ›γšγƒͺγ‚»γƒƒγƒˆγ•γ‚Œγ‚‹

lazy γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆγ‚’δ»–οΏ½?γ‚³γƒ³γƒγƒΌγƒγƒ³γƒˆοΏ½?内部で�?�言しγͺいでください。

import { lazy } from 'react';

function Editor() {
// πŸ”΄ Bad: This will cause all state to be reset on re-renders
const MarkdownPreview = lazy(() => import('./MarkdownPreview.js'));
// ...
}

δ»£γ‚γ‚Šγ«γ€εΈΈγ«γƒ’γ‚Έγƒ₯ール�?γƒˆγƒƒγƒ—γƒ¬γƒ™γƒ«γ§οΏ½?�言してください。

import { lazy } from 'react';

// βœ… Good: Declare lazy components outside of your components
const MarkdownPreview = lazy(() => import('./MarkdownPreview.js'));

function Editor() {
// ...
}