lazy
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() {
// ...
}