프런트엔드 성과 지표에 대해 이야기하기

저자: Jingdong Technology Hao Liang

머리말: C-end 프론트엔드 연구 개발로서 사업상의 어려움을 극복하는 것 외에도 더 깊은 자기 목표, 즉 성능 최적화가 있어야 합니다. 이 문제는 크지도 작지도 않지만 난이도는 확실히 보통이 아니며 관련된 최적화 범위는 각 셀의 심층 엔지니어링입니다. 프론트엔드 성능 최적화에서 좋은 일을 하는 것은 결코 쉬운 일이 아닙니다! 기사의 주요 내용은 프런트 엔드 성능 평가 지표 및 최적화 체계를 소개합니다.

 

1. 프런트 엔드 성능 지표는 무엇입니까?

chrome Lighthouse의 최신 규칙에 따르면 프런트 엔드 성능 지표에는 주로 FCP(First Contenful Paint), SI(Speed ​​Index), LCP(Largest Contentful Paint), TBT(Total Blocking Time), CLS(Cumulative Layout)가 포함됩니다. Shift) 비율은 다음과 같습니다.



 

2. FCP란 무엇입니까?

FCP: First Contentful Paint 첫 번째 콘텐츠 그리기는 페이지 로딩 시작부터 페이지 콘텐츠의 일부(텍스트, 그림, 배경 이미지, svg 요소 또는 흰색이 아닌 캔버스 요소), 중요한 지표 중 하나인 로딩 속도 인식의 척도입니다.

예:



위의 그림에서 페이지 로딩 시작부터 페이지 렌더링 완료까지의 타임라인에서 두 번째 프레임에서 FCP가 발생하고 첫 번째 텍스트 및 이미지 배치가 화면에 렌더링되었음을 알 수 있습니다.

페이지 콘텐츠의 일부가 렌더링되었지만 페이지의 모든 콘텐츠가 렌더링된 것은 아닙니다. 이것이 FCP(First Content Paint)와 LCP(Largest Content Paint)의 가장 중요한 차이점입니다.

FCP 성능 값: 첫 번째 콘텐츠 드로잉의 렌더링 시간은 1.8초 이내로 제어되어야 합니다.

다음 방향에서 FCP를 최적화할 수 있습니다.

렌더링 차단 리소스 제거:
<script> 태그: <head> 태그 내에 있으며 defer/async 속성이 없습니다.
<link rel="stylesheet"> 태그: 비활성화된 속성 없음, media="all" 속성은 렌더링 차단으로 간주됨
CSS 크기 축소: 작성 방식, CSS 압축
사용하지 않는 CSS 제거
원하는 소스에 사전 연결: <link rel="preconnect">
서버 응답 시간 단축(TTFB)
다중 페이지 리디렉션 방지: 브라우저가 이미 지정된 리소스를 요청하면 서버는 HTTP 응답을 반환하고 브라우저는 리소스를 검색하기 위해 새 위치에서 또 다른 HTTP 요청을 발행해야 합니다. 이 추가 네트워크 전송으로 인해 리소스 로드가 수백 밀리초 지연될 수 있습니다.
키 요청 미리 로드: <link rel="preload" href="styles,css" as="style" />
막대한 네트워크 부하 방지: 네트워크 부하 중앙값은 1700~1900KiB입니다. Lighthouse는 총 네트워크 요청이 5000KiB를 초과하는 페이지에 플래그를 지정합니다. 총 바이트 크기를 1600KiB 미만으로 유지하십시오.
네트워크 페이로드 축소 및 압축: 축소(코드), 데이터 압축(Gzip, Brotli)
◦ 이미지는 Webp를 사용합니다.
JPEG 이미지 압축 수준이 85로 설정됨
정적 리소스에 대해 효율적인 캐싱 전략 사용: 캐시 가능한 리소스
글꼴, 이미지, 미디어 파일, 스크립트 또는 스타일 시트
◦ 리소스 에는 200, 203, 206 HTTP 상태 코드가 있습니다.
리소스에 명시적인 캐시 없음 정책이 없습니다.
큰 DOM 크기를 피하십시오.
◦ 네트워크 효율성 및 부하 성능 저하를 유발할 수 있음
페이지가 대화형이면 노드의 위치와 스타일이 다시 계산되어 렌더링 속도가 느려집니다.
많은 수의 노드에 대한 참조가 자신도 모르게 저장되어 과도한 메모리가 발생할 수 있음
중요한 요청 깊이 최소화: 체인 길이가 길수록 다운로드가 커지고 페이지 로드 성능에 미치는 영향이 커집니다.
중요한 리소스의 수를 줄입니다(삭제, 다운로드 연기, 비동기 표시 등).
키 바이트를 최적화하여 다운로드 시간 단축
나머지 주요 리소스의 로딩 순서를 최적화하고 가능한 한 빨리 모든 주요 리소스를 다운로드하고 키 경로의 길이를 줄입니다.
웹 글꼴 로드 중에 텍스트가 계속 표시되는지 확인: 웹 글꼴 미리 로드
요청 수를 적게 유지하고 전송 크기를 작게 유지: CSS 및 JavaScript, 이미지, 글꼴, 파일, 미디어



3. 속도 지수란?

SI: 속도 지수는 페이지 로드 중에 콘텐츠가 시각적으로 표시되는 속도를 측정합니다. Lighthouse는 먼저 브라우저에서 페이지 로딩의 비디오를 캡처하고 프레임 사이의 시각 속도를 계산합니다. 평신도의 용어로, 콘텐츠를 완전히 표시하는 것부터 웹 페이지가 눈에 띄게 채워지는 속도입니다.

속도 지수 지표 값:



다음 방향에서 Speed ​​Index 방법을 최적화 할 수 있습니다.

메인 스레드 작업 감소
JavaScript 실행 시간 단축
웹폰트 로드 중에 텍스트가 계속 표시되도록 합니다.



4. LCP란? (중요성)

LCP: Largest Contentful Paint 가장 큰(가장 의미 있는) 콘텐츠 페인팅은 페이지가 처음 로드되기 시작한 시점을 기준으로 가시 영역에 보이는 가장 큰 이미지 또는 텍스트 블록이 보고되는 상대적인 시간을 의미합니다.





 

LCP 지표 값:

LCP <= 2.5초 통과
2.5s < LCP <= 4s는 최적화 필요
LCP > 4초 품질 저하



1. LCP가 고려하는 요소는 무엇입니까?

다음 관련 요소가 주로 고려됩니다.

<img> 요소
<svg> 요소 내에 중첩된 <image> 요소
동영상 요소(표지 이미지 사용)
url() 함수를 통해 로드된 배경 이미지가 있는 요소
텍스트 또는 기타 인라인 요소 텍스트가 있는 블록 수준 요소

2. LCP 요소 크기는 어떻게 정의됩니까?

가장 큰 콘텐츠 도면(LCP)의 요소 크기는 가시 영역에서 사용자에게 보이는 크기를 말하므로, 요소가 가시 영역을 넘어 확장되거나 요소가 잘리거나 포함되는 경우 가시 영역을 기준으로 고려됩니다. 보이지 않는 오버플로, 이러한 부분은 요소 크기에 포함되지 않습니다.

이미지 요소의 크기에 대해 표시기는 보이는 크기와 원래 크기를 비교하고 더 작은 크기를 취합니다. 영상;

텍스트 요소의 경우 요소의 크기는 텍스트 노드(모든 텍스트 노드를 포함하는 가장 작은 사각형)의 크기입니다.

경고: 모든 요소에 대해 CSS를 통해 설정된 여백, 패딩 또는 테두리는 고려되지 않습니다. 또한 전체화면 배경 이미지를 설정하였으나 화면의 보이는 영역에 상대적으로 큰 비율의 요소(배경 이미지에 떠 있는 요소)가 있어 배경의 가시영역이 작아지는 경우 이미지가 노출되면 가장 큰 콘텐츠가 에서 가시 영역에서 가장 큰 요소를 선택합니다.

또한 요소는 렌더링 후 사용자에게 표시되는 경우에만 가장 큰 콘텐츠 요소로 간주됩니다.

3. LCP 드로잉 시간 보고서

네트워크 또는 기술적인 이유로 인해 웹 페이지는 일반적으로 세그먼트로 로드되므로 가장 큰 요소도 변경됩니다.

이 변경 사항에 대한 응답으로 브라우저는 식별을 위한 첫 번째 프레임을 그린 직후 가장 큰 콘텐츠 페인트 유형 PerformanceEntry(성능 시간 목록의 단일 메트릭 데이터를 나타냄, performance.getEntries()는 시간 목록 데이터를 얻음)를 배포합니다. 최대 콘텐츠 요소. 후속 프레임을 렌더링한 후 브라우저는 가장 큰 콘텐츠 요소가 변경되면 다른 PerformanceEntry를 전달합니다.

페이지의 요소(요소)는 렌더링되어 사용자에게 표시될 때만 가장 큰 콘텐츠 요소로 간주됩니다. 로드되지 않은 이미지는 렌더링된 것으로 간주되지 않으므로 가장 큰 콘텐츠 요소로 간주되지 않습니다. 글꼴 차단 중에 글꼴을 사용하는 텍스트도 마찬가지입니다. 이 경우 더 작은 요소가 가장 큰 요소로 보고되지만 더 큰 요소가 렌더링되면 다른 PerformanceEntry 개체가 보고됩니다.

지연 로드된 이미지 및 글꼴 외에도 새 콘텐츠(인터페이스 요청 등)를 사용할 수 있게 되면 페이지에서 DOM에 새 요소 콘텐츠를 추가할 수 있습니다. 또한 새 요소가 이전의 가장 큰 콘텐츠 요소보다 큰 경우 브라우저는 새 PerformanceEntry 개체를 보고합니다.

현재 가장 큰 콘텐츠 요소가 볼 수 있는 영역에서 제거되거나 DOM에서 제거되는 경우 더 큰 요소가 렌더링을 완료할 때까지 해당 요소는 가장 큰 콘텐츠 요소로 유지되며 performanceEntry 객체는 변경되지 않습니다.

사용자가 페이지와 상호 작용하면(탭, 스크롤 또는 키 누르기) 브라우저는 일반적으로 사용자 상호 작용이 페이지의 원래 콘텐츠를 변경하기 때문에 PerformanceEntry 개체 보고를 즉시 중지합니다.

보안상의 이유로 브라우저는 Timing-Allow-Origin 헤더가 없는 교차 출처 객체에 대한 이미지 렌더링 타임스탬프를 얻을 수 없으며 이미지 로딩 타임스탬프만 얻을 수 있습니다. Timing-Allow-Origin 헤더를 올바르게 설정하면 보다 정확한 지표 값을 얻을 수 있습니다.

4. 요소 레이아웃 및 요소 크기가 변경될 때 LCP에 영향을 미치는 사항

사례 1: 요소의 크기나 위치를 수정해도 새로운 LCP 후보가 생성되지 않고 가시 영역 내 요소의 초기 크기와 위치만 고려됩니다.

사례 2: 처음에 볼 수 있는 영역 내에서 렌더링된 다음 볼 수 있는 영역 외부에서 제거된 요소는 여전히 볼 수 있는 영역 내에서 초기 크기를 보고합니다.

사례 3: 화면의 가시 범위 밖에서 렌더링이 완료되는 동안 화면으로 전환되는 요소는 보고되지 않습니다.

예: 콘텐츠 로드 시 최대 요소 변경





첫 번째 예에서는 새 콘텐츠가 렌더링되어 가장 큰 요소가 변경됩니다.

두 번째 예에서는 이전에 가장 큰 콘텐츠가 레이아웃 변경으로 인해 볼 수 있는 영역에서 제거되었습니다.

지연된 내용이 초기 최대 요소보다 크지 않으면 LCP는 초기 값을 취합니다.

5. 가장 큰 요소는 중요하지 않다

페이지에서 가장 중요한 요소는 가장 큰 요소가 아니라 이때 개발자 평가 지표가 가장 중요한 요소입니다.

6. 주요 컨텐츠의 렌더링 속도 향상, LCP 값 감소

페이지 렌더링 성능에 영향을 미치는 주요 원인은 다음과 같으며 이를 최적화하면 LCP 지표 값을 줄일 수 있습니다.

(1) 서버 응답 속도:

브라우저가 서버에서 콘텐츠를 받는 데 시간이 오래 걸릴수록 사용자가 콘텐츠를 화면에 렌더링하는 데 시간이 더 오래 걸린다는 의미입니다. 더 빠른 서버는 LCP를 포함한 다양한 지표의 부하 값에 직접적인 영향을 미칩니다.

최적화할 수 있는 방향:

서버 성능 최적화
사용자를 가까운 CDN으로 라우팅
캐시 리소스
HTML 페이지를 제공하기 위해 캐시 사용을 우선시합니다.
타사 링크를 조기에 구축
서명된 교환 사용

(2) 렌더링을 차단하는 JS 및 CSS:

브라우저는 콘텐츠를 렌더링하기 전에 DOM 트리를 구문 분석해야 합니다. 구문 분석 프로세스 중에 외부 스타일 시트(<link rel="stylesheet">) 또는 동기 JavaScript 태그(<script src="main.js">)가 있는 경우 발견되면 구문 분석을 일시 중지합니다.

따라서 스크립트와 스타일은 FCP 지연을 유발하는 렌더링 차단 리소스이며, 이로 인해 LCP 지연이 발생합니다. 따라서 필수적이지 않은 JS 및 CSS 로딩을 지연시켜 웹 페이지의 주요 콘텐츠 로딩 속도를 향상시킵니다.

CSS 차단 시간을 줄이는 방법:

CSS 줄이기: CSS에서 공백, 줄 바꿈, 들여쓰기, 주석 및 기타 문자를 제거합니다.
중요하지 않은 CSS 지연 로딩: 초기 렌더링에 필요하지 않은 CSS를 파일로 추출하여 비동기적으로 로딩
인라인 키 CSS: 첫 번째 화면 콘텐츠의 키 CSS를 <head>에 직접 래핑하고 CSS를 인라인합니다. Critters는 키 CSS를 인라인하고 나머지를 지연 로드할 수 있는 웹팩 플러그인입니다.

렌더링 차단 JavaScript의 양을 줄이면 렌더링 속도가 빨라지고 LCP 값이 낮아질 수 있습니다.

JS 차단 시간을 줄이는 방법:

최소화된 자바스크립트 파일 최소화
사용하지 않는 자바스크립트 파일의 레이지 로딩
미사용 폴리필 최소화

(3) 느린 리소스 로딩 속도:

CSS 또는 JavaScript 차단 시간의 증가는 성능 저하에 직접적으로 기여하지만 다른 많은 유형의 리소스를 로드하는 데 걸리는 시간도 페인트 시간에 영향을 미칠 수 있습니다.

LCP에 영향을 미치는 요소는 다음과 같습니다.

<img> 태그
<svg>가 포함된 <image> 태그
<동영상> 요소의 표지 이미지
url() 함수를 통해 로드된 배경 이미지가 있는 요소
텍스트 노드 또는 기타 인라인 수준 텍스트 요소를 포함하는 블록 수준 요소

최적화:

사진 최적화: 사진 압축, webp 형식 사용, CDN에 사진 리소스 업로드, 물론 코드를 사용하여 사진을 사용하지 않도록 할 수 있습니다.
중요한 리소스 미리 로드: <link rel="preload">를 사용하여 다운로드 및 캐싱의 우선 순위를 높입니다.
압축 텍스트 파일: Gzip, Brotli(구글에서 게시)
네트워크 연결 기반의 다양한 자산 제공(적응형 서비스): navigator.connection.effectiveType(유효 연결 유형 4G), navigator.connection.saveData(데이터 세이버 활성화/비활성화), navigator.hardwareConcurrency(CPU 코어 수), navigator . deviceMemory(장치 메모리)
캐시 리소스: 서비스 워커는 작업자 컨텍스트에서 실행되므로 DOM 액세스 권한이 없고 다른 스레드에서 실행되므로 차단되지 않습니다.

(4) 클라이언트 렌더링:

React, Vue 및 Angular와 같은 프레임워크로 구축된 단일 페이지 애플리케이션은 클라이언트에서 로직을 완전히 처리합니다.

최적화:

중요한 JavaScript 최소화: JavaScript 최소화, 미사용 JavaScript 지연 로드, 미사용 polyfill 최소화
서버 측 렌더링 사용: 서버는 먼저 서버에서 기본 콘텐츠를 HTML로 렌더링하고 클라이언트는 모든 JavaScript 및 필수 데이터를 동일한 DOM 콘텐츠로 "수화"합니다.
사전 렌더링 사용: 헤드리스 브라우저를 사용하여 미리 각 경로의 정적 HTML 파일을 스캐폴딩한 다음 해당 파일을 애플리케이션에 필요한 JavaScript 번들과 함께 제공합니다.



5. TBT란 무엇입니까?

TBT: 총 차단 시간 총 차단 시간은 사용자 상호 작용에 대한 응답으로 페이지가 차단된 총 시간입니다. TBT = LCP(첫 번째 최대 콘텐츠 페인트)와 상호 작용 가능한 시간 사이의 모든 장기 실행 작업의 차단 부분 합계. 페이지 로드 응답성을 측정하기 위한 중요한 메트릭입니다.

50밀리초를 초과하는 작업은 긴 작업입니다. 50밀리초를 초과하는 시간이 차단 부분입니다.

예: 90ms 작업 감지, 차단 부분은 40ms(90 - 50 = 40)

TBT 지표:



최적화:

불필요한 JavaScript 로딩, 구문 분석 또는 실행을 줄입니다. JavaScript 로드를 줄이거나, 사용하지 않는 코드를 제거하거나, 타사 JavaScript를 효율적으로 로드하면 TBT 점수를 높일 수 있습니다.
비효율적인 JavaScript 문을 줄입니다. 예: document.querySelectorAll('a')는 일치하는 모든 노드를 반환합니다.



6. CLS란?

CLS: CLS(Cumulative Layout Shift)는 시각적 안정성의 중요한 척도입니다. 페이지 수명 동안 발생하는 모든 예기치 않은 레이아웃 이동 중에서 가장 큰 레이아웃 이동 분수 시퀀스입니다.

페이지 콘텐츠의 예기치 않은 오프셋은 대부분 비동기 리소스 로드 또는 페이지의 기존 콘텐츠 위에 DOM 요소를 동적으로 추가하여 발생합니다. 범인은 알 수 없는 크기의 이미지 또는 비디오, 대체 글꼴보다 실제로 더 크거나 작게 렌더링된 글꼴 등일 수 있습니다.

CLS 지표:



참고: 레이아웃 오프셋은 기존 요소의 시작 위치가 변경된 경우에만 계산됩니다. 새 요소가 DOM에 추가되거나 기존 요소의 크기가 변경되면 레이아웃 이동으로 간주되지 않습니다. 요소의 변경으로 인해 보이는 다른 요소의 시작 위치가 변경되는 경우에만 오프셋이라고 합니다.

계산 공식: 레이아웃 오프셋 점수 = 영향 점수 x 거리 점수

영향 점수: 이전 프레임과 현재 프레임의 모든 불안정한 요소의 코스웨어 영역 집합(전체 가시 영역의 일부를 설명함)은 현재 프레임의 영향 점수입니다.

거리 점수: 불안정한 요소가 한 프레임에서 변위되는 최대 거리(수평 또는 수직)를 가시 영역의 최대 크기 차원(너비 또는 높이 중 더 큰 것)으로 나눈 값을 나타냅니다.

CLS의 일반적인 원인:

크기가 조정되지 않은 사진
크기가 없는 광고, 삽입 및 iframe
동적으로 삽입된 콘텐츠
보이지 않는 텍스트 깜박임(FOIT), 스타일 없는 텍스트 깜박임(FOUT)을 유발하는 웹 글꼴
DOM을 업데이트하기 전에 네트워크의 응답을 기다리는 작업

최적화:

이미지 및 동영상 요소에 크기 속성 포함
사용자 상호 작용에 응답하지 않고 기존 콘텐츠 위에 추가 콘텐츠를 삽입하지 않습니다.
레이아웃 오프셋을 트리거하는 속성 애니메이션보다 전환 애니메이션을 선호합니다.



위의 5가지 지표는 현재 프런트엔드 성능 지표의 고려 사항인 동시에 문제의 원인과 최적화 방법입니다. 각 최적화 포인트는 많은 지식과 학습 포인트를 확장할 수 있으므로 프런트 엔드 최적화 작업 링크는 여전히 매우 길고 단일 포인트의 최적화 효과는 분명하지 않을 수 있지만 다섯 포인트가 모두 최적화되면 확실히 있을 것입니다. 질적 도약.

실제 프로젝트에서는 프런트엔드 자체부터 먼저 시작하고 자체 최적화 후 협업 항목을 최적화합니다.

또한 프런트 엔드 최적화는 지속 가능하고 장기적인 것입니다. 도구 기술 업그레이드를 반복하면 프로젝트 성능도 향상됩니다. 최적화 작업은 한 번만 하는 것이 아니라 계속되어야 합니다.

프런트 엔드 성능 최적화의 길은 멀고 어렵지만 다가오고 있으며 특수 연구에서 진전이 있을 것이며 결국 목표는 반드시 성공적으로 달성될 것입니다.

문서 참조: https://web.dev/ https://developer.chrome.com/

 

{{o.이름}}
{{이름}}

추천

출처my.oschina.net/u/4090830/blog/8591368