HTML 문서에 JavaScript를 삽입할 때 <script>
태그와 포함된 JavaScript를 넣는 적절한 위치는 어디인가요? 내 기억으로는 <head>
섹션에 배치하면 안된다고 생각하지만, 페이지가 완전히 렌더링되기 전에 자바 스크립트를 구문 분석해야하기 때문에 <body>
섹션의 시작 부분에 배치하는 것도 좋지 않습니다 (또는 그와 비슷한 것). 이렇게 하면 <body>
섹션의 _end_가 <script>
태그의 논리적 위치로 남는 것 같습니다.
그렇다면 <script>
태그를 넣기에 적합한 위치는 어디일까요?
(이 질문은 이 질문을 참조한 것으로, 이 질문에서는 자바스크립트 함수 호출을 <a>
태그에서 <script>
태그로 옮겨야 한다고 제안했습니다. 저는 특히 jQuery를 사용하고 있지만 보다 일반적인 답변도 적절합니다.)
모든 스크립트를 삽입할 수 있는 HTML DOM 조작은 다른 document. write () '또는' 를 통해 자체. 이 때까지 기다려야 스크립트입니다 & 다운로드되었습니다 파서 있음을 시사하는 대목이다. 먼저 실행됨을 안전하게 구문 분석 나머지 문서. 자체 HTML 문서의 결국 스크립트입니다 삽입됨 수 있다.
그러나 대부분의 JavaScript 개발자들을 조작할 때 더 이상 이 문서는 DOM 로드중. 대신, 그들은 로드했습니다 문서 수정 전에 나올 때까지 기다려야 합니다. 예를 들면 다음과 같습니다.
<!-- index.html -->
<html>
<head>
<title>My Page</title>
<script type="text/javascript" src="my-script.js"></script>
</head>
<body>
<div id="user-greeting">Welcome back, user</div>
</body>
</html>
Javascript:
// my-script.js
document.addEventListener("DOMContentLoaded", function() {
// this function runs when the DOM is ready, i.e. when the document has been parsed
document.getElementById("user-greeting").textContent = "Welcome back, Bart";
});
이 문제를 해결하기 위해 ',' 는 이전 외곽진입 동일팔레트에 < script>, 아래쪽에 있는 ',' 이렇게 하면, 당신의 태그뿐 < body> 때문에 파서를 isn& # 39, t 차단되었음을 매우 종료 때까지.
이 외곽진입 그 자체의 문제: 브라우저 다운로드 스크립트에만 전체 문서을 는 구문 때까지 시작할 수 없습니다. 대규모 웹 사이트 대형 스크립트에만 &. 스타일시트가 다운로드하십시오 해야한단말입니다 스크립트입니다, 성능 향상을 위해 수 있다는 것이 매우 중요하다. 웹 사이트의 경우 2 초 이내에 로드하십시오 doesn& t # 39, 국민들은 gnu. orghttp://www. 다른 웹 사이트.
브라우저 다운로드 수 있는 최적의 솔루션을 시작할 것이라고 스크립트에 해야한단말입니다, 동시에 이 문서의 파싱 미삭.
현재 '는' 비동기 브라우저 '와' 지연합니다 특성을 스크립트입니다. 이러한 특성을 분석하는 것을 알 수 있는 동안 계속 있지만브라우저에 it& # 39 의 안전하다구요 스크립트에만 다운로드됨 속속 등장하고 있다.
<script type="text/javascript" src="path/to/script1.js" async></script>
<script type="text/javascript" src="path/to/script2.js" async></script>
속성은 스크립트에만 csetup 함께 비동기 비동기. 즉, 즉시 # 39 의 다운로드됨 it& 스크립트입니다 실행한 브라우저를 차단하지 않고, 한편. 따라서 it& # 39 의 스크립트입니다 2 는 다운로드됨 & 수 있습니다. 전에 실행됨을 스크립트입니다 1.
Http://caniuse.com/ # 성과 = 스크립트입니다 비동기 따르면, 94.57% 의 모든 브라우저에서 지원되는 이.
<script type="text/javascript" src="path/to/script1.js" defer></script>
<script type="text/javascript" src="path/to/script2.js" defer></script>
속성은 지연합니다 csetup 함께 스크립트에만 위해 (즉, 먼저 1 이면 스크립트입니다 스크립트입니다 2). 또한 있지만브라우저에 차단 않습니다.
비동기 스크립트에만 달리, 단지 전체 문서을 후 지연합니다 스크립트에만 csetup 로드했습니다.
Http://caniuse.com/ # 성과 = 스크립트입니다 지연합니다 따르면, 94.59% 의 모든 브라우저에서 지원되는 이. 이를 지원할 94.92% 적어도 부분적으로 흡수한다.
중요한 참고 있는 브라우저 호환성. 상황에 따라, 9일 5월 = ie < autoexec. 우회된 스크립트에만 out of order. [이] (https://github.com/h5bp/lazyweb-requests/issues/42) 이 브라우저를 지원해야 하는 경우에는 먼저 펼게 읽어보시기 바랍니다.
현재의 최신 했다 ',', '에서 스크립트에만 < head> 태그 및 사용 지연합니다 비동기' 또는 '' 속성. 이 브라우저를 차단하지 않고 빨리 스크립트에만 다운로드할 수 있습니다.
좋은 건 아직 지원하지 않는 브라우저를 웹 사이트에 대한 이러한 특성을 제대로 로드하십시오 하는 동안 다른 속도를 내고 6 %94% 였다.
닫는 본문 태그 바로 직전에
http://developer.yahoo.com/performance/rules.html#js_bottom
하단에 스크립트 넣기
스크립트로 인해 발생하는 문제는 병렬 다운로드를 차단한다는 것입니다. HTTP/1.1 사양에 따르면 브라우저는 호스트 이름당 두 개 이하의 컴포넌트를 병렬로 다운로드할 수 있습니다. 여러 호스트 이름에서 이미지를 제공하는 경우 두 개 이상의 다운로드가 병렬로 발생할 수 있습니다. 그러나 스크립트가 다운로드되는 동안 브라우저는 다른 호스트 이름에서도 다른 다운로드를 시작하지 않습니다.
단순한 어디든요 비블로킹 스크립트입니다 주기표시 배치할 수 있습니다.
<script src="script.js" async></script>
<script src="script.js" defer></script>
<script src="script.js" async defer></script>
즉, 이러한 스크립트에만 비동기적으로 실행됨을 준비됐어들 문서 / 후 이 작업을 수행할 수 없습니다.
<script src="jquery.js" async></script>
<script>jQuery(something);</script>
<!--
* might throw "jQuery is not defined" error
* defer will not work either
-->
나 이:
<script src="document.write(something).js" async></script>
<!--
* might issue "cannot write into document from an asynchronous script" warning
* defer will not work either
-->
나 이:
<script src="jquery.js" async></script>
<script src="jQuery(something).js" async></script>
<!--
* might throw "jQuery is not defined" error (no guarantee which script runs first)
* defer will work in sane browsers
-->
나 이:
<script src="document.getElementById(header).js" async></script>
<div id="header"></div>
<!--
* might not locate #header (script could fire before parser looks at the next line)
* defer will work in sane browsers
-->
이러한 점을 고려하면, 비동기적입니다 스크립트에만 오퍼링에 이러한 의 장점:
문제를 해결하기 위해 주문하십시오 사용하여 외부 스크립트입니다 지원부에서는 콜백 실행 가능하다. Javascript api 를 지원하고 있습니다 많은 제 3 당 비블로킹 엑서큐션. 로드중 구글 지도 API 를 비동기식으로 의 예를 들어보겠습니다.
[1]: http://www.w3.org/TR/html5/scripting-1.html # 속성 스크립트입니다 비동기 [2]: http://www.w3.org/TR/html5/scripting-1.html # 속성 스크립트입니다 지연합니다
표준 조언, 프로모트할 의해 야후! 탁월한 성능 ',' 팀, is 를 넣을 수 있도록 don& 바디입니다 태그뿐 < script>, 문서 끝에 # 39, t 블록을 페이지 렌더링을.
더 나은 성능을 제공하는 수축됐는데 일부 새로운 접근 방식을 설명한 대로 [이 오토메이티드] (https://stackoverflow.com/a/435295/578288) 에 load time of the Google Analytics 자바스크립트 파일:
>. 몇 가지 < ";;; a href = " >, 뛰어난 slides< /a>, http://stevesouders.com/docs/googleio-20080529.ppt 스티브 소우 (클라이언트측 성능 숙련가) 에 의해: >. >. 여러 가지 기술을 로드하기에 외부 JavaScript 파일을 병렬로 >. 그들의 영향을 고객이시간과 로드중 페이지 렌더링 >. * 어떤 종류의 " 그곳에서 progress". (예를 들어, # 39, & # 39 loading& 표시합니다. 표시자가 브라우저 모래 상태 표시줄의 마우스 커서).
<script src="myjs.js"></script>
</body>
그 전에 먼저 페이지의 내용이 로드중 js 파일을 볼 수 있습니다.
필요한 경우 확인할 수 있습니다. http://stevesouders.com/hpws/rule-js-bottom.php
<script type="module" src="..."></script>
기본적으로 모듈이 로드되었는지 비동기적으로 및 디퍼드. 즉, 그들은 불지옥으 로드형 어디든요 배치할 수 있는 페이지를 보면 병렬 및 autoexec. 로드가.
차이점은 스크립트입니다 및 모듈에서는 다음과 같습니다.
https://stackoverflow.com/a/53821485/731548
여기에 비해 실행 모듈에서는 스크랩트 설명되어 있습니다.
https://developers.google.com/web/fundamentals/primers/modules # 지연합니다
다음은 지원부에서는.
https://caniuse.com/ # 성과 = es6 모듈에서는
또는 best thing (# 39 의 경우 that& 걱정 안 해도) 는 javascript 배치하십시오 모달 https://xxx. 로드중 만들 수 있습니다 아래쪽에 있는 이 때 스크립트는 로드되었는지 마지막 줄의 페이지에 저회가 사라지게 된다. 이 방법을 사용하여 사용자 페이지에 있는 작업 전에 스크립트에만 로드되었는지 방지할 수 있습니다. 또한 잘못된 방지 위원회.
스크립트 및 용도에 따라 최상의 (측면에서 페이지 부하 및 렌더링 시간) 을 사용하지 않는 것이 일반적인 & script&, gt, lt;; - 태그번호 자체는, 그러나 무중단으로 읽어들이기를 스크립트입니다 트리거하여 비동기적으로.
몇 가지 다른 기술을 사용할 수 있지만 가장 간단하지는 도쿠망스크리틸망 (script" ";) 이벤트 때 빈다우드로 로이드 트리거됩니다. 그 자체에 영향을 주지 않는 첫 페이지를 보면 스크립트입니다 로드되었는지 렌더링됩니다 시간을 기다려야 하기 때문에 사용자가 페이지에 나타날 수 있습니다.
이 자연스럽게 하는 것 자체가 스크립트입니다 페이지 렌더링을 필요하지 않습니다.
자세한 내용은 게시물로의 커플링 비동기 스크립트에만 에서 스티브 소우 (지금은 구글에서 만든 이슬로).
, # 39 는 또한 이 js 파일을 로드중 외부에서 it& 될 수 있고 캐시되는 정보기술 (it) 등 의 고유한 장이점이 브라우저에서 HTML 페이지 로딩 시간이 빠르게 도움말에서는 코드의 및 정보기술 (it), 그리고 자바스크립트 코드 베이스를 따로 관리할 수 있는 더 나은 .
그러나 현대의 일부 '와' like '비동기 브라우저 기능도 지원할 수 있는 다른 최적이고 지연합니다' 외부 '' 로드하기에 javascript 파일을.
일반적으로 HTML 페이지를 실행 행별로 시작합니다. 외부 자바스크립트 < 때 script>; javascript 가 HTML 구문 분석, 요소점 발견될 때까지 준비가 다운로드하십시오 중지됨인 엑서큐션. '이 정상 페이지가 실행 지연합니다' 와 '비동기' 속성을 사용하여 변경할 수 있습니다.
하지만 HTML 구문 분석 함께 사용할 때 JavaScript 가 다운로드됨 파라우렐리 속성용 지연합니다 후에만 실행하십시오 완전한 HTML 구문 분석 완료되어도 됩니다.
<script src="/local-js-path/myScript.js" defer></script>
비동기 속성용 사용할 때 JavaScript 가 다운로드됨 발견되는 대로, 그 뒤에 스크립트입니다 다운로드하십시오 실행됨을 (파라우렐리) 과 함께 비동기식 HTML 구문 분석.
<script src="/local-js-path/myScript.js" async></script>
'말' 의 경우, DOM 은 body> 배치하십시오 스크립트에만 <, 모든 기회를 로드 및 렌더링합니다 (페이지는 " display"; 빠름). ',' 은 이러한 모든 액세스하도록 script> <, DOM 요소.
한편, '시작', 또는 그 이상의 body> < 배치한 후 진행될 스크립트입니다 (여기서 there& # 39 의 아직 아무 DOM 요소).
즉 언제 어디서나 사용할 수 있습니다 틀렸다니까 jQuery 등 it 배치하십시오 프로파일링하려는 그레이디 ()
웹 페이지에서 엑서큐션 달려 있다고 생각한다. 수 있는 페이지를 표시할 경우 제대로 표시되지 않고 다음 JavaScript 로드중 첫 JavaScript 파일을 포함해야 하는 것은 처음이다. 처음에 JavaScript 파일을 다운로드 후 렌더링합니다 신앙이니라 표시할 수 있습니다 / 웹 페이지 하단에 있는 JavaScript 코드를 넣을 수 있습니다. # 39 에서 user& 표시되기 때문에 에뮬레이션합니다 페이지 로딩 및 빠른 것 같다) 의 관점, 해당 페이지를 로드하는 가속화합니다.