๐ŸŽ‰ Suspensive v2๊ฐ€ ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค! ๋”๋ณด๊ธฐ โ†’
๋ฌธ์„œ๋ณด๊ธฐ
@suspensive/react
<Suspense/>

Suspense

@suspensive/react์˜ <Suspense/>๋Š” React์˜ Suspense (opens in a new tab)๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

props.fallback

fallback์€ react์˜ Suspense์˜ fallback์™€ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

import { Suspense } from '@suspensive/react'
 
const Example = () => (
  <Suspense fallback={<Loading />}>
    <Children />
  </Suspense>
)
๐Ÿ’ก

Default fallback

<Suspense/>๋Š” <SuspensiveProvider/>์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ๋”์šฑ ๊ฐ•๋ ฅํ•ด์ง‘๋‹ˆ๋‹ค. <SuspensiveProvider/>๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ <Suspense/>์˜ default fallback๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ <SuspensiveProvider/> ํŽ˜์ด์ง€์— ์†Œ๊ฐœ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์„ ํ”ผํ•˜๊ธฐ (clientOnly)

clientOnly prop์„ ์‚ฌ์šฉํ•˜๋ฉด <Suspense/>๋Š” ์„œ๋ฒ„์—์„œ๋Š” fallback์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. mount ํ›„(ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š”) children์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. mount๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ๋งŒ ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import { Suspense } from '@suspensive/react'
 
const Example = () => (
  <Suspense clientOnly fallback={<Loading />}>
    <Children />
  </Suspense>
)

SSR์„ ์ง€์›ํ•˜๋„๋ก ์ ์ง„์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ (<Suspense clientOnly/> -> <Suspense/>)

React.Suspense๋ฅผ SSR๊ณผ CSR์—์„œ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด <Suspense clientOnly/>์—์„œ <Suspense/>๋กœ ์ ์ง„์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋ฉด ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

withSuspense

๐Ÿšซ

deprecated: wrap.Suspense().on์„ ์‚ฌ์šฉํ•˜์„ธ์š”

withSuspense๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ <Suspense/>๋กœ ์‰ฝ๊ฒŒ ๋ž˜ํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด withSuspense๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฅผ ๊ฐ์‹ธ๊ธฐ ์œ„ํ•ด ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. withSuspense์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” children์ด ์—†๋Š” <Suspense/>์˜ props์ž…๋‹ˆ๋‹ค.

import { withSuspense } from '@suspensive/react'
 
const Example = withSuspense(
  function Component() {
    // code make suspending
 
    return <>...</>
  },
  { fallback: <Spinner /> }
)