July 16, 2023
개발 역량 향상과 지식 쌓기
2023.5.22 - 2023.6.30 10일에 한 챕터씩 읽고, 관련 내용 의견 나누기
최적화 기법
분석 툴
FCP(First Contentful Paint)
SI(Speed Index)
LCP(Largest Contentful Paint)
TTI(Time to Interactive)
TBT(Total Blocking Time)
CLS(Cumulative Layout Shift)
그외 하단 Opportunities, Diagnostics 섹션
import React, { Suspense, lazy } from 'react'
import { Switch, Route } from 'react-router-dom'
import './App.css'
// import ListPage from './pages/ListPage/index'
// import ViewPage from './pages/ViewPage/index'
const ListPage = lazy(() => import('./pages/ListPage/index'))
const ViewPage = lazy(() => import('./pages/ViewPage/index'))
function App() {
return (
<div className="App">
<Suspense fallback={<div>로딩중...</div>}>
<Switch>
<Route path="/" component={ListPage} exact />
<Route path="/view/:id" component={ViewPage} exact />
</Switch>
</Suspense>
</div>
)
}
export default App
Gzip
, Deflate
두 가지 방식이 있음.화면이 끊기는 현상
브라우저에서 애니메이션의 동작원리
, 브라우저 렌더링 과정
에 대해 알아야 한다.DOM + CSSOM
렌더 트리
레이아웃
페인트
컴포지트
리플로우와 리페인트
리플로우와 리페인트를 발생시키는 속성이 있음
해결방법 (2가지)
const img = new Image()
img.src = '{이미지 주소}'
// 생략...
useEffect(() => {
// 이미지 사전로딩
}, [])
lodash throttle과 같은 방식으로 처리할 수 있긴함
Intersection Observer
은 브라우저 제공 API
// 간단 사용법
const optinos = {
root: null, // 뷰표트 요소, 기본값 null, 브라우저 뷰포트
rootMargin: '0px', // root 요소의 여백
threshold: 1.0, // 가시성 퍼센티지 (1.0은 대상 모두가 보일때)
}
const callback = (entries, observer) => {
console.log('Entries', entries)
// 가시성이 변한 요소를 배열로 받음
}s
const observer = new IntersectionObserver(callback, options)
observer.observe(document.querySelector('#target-elemnt1'))
observer.observe(document.querySelector('#target-elemnt2'))