innerHTML 설정은 DOM을 변경할 수있는 대부분의 변경과 마찬가지로 동기식입니다. 그러나 웹 페이지 렌더링 은 다른 이야기입니다.
(DOM은 "Document Object Model"의 약자입니다. 데이터를 표현한 "모델"일뿐입니다. 사용자가 화면에서 보는 것은 모델이 어떻게 보이는지에 대한 그림입니다. 따라서 모델을 즉시 변경하는 것은 아닙니다. 사진 변경-업데이트하는 데 약간의 시간이 걸립니다.)
JavaScript를 실행하고 웹 페이지를 렌더링하는 것은 실제로 개별적으로 발생합니다. (이벤트 루프에서 - 체크 아웃 페이지 실행에 먼저 모든 자바 스크립트, 단순하게 말하면 이 우수한 비디오 자세한 내용에 대한)를 다음 후 브라우저는 사용자가 볼 수 있도록 웹 페이지에 대한 변경 사항을 렌더링하는. 이것이 "차단"이 그토록 큰 문제인 이유입니다. 계산 집약적 인 코드를 실행하면 브라우저가 "JS 실행"단계를지나 "페이지 렌더링"단계로 들어가 페이지가 멈추거나 끊기는 것을 방지 할 수 있습니다.
Chrome의 파이프 라인은 다음과 같습니다.
보시다시피 모든 JavaScript가 먼저 발생합니다. 그런 다음 페이지의 스타일이 지정되고, 레이아웃이 지정되고, 페인트되고, 합성됩니다 ( "렌더링"). 이 파이프 라인이 모든 프레임에서 실행되는 것은 아닙니다. 변경된 페이지 요소 (있는 경우) 및 다시 렌더링해야하는 방법에 따라 다릅니다.
참고 : alert()
또한 동기식이며 JavaScript 단계 중에 실행되기 때문에 웹 페이지 변경 사항을 확인하기 전에 경고 대화 상자가 나타납니다.
이제 "잠시만 요, 파이프 라인의 'JavaScript'단계에서 정확히 무엇이 실행됩니까? 모든 코드가 초당 60 번 실행됩니까?"라고 질문 할 수 있습니다. 대답은 "아니오"이며 JS 이벤트 루프가 작동하는 방식으로 돌아갑니다. JS 코드는 이벤트 리스너, 시간 초과 등과 같은 항목에서 스택에있는 경우에만 실행됩니다. 이전 비디오를 참조하십시오 (정말).
https://developers.google.com/web/fundamentals/performance/rendering/