Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 프론트엔드
- sort
- Node js
- MUI
- 백준
- 배열
- react js
- 코드스테이츠 메인프로젝트
- primitive type
- 자료구조
- kakao map api
- input class
- JavaScript Deep Dive
- 유데미
- CSS
- 버블정렬
- javascript
- 재귀함수
- 자바스크립트
- OSI 7계층
- nodejs
- next/Image
- 코딩테스트
- 정규표현식
- 이벤트 루프
- 페이지네이션
- 백준 nodeJS
- 알고리즘
- Native select
- 코드스테이츠
Archives
- Today
- Total
신입 개발자에서 시니어 개발자가 되기까지
[section4] 웹사이트 최적화(코드 분할, lazy import) 본문
1. 코드 분할을 하는 이유
-번들링을 하면 하나의 js파일에 모든 코드가 들어가는데 코드 양이 많아짐에따라 코드를 해석하고 실행하는 속도가 느려졌다.
-그래서 코드를 분할하면 코드 실행이 느려지는 지점을 파악하고, 지금 당장 필요한 코드가 아니라면 나중에 불러오도록 해서 로딩 속도를 줄일 수 있다.
2. 번들을 줄이는 법
2-1. Third Party 라이브러리 최소화.
import _ from'lodash';
_.find([]);
이렇게 라이브러리 전체를 가져와서 사용하는 것 보다, 처음부터 라이브러리 중 필요한 부분만을 가져와야 한다.
import find from 'lodash/find';
find([]);
2-2. Dynamic Import
기존에는 Static Import를 사용했다. Static Import는 모듈을 import 할 때, 항상 문서의 상위에 위치하고, 블록문 안에서는 사용하지 못하는 방식이다.
import moduleA from "library";
form.addEventListener("submit", e => {
e.preventDefault();
someFunction();
});
const someFunction = () => {
/* 여기서 moduleA 사용, 이게 static import*/
}
---------------------
form.addEventListener("submit", e => {
e.preventDefault();
/* 동적 불러오기는 이런 식으로 코드의 중간에 불러올 수 있게 됩니다. */
import('library.moduleA')
.then(module => module.default)
.then(someFunction())
.catch(handleError());
//then 함수 내부에서 필요한 코드만 가져온다.
});
const someFunction = () => {
/* moduleA를 여기서 사용 , dynamic import */
}
이렇게 동적으로 모듈을 가져옴으로써 submit 이벤트가 발생했을 때만 모듈을 불러온다.
3. React.lazy()
3-1. 개념
-컴포넌트에 dynamic import를 적용하는 메서드. react는 SPA이므로 초기 로딩에 모든 컴포넌트를 다 불러오기 때문에 로딩 속도가 지연된다. 하지만 당장 사용하지 않는 컴포넌트를 동적으로 불러온다면, 초기 로딩속도를 개선할 수 있다.
3-2 구현
const Home = lazy(() => import("./Home"));
const CreateBlog = lazy(() => import("./blogComponent/CreateBlog"));
const BlogDetails = lazy(() => import("./blogComponent/BlogDetail"));
return (
<BrowserRouter>
{error && <div>{error}</div>}
<div className="app">
<Navbar />
<Suspense fallback={<div>Loading...</div>}>
<div className="content">
<Routes>
<Route exact path="/" element={<Home />} />
<Route path="/create" element={<CreateBlog />} />
<Route path="/blogs/:id" element={<BlogDetails />} />
<Route path="/blogs/:id" element={<NotFound />} />
</Routes>
</div>
</Suspense>
<Footer />
</div>
</BrowserRouter>
);
lazy로 컴포넌트를 import 하면 해당 경로로 이동했을 때 컴포넌트를 불러오는데, 컴포넌트를 로딩하는 동안 Suspense 컴포넌트가 로딩 화면을 보여주는 역할을 한다. lazy로 불러온 컴포넌트를 wrapping하면 된다.
로딩화면은 fallback에 입력한 코드를 렌더링 한다.
'코드스테이츠 > section4' 카테고리의 다른 글
[section4] GraphQL (0) | 2022.12.09 |
---|---|
[section4] 웹사이트 최적화하기 (0) | 2022.12.05 |
React Virtual DOM (0) | 2022.11.28 |
[Section4] Webpack 번들링, 배포(feat. css, image loader) (0) | 2022.11.24 |