lazy
lazy는 실험 기능이므로 이 인터페이스는 변경될 수 있습니다.
lazy 함수는 React의 lazy 함수를 래핑하여 컴포넌트 로딩 성공과 실패에 대한 콜백을 제공합니다. 컴포넌트가 성공적으로 로드되거나 실패할 때 사용자 정의 로직을 실행할 수 있어 더 나은 사용자 경험과 디버깅을 제공합니다.
컴포넌트 사전 로딩
기본적으로 lazy는 React의 lazy와 동일하게 작동하지만, 추가적인 load 메서드를 제공합니다.
import { lazy, Suspense } from '@suspensive/react'
const Component = lazy(() => import('./Component'))
function PreloadExample() {
return (
<div>
<button onClick={() => Component.load()}>컴포넌트 사전 로딩</button>
<Suspense fallback={<div>로딩 중...</div>}>
<Component />
</Suspense>
</div>
)
}성공/실패 콜백 사용
import { lazy, Suspense, ErrorBoundary } from '@suspensive/react'
const UserProfile = lazy(() => import('./UserProfile'), {
onSuccess: () => console.log('컴포넌트가 성공적으로 로드되었습니다'),
onError: ({ error }) => console.error('로딩 실패:', error),
})
function App() {
return (
<ErrorBoundary fallback={<div>문제가 발생했습니다</div>}>
<Suspense fallback={<div>로딩 중...</div>}>
<UserProfile />
</Suspense>
</ErrorBoundary>
)
}createLazy
커스텀 기본 옵션이 있는 lazy 함수를 생성합니다.
import { createLazy } from '@suspensive/react'
const lazy = createLazy({
onSuccess: () => console.log('컴포넌트가 성공적으로 로드되었습니다'),
onError: ({ error }) => console.error('컴포넌트 로딩 실패:', error),
})
const Component = lazy(() => import('./Component'))콜백 실행 순서
- onSuccess: 개별 콜백 → 기본 콜백
- onError: 개별 콜백 → 기본 콜백
import { createLazy } from '@suspensive/react'
const lazy = createLazy({
onSuccess: () => console.log('2. 기본 onSuccess'),
onError: ({ error }) => console.log('2. 기본 onError:', error),
})
const Component = lazy(() => import('./Component'), {
onSuccess: () => console.log('1. 개별 onSuccess'),
onError: ({ error }) => console.log('1. 개별 onError:', error),
})
// 컴포넌트 로드 성공 시 실행 순서:
// 1. 개별 onSuccess
// 2. 기본 onSuccess
// 컴포넌트 로드 실패 시 실행 순서:
// 1. 개별 onError
// 2. 기본 onErrorreloadOnError
reloadOnError 옵션을 사용하면 컴포넌트 로딩이 실패할 때 자동으로 페이지를 새로고침할 수 있습니다. 이는 특히 배포 환경에서 버전 차이(version skew) 문제를 처리하는 데 유용합니다.
배경: 버전 차이 문제를 해결하는 가장 좋은 방법은 인프라 레벨에서 처리하는 것입니다 (예: 적절한 배포 전략, CDN 캐시 무효화). 하지만 이러한 방법이 불가능하거나 실용적이지 않은 경우가 있습니다. reloadOnError는 이러한 상황을 위한 클라이언트 사이드 대안 솔루션입니다.
버전 차이(version skew) 문제 해결
import { lazy, reloadOnError } from '@suspensive/react'
const MAX_RELOADS = 3
const VersionSkewSafeComponent = lazy(
() => import('./VersionSkewSafeComponent'),
reloadOnError({
retry: MAX_RELOADS,
retryDelay: 1000,
})
)reloadOnError 없이 구현했다면:
+ import { lazy, reloadOnError } from '@suspensive/react'
- import { createLazy } from '@suspensive/react'
+ const Component = lazy(() => import('./Component'), reloadOnError({
+ retry: 3,
+ retryDelay: 1000,
+ }))
- const Component = lazy(() => import('./Component'), {
- onError: ({ error, load }) => {
- const reloadKey = 'component_reload_count'
- const currentCount = parseInt(sessionStorage.getItem(reloadKey) || '0')
- const maxRetries = 3
-
- if (currentCount < maxRetries && error.message?.includes('Loading chunk')) {
- const newCount = currentCount + 1
- sessionStorage.setItem(reloadKey, newCount.toString())
-
- setTimeout(() => {
- window.location.reload()
- }, 1000)
- }
- },
- onSuccess: ({ load }) => {
- // 성공 시 재시도 횟수 초기화
- sessionStorage.removeItem('component_reload_count')
- },
- })
const Component = lazy(() => import('./Component'))사용자 정의 스토리지 및 새로고침 함수
import { createLazy, reloadOnError } from '@suspensive/react'
const customStorage = {
getItem: (key) => localStorage.getItem(key),
setItem: (key, value) => localStorage.setItem(key, value),
removeItem: (key) => localStorage.removeItem(key),
}
const customReload = () => {
// 사용자 정의 새로고침 로직
window.location.href = window.location.href
}
const lazy = createLazy(
reloadOnError({
retry: 5,
retryDelay: 2000,
storage: customStorage,
reload: customReload,
})
)
const Component = lazy(() => import('./Component'))수정된 날짜: