제이크 아치 볼드는 2013 년에이 주제에 더 긍정적 인 내용을 추가 할 수있는 통찰력을 제공했다고 생각합니다.
https://www.html5rocks.com/en/tutorials/speed/script-loading/
성배는 렌더링을 차단하지 않고 즉시 스크립트 세트를 다운로드하여 추가 된 순서대로 가능한 빨리 실행합니다. 불행히도 HTML은 당신을 미워하고 그렇게 할 수 없습니다.
(...)
대답은 실제로 스크립트로드 섹션의 맨 아래에 숨겨져 있지만 실제로 HTML5 사양에 있습니다. " 비동기 IDL 속성은 요소가 비동기 적으로 실행 될지 여부를 제어합니다. 요소의"force-async "플래그가 설정되면 비동기 IDL 속성이 true를 리턴하고 설정시"force-async "를 리턴해야합니다. 플래그를 먼저 설정 해제해야합니다… ".
(...)
문서에 동적으로 생성되고 추가 된 스크립트는 기본적으로 비동기 적이며 렌더링을 차단하지 않고 다운로드하자마자 실행되지 않아 잘못된 순서로 나올 수 있습니다. 그러나 명시 적으로 비동기가 아닌 것으로 표시 할 수 있습니다.
[
'//other-domain.com/1.js',
'2.js'
].forEach(function(src) {
var script = document.createElement('script');
script.src = src;
script.async = false;
document.head.appendChild(script);
});
이를 통해 스크립트에 일반 HTML로는 달성 할 수없는 동작이 혼합됩니다. 명시 적으로 비동기 적이 지 않기 때문에 스크립트는 첫 번째 일반 HTML 예제에서 추가 된 것과 동일한 대기열과 실행 대기열에 추가됩니다. 그러나 동적으로 생성되면 문서 파싱 외부에서 실행되므로 렌더링하는 동안 렌더링이 차단되지 않습니다 (비 동기화 스크립트로드와 동기화 XHR을 혼동하지 마십시오).
위의 스크립트는 페이지 헤드에 인라인으로 포함되어 점진적 렌더링을 방해하지 않으면 서 최대한 빨리 스크립트 다운로드를 큐에 넣고 지정한 순서대로 가능한 빨리 실행합니다. “2.js”는“1.js”이전에 무료로 다운로드 할 수 있지만“1.js”가 성공적으로 다운로드되어 실행되거나 실패 할 때까지는 실행되지 않습니다. 만세! 비동기 다운로드하지만 명령 실행 !
여전히 스크립트를로드하는 가장 빠른 방법이 아닐 수도 있습니다.
(...) 위의 예제에서 브라우저는 스크립트를 구문 분석하고 실행하여 다운로드 할 스크립트를 찾아야합니다. 사전로드 스캐너에서 스크립트를 숨 깁니다. 브라우저는이 스캐너를 사용하여 다음에 방문 할 가능성이있는 페이지의 리소스를 찾거나 파서가 다른 리소스에 의해 차단 된 동안 페이지 리소스를 검색합니다.
이것을 문서의 머리 부분에 넣으면 검색 가능성을 다시 추가 할 수 있습니다.
<link rel="subresource" href="//other-domain.com/1.js">
<link rel="subresource" href="2.js">
이것은 브라우저가 페이지에 1.js와 2.js가 필요하다는 것을 알려줍니다. link [rel = subresource]는 link [rel = prefetch]와 유사하지만 의미가 다릅니다. 불행히도 현재 Chrome에서만 지원되며 링크 요소를 통해 한 번, 스크립트에서 다시 두 번로드 할 스크립트를 선언해야합니다.
수정 : 원래는 사전로드 스캐너에서 가져 왔지만 일반 파서에서 가져 오지 않았습니다. 그러나 사전로드 스캐너는 이러한 기능을 선택할 수 있지만 아직 실행되지는 않았지만 실행 코드에 포함 된 스크립트는 사전로드 할 수 없습니다. 의견을 수정 한 Yoav Weiss에게 감사드립니다.
async
새로운 (ish)이지만defer
IE4 이후 IE의 일부였습니다.defer
최근에 다른 브라우저에 추가되었지만 이전 버전의 브라우저는 훨씬 덜 매달려 있습니다.