-3

은 참조 :Google에서 "Render-Blocking JavaScript"라는 용어를 사용하는 이유는 무엇입니까?

https://developers.google.com/speed/docs/insights/BlockingJS

구글은 그러나 용어는 잘못된 혼란과 오해의 소지가 내 의견으로는 "자바 스크립트를-차단 렌더"에 대해이 얘기입니다. 그것은 거의 "구글"이 그것을 이해하지 못하는 것처럼 보입니다.

이 점은 자바 스크립트 실행이 항상 렌더링을 일시 중지/차단하고 항상 "HTML 구문 분석기"를 일시 중지/차단한다는 것입니다 (적어도 Chrome 및 Firefox에서는). 비동기 스크립트 태그와 함께 외부 js 파일의 경우에도 차단됩니다.

예를 들어 async를 사용하여 "render-blocking Javascript"를 제거하는 것은 비 차단 자바 스크립트가 있거나 "async Javascript execution"이 렌더링을 차단하지 않는다는 것을 의미하지만 사실이 아닙니다!

올바른 용어는 "Render-Blocking Download (s)"입니다. async를 사용하면 js 파일을 다운로드해도 렌더링이 일시 중지되거나 차단되지 않습니다. 그러나 실행은 여전히 ​​렌더링을 차단합니다.

Google이 "이해하고 있지 않다"는 것을 확인하는 또 다른 예입니다.

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8" /> 
    <title>Test</title> 
</head> 
<body> 
    Some HTML line and this is above the fold 
    <script> 
     // Synchronous delay of 5 seconds 
     var timeWhile = new Date().getTime(); 
     while(new Date().getTime() - timeWhile < 5000); 
    </script> 
</body> 
</html> 

나는 파이어 폭스와 크롬에서 테스트 그리고 그들은 (렌더링) 보여주고있다 : "일부 HTML 라인이이 배 이상"오초 후하지 오초 내 !!!! 구글은 그런 경우 자바 스크립트가 렌더링을 차단하지 않을 것이라고 생각하지만, 이론적으로 예상대로 차단 될 것으로 보인다. js 실행이 시작되기 전에 모든 HTML은 이미 DOM (execept end body/html 태그)에 있지만 렌더링이 아직 완료되지 않고 일시 중지됩니다. 그래서 구글이 이것을 정말로 알고 있다면, 크롬은 자바 스크립트의 실행으로 시작하기 전에 렌더링을 끝낼 것입니다.

당신은 위의 예를 가지고가는 경우에 당신이 사용하고 있습니다 :

<script src="delay.js" async></script> 

또는 대신 내부 자바 스크립트의

<script src="delay.js"></script> 

. 그런 다음 위의 예와 동일한 결과를 얻을 수도 있습니다. 예 :

  • "HTML 파서"가 자바 스크립트 부분에 오기 전에 프리 로더 (이미 다운로드 할 파일 검색)에서 "delay.js"를 이미 다운로드 한 경우입니다.
  • 일반적으로 Google, Facebook 등의 외부 파일은 이미 캐시에 저장되어 있으므로 다운로드가 없으며 캐시에서 파일을 가져옵니다.

그런 경우 (비동기로도) 위의 예와 같은 결과가됩니다 (적어도 많은 경우). 추가 다운로드 시간이 없으면 앞선 html 렌더링이 끝나기 전에 "자바 스크립트 실행"이 이미 시작됩니다.

그렇다면 delay.js (또는 추가 지연 시간)에 "no-cache"/ "no-store"를 넣어 페이지를 더 빨리 렌더링 할 수도 있습니다. 다운로드 (또는 추가 지연)를 강요하면 Javascript 렌더링 차단을 실행하기 전에 브라우저가 이전 html의 렌더링을 끝내는 데 약간의 추가 시간을줍니다.

Google (및 다른 사람들)이 "Render-Blocking JavaScript"라는 용어를 사용하는 이유를 이해하지 못하고 이론 및 실제 생활에서 볼 때 잘못된 용어 및 잘못된 생각처럼 보입니다. 나는 이것에 대해 인터넷에서 이야기하는 사람이 아무도 없기 때문에 이해하지 못한다. 나는 f ** king 지능형 (j/k) 인 것을 알고 있지만 위의 생각을 가진 유일한 사람이되도록 이상하게 보입니다.

+1

링크 된 페이지에서 : *** 인라인 스크립트는 실행을 연기하기 위해 추가 코드를 작성하지 않는 한 항상 파서 차단 **입니다. * –

+0

@JoshLee하지만 그건 사실이 아닙니다. Javascript 실행은 항상 파서를 차단합니다. 그리고 그것이 async/sync/defer인지는 중요하지 않습니다. 이것이 바로 Google이 사람들을 정보와 혼동하고 귀하가 볼 수있는 것처럼, 이제는 정보로 인해 잘못된 생각을하고 있습니다. 지연 및 캐싱의 경우 (다운로드 시간이 아님) 외부 스크립트 태그를 사용하여 테스트를 수행 할 수 있습니다. j가 실행되는 동안 렌더링이 차단되기 때문에 5 초 후에 "일부 HTML 행 및 이것이 스크롤없이 볼 수있는 부분 위에 표시됩니다"가 다시 표시됩니다. ! –

답변

1

나는 Chrome, Firefox, Safari 및 Edge에서 개발자와 협력하며 브라우저의 이러한 측면에서 작업하는 사람들이 async/defer의 차이점을 이해하고 있음을 확신 할 수 있습니다. 당신이 정중하게 질문하면 다른 사람들이 당신의 질문에 더 정중하게 반응 할 것입니다.

여기에 스크립트로드 및 실행에 HTML spec의 이미지입니다 :

Diagram of script loading

이것은 고전적인 스크립트가 async 또는 defer도있는 경우 가져 오는 동안 차단이 발생하는 것을 알 수있다. 또한 실행은 항상 파싱 또는 파싱의 관찰 가능한 효과를 차단한다는 것을 보여줍니다. 이는 DOM과 JS가 같은 스레드에서 실행되기 때문입니다.

나는 파이어 폭스와 크롬에서 테스트 그리고 그들은 (렌더링) 보여주고있다 : "일부 HTML 라인이이 배 이상"오초 후하지 오초 내 !!!!

브라우저는 위의 행은 렌더링 할 수 있지만 아래의 행은 렌더링 할 수 없습니다. 위의 행이 렌더링되는지 여부는 화면 새로 고침과 관련하여 이벤트 루프의 타이밍에 따라 달라집니다.

구글이 그런 경우, 자바 스크립트가 나는이에 대한 참조를 찾기 위해 사투를 벌인거야

렌더링 차단하지 않을 것이라는 생각처럼 보인다. 나를 보내신 이메일에 linked to my article이 있는데, 특히 가져 오는 동안 렌더링이 차단되는 것에 대해 이야기하고 있습니다.

그런 경우

(및 비동기)와, 결과 사양으로 보장되지 동일한

될 것이다. 캐시에서 즉시 가져 오는 것에 의존하고 있습니다. 그렇지 않을 수도 있습니다.

같은 경우에는 페이지를 더 빨리 렌더링 할 수 있도록 delay.js (또는 추가 지연 시간)에 "no-cache"/ "no-store"를 넣을 수도 있습니다. 다운로드 (또는 추가 지연)를 강요하면 Javascript 렌더링 차단을 실행하기 전에 브라우저가 이전 html의 렌더링을 끝내는 데 약간의 추가 시간을줍니다.

이 경우 defer을 사용하지 않는 이유는 무엇입니까? 이는 대역폭 벌칙 및 예측 불가능 성없이 동일하게 달성됩니다.

+0

나는 꽤 정중하게 질문하고있다. 그러나 appartly 나는 나의 의견으로는 구글이 틀렸다는 것을 말할 수 없다. 나는 저주하지 않고 단지 논쟁 만하고 있습니다. 그러나 어쨌든 귀하의 회신에 많은 감사드립니다! 나는 정말로 그것을 appriciate한다! 비록 내가 아직 대답이 없습니다.). 내 메일에서 우선 가능합니다. "가져 오는 중에 렌더링이 차단됨"에 대해 말하지 않았습니다. Chrome이 자바 스크립트 실행을 시작하기 전에 이전 html의 렌더링을 완료하지 않는 이유에 대해 이야기했습니다. –

+0

그리고 당신은 말했다 : "당신은 즉시 캐시에서 검색에 의존하고 있습니다. 그렇지 않을 수도 있습니다." 나는 "의지/할 수있다"고 말했다. 그래서 나는 그것을 알고있다. 그러나 나는 내가 한 테스트에 의지하고있다. 그 예제를 사용하여 테스트를 수행 할 수 있습니다. 그런 다음 async script 태그를 사용하여 테스트를 수행 할 수 있습니다. 그러면 예를 들어 "자바 스크립트 실행"이 "선행 HTML"렌더링을 차단하고 있다는 것을 알 수 있습니다. 그래서 옵션은 이전 html의 렌더링을 끝내기 위해 브라우저에 여분의 시간을주기 위해 캐시하지 않는 것입니다. –

+0

해당 테스트를 참조하십시오. https://stackoverflow.com/questions/46979465/loading-external-javascript-via-async-script-tag-at-the-end-of-a-webpage –

0

Maarten B, 코드 테스트를했는데 실제로 정확합니다. 비동기, 지연 또는 무엇이든 상관없이 인라인 JavaScript 위의 선은 렌더링되지 않습니다. 따라서 Google의 문서에있는 정보가 정확하지 않습니다.

+0

어떤 문서가 정확하지 않다고 생각하십니까? –