Skip to content

Latest commit

 

History

History
161 lines (113 loc) · 7.81 KB

FID.md

File metadata and controls

161 lines (113 loc) · 7.81 KB
title date author category
FID
2020-12-09 16:00:00 -0800
chjjh0
S2_Round3

Optimize First Input Delay

How to respond faster to user interactions.

FID

  • 상호작용을 측정하여 사용자 환경이 좋고 나쁜지 알 수 있는 지표
    (상호작용: 링크 or 버튼 클릭시 이벤트가 시작되어 응답을 받을 때가지 걸리는 시간을 의미)
  • 과도한 JavaScript 실행은 FID를 나쁘게 만드는 주요원인
  • lighthouse같은 시뮬레이션 환경에서는 사용자 입력을 받을 수 없기 때문에 FID를 측정할 수 없지만, TBT
    (Total Blocking Time)로 대체 측정 가능하기때문에 TBT를 개선시키면 FID 개선됨

lighthouse_performance




Heavy JavaScript execution

Break up Long Tasks

  • Long Tasks 를 줄여라
    (Long Tasks: main thread를 50ms 이상 점유하여 사이트의 입력지연을 발생시키는 작업을 칭함)

  • 예를들어 사용자가 현재 사이트를 이용하는데 필요하지 않는 코드를 로드하거나,
    JS 코드를 실행한다면 main thread를 50ms 이상 점유할 가능성이 높아져서 Long Tasks가 될 가능성 증가

  • 이를 개선하기 위해 Code Splitting을 통해 JS파일을 적절하게 나누거나 JS 파일이 이미 로드되었다면
    부하가 많은 실행코드들을 더 작은 비동기 작업으로 나누는 것을 권장하며
    이런 작업을 통해 눈에 띄게 향상된 FID 기대할 수 있음

  • 브라우저 > 검사도구 > Performance 탭에서 확인 가능

  • 사이트별 Long Tasks 비교
    #1 www.laftel.net의 Long Tasks

    laftel_performance


    #2 code splitting, lazyloading 등 최적화 적용이 되지 않은 개발버전 프로젝트의 Long Tasks

    privateproject_performance

Optimize your page for interaction readiness

Reduce JavaScript execution time

  1. Defer unused JavaScript

    • 페이지 진입 시 불러오는 JS 의 크기 최소화 및 중요하지 않은 JS 코드는 defer or async로 로딩을 지연 시켜라

      브라우저에서 script를 불러오는 과정

      참고링크

      • 일반적인 실행과정
        Script fetch/execution이 완료될 때까지 HTML parsing 일시정지
        script_basic_loading

      • async 속성이 추가된 실행과정
        HTML parsing과 Script fetch가 병렬적으로 실행 가능
        Script fetch가 끝나고 execution 될 때에는 HTML parsing 일시정지

      <script async src="script.js">

      script_async_loading

      • defer 속성이 추가된 실행과정
        HTML parsing과 Script fetch가 병렬적으로 실행 가능하지만,
        Script fetch가 끝다더라도 HTML parsing이 끝나야 excution 가능
      <script defer src="script.js">

      script_defer_loading

    • Webpack, Rollpup, Parcel같은 번들러의 도움을 받아 Code Splitting 을 하고 Dynamic import 추천
    • React, Vue 를 사용해 컴포넌트 단위로 lazy-load 추천
  2. Minimize unused polyfills

    • 폴리필을 불러올 때 프로젝트에 필요한 폴리필만 로드해라

    • 예를들어 Babel의 preset-env만 필요하다면 다음처럼 import 권장

      // 나쁜 예
      // preset-env만 필요한데 바벨 전체를 불러와 불필요한 것까지 import
      import '@babel'
      
      // 좋은 예
      // 필요한 preset-env만 import
      import '@babel/preset-env'