개발자

리액트 lazy와 Suspense질문있습니다.

2024년 08월 26일조회 67

Spa를 만들면서 lazy와 suspense로 로딩처리하는것을 너무 남발하는거같단 생각이 들었습니다. 하나의 잘못된 예시로는.. 모든 라우트경로를 lazy로 처리해주고 전체 라우트를 suspense로 감싸고 로딩처리를 해주는경우인거같은데요.. 아래 코드는 실제로 제가 적용한 코드입니다. 이렇게 하니까 새로고침하면 로딩컴포넌트가 잠깐 반짝하고 사라지는데.. 아무래도 반짝하고 사라지면 사용자 경험측면에서 문제가 될거같단 생각이 들었습니다. 최초 페이지 이동시에도 순식간에 로딩이 떳다 사라지긴하지만 이건 그러려니 하고있습니다. 혹시 다른분들은 어떤식으로 사용중이신가요? useTransition라는 선택지가 있기는하지만 이거는 지금 제 상황과는 맞지않다는 생각입니다. (페이지네이션같은곳에 적용하면 좋을거같단 생각중..) lazy처리해주기에는 라우터 페이지 수가 적으니 걷어내는것도 정답이긴 하겠지만 lazy를 한번 꼭 적용시키고싶습니다. 아니면 메인페이지인 Homepage만 lazy를 걷어낼까요?

1import React, { Suspense, lazy } from 'react';
2import { Route, Routes } from 'react-router-dom';
3
4import Loading from './common/loading';
5
6const HomePage = lazy(() => import('../pages/home/home'));
7const ProfilePage = lazy(() => import('../pages/profile/profile'));
8const ProjectPage = lazy(() => import('../pages/project/project'));
9const ProjectsPage = lazy(() => import('../pages/projects/projects'));
10const IntroDetailPage = lazy(
11  () => import('../pages/intro-detail/intro-detail')
12);
13
14const Router = () => {
15  return (
16    <Suspense fallback={<Loading />}>
17      <Routes>
18        <Route path='/' element={<HomePage />} />
19        <Route path='/intro' element={<IntroDetailPage />} />
20        <Route path='/profile' element={<ProfilePage />} />
21        <Route path='/projects' element={<ProjectsPage />} />
22        <Route path='/project' element={<ProjectPage />} />
23      </Routes>
24    </Suspense>
25  );
26};
27
28export default Router;
이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 1

상현님의 프로필 사진

suspense를 쓰는 목적을 떠올려봤을 때 앱 자체에 fallback을 걸어두는 것이 올바른 UI의 제공 방식이 맞는가... 를 생각해보시면 좋을 것 같네요. lazy를 꼭 적용시키겠다와 앱에 블루 스크린을 걸어두겠다는 같은 의미가 아닐 겁니다.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2024년 08월 26일

리액트의 Lazy와 Suspense는 코드 분할과 비동기 로드를 쉽게 구현하기 위한 기능입니다. 이를 사용하면 시점에 따라 필요한 컴포넌트만 로드하여 사용자 경험을 향상시킬 수 있습니다. 하지만 말씀하신 것처럼 과도하게 사용한다면, 모든 페이지가 로딩되는 동안 대기 화면이 반짝이는 등의 부정적인 효과를 가져올 수 있습니다. 또한, 네트워크 요청이 많아진다면 성능 저하의 원인이 될 수도 있습니다. 그래서 공식 문서에서는 Route-based code splitting을 추천합니다. 즉, 각 라우트 별로 필요한 컴포넌트만 비동기적으로 로드하는 것입니다. 이렇게 하면 초기 페이지 로딩 속도가 크게 향상되고, 다른 페이지로 이동할 때에만 해당 페이지의 컴포넌트를 로드하기 때문에 사용자 경험이 좋아집니다. 즉, 모든 라우트에서 lazy loading을 사용하는 것보다는 필요한 부분에서만 사용하는 것이 옳습니다. 그리고 메인페이지 같은 경우엔 사용자가 가장 먼저 보게 되는 페이지이므로, lazy loading 대신 preload를 고려해볼 수 있습니다. 이렇게 하면 앱의 초기 로딩 시간이 줄어들어 사용자 경험이 향상됩니다. 또한, Suspense를 활용하여 로딩 상태를 더 세밀하게 제어할 수도 있습니다. 예를 들면, 네트워크 속도가 느린 경우에만 로딩 화면을 보여주는 것입니다. 이런 방식으로 사용자 경험을 더욱 향상시킬 수 있습니다. 최적의 해결책은 프로젝트의 특성과 사용자 요구에 따라 달라질 수 있기 때문에, 여러 방법을 시도해보고 가장 적합한 방법을 선택하는 것이 중요합니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!