HTML 마크 업에서 <script> 태그를 어디에 두어야합니까?


1487

HTML 문서에 JavaScript를 포함시킬 때 <script>태그와 포함 된 JavaScript 를 넣을 적절한 위치는 어디 입니까? 나는 당신이 <head>섹션에 이것을 배치해서는 안된다는 것을 기억하는 것 같지만 <body>, 페이지가 완전히 렌더링되기 전에 JavaScript를 파싱해야하기 때문에 섹션 의 시작 부분에 배치하는 것도 좋지 않습니다. 이것은 떠날 것으로 보인다 <body>에 대한 논리적 장소로 섹션 <script>태그를.

그렇다면 태그 를 넣을 올바른 장소 어디 <script>입니까?

(이 질문은 참고 문헌 이 질문 은 자바 스크립트 함수 호출에서 이동해야한다고 제안되었던, <a>에 태그 <script>내가 특별히 jQuery를 사용하고 있습니다. 태그하지만,보다 일반적인 답변은 또한 적절한됩니다.)


간단한 솔루션을 찾고 Jekyll과 같은 서버 측 생성기를 사용하는 경우 대신 스크립트를 포함시키는 것이 좋습니다. 훨씬 더 간단합니다!
cregox

답변:


1861

브라우저가 <script>태그가 있는 웹 사이트를로드하면 어떻게됩니까 ?

  1. HTML 페이지를 가져옵니다 (예 : index.html)
  2. HTML 파싱 시작
  3. 파서가 <script>외부 스크립트 파일을 참조하는 태그를 발견했습니다 .
  4. 브라우저가 스크립트 파일을 요청합니다. 그 동안 파서는 페이지의 다른 HTML 파싱을 차단하고 중지합니다.
  5. 얼마 후 스크립트가 다운로드되어 실행됩니다.
  6. 구문 분석기는 나머지 HTML 문서를 계속 구문 분석합니다.

4 단계는 사용자 경험을 저하시킵니다. 웹 사이트는 기본적으로 모든 스크립트를 다운로드 할 때까지로드를 중지합니다. 사용자가 싫어하는 것이 있다면 웹 사이트가로드되기를 기다리는 것입니다.

왜 이런 일이 발생합니까?

모든 스크립트는 document.write()다른 DOM 조작을 통해 자체 HTML을 삽입 할 수 있습니다 . 이는 파서가 스크립트가 다운로드되어 실행될 때까지 기다려야 문서의 나머지 부분을 안전하게 파싱 할 수 있습니다. 결국, 스크립트 는 문서에 자체 HTML을 삽입했을 있습니다.

그러나 대부분의 JavaScript 개발자 는 문서가로드 되는 동안 더 이상 DOM 조작하지 않습니다 . 대신 문서를로드하기 전에 문서를 수정하기 전에 기다립니다. 예를 들면 다음과 같습니다.

<!-- index.html -->
<html>
    <head>
        <title>My Page</title>
        <script src="my-script.js"></script>
    </head>
    <body>
        <div id="user-greeting">Welcome back, user</div>
    </body>
</html>

자바 스크립트 :

// 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";
});

브라우저가 my-script.js가 문서를 다운로드하여 실행할 때까지 문서를 수정하지 않는다는 것을 모르기 때문에 파서는 구문 분석을 중지합니다.

낡은 추천

이 문제를 해결하는 기존의 접근 방식 <script>은의 맨 아래에 태그 를 넣는 <body>것이 었습니다. 이는 파서가 끝날 때까지 차단되지 않기 때문입니다.

이 방법에는 자체 문제가 있습니다. 전체 문서를 파싱 할 때까지 브라우저에서 스크립트 다운로드를 시작할 수 없습니다. 큰 스크립트 및 스타일 시트가있는 더 큰 웹 사이트의 경우 가능한 빨리 스크립트를 다운로드 할 수 있어야 성능이 매우 중요합니다. 웹 사이트가 2 초 이내에로드되지 않으면 사람들은 다른 웹 사이트로 이동합니다.

최적의 솔루션에서 브라우저는 가능한 한 빨리 스크립트를 다운로드하기 시작하면서 동시에 나머지 문서를 구문 분석합니다.

현대적인 접근

오늘날 브라우저 는 스크립트 에서 asyncdefer속성을 지원합니다 . 이러한 속성은 스크립트가 다운로드되는 동안 브라우저를 구문 분석하는 것이 안전하다는 것을 브라우저에 알려줍니다.

비동기

<script src="path/to/script1.js" async></script>
<script src="path/to/script2.js" async></script>

async 속성을 가진 스크립트는 비동기 적으로 실행됩니다. 즉, 스크립트는 다운로드하는 즉시 브라우저를 차단하지 않고 실행됩니다.
이는 스크립트 1보다 먼저 스크립트 2를 다운로드하여 실행할 수 있음을 의미합니다.

http://caniuse.com/#feat=script-async 에 따르면 모든 브라우저의 97.78 %가이를 지원합니다.

연기하다

<script src="path/to/script1.js" defer></script>
<script src="path/to/script2.js" defer></script>

defer 속성을 가진 스크립트가 순서대로 실행됩니다 (즉, 첫 번째 스크립트 1, 그런 다음 스크립트 2). 또한 브라우저를 차단하지 않습니다.

비동기 스크립트와 달리 지연 스크립트는 전체 문서가로드 된 후에 만 ​​실행됩니다.

http://caniuse.com/#feat=script-defer 에 따르면 모든 브라우저의 97.79 %가이를 지원합니다. 98.06 %가 최소한 부분적으로 지원합니다.

브라우저 호환성에 대한 중요한 참고 사항 : 일부 상황에서 IE <= 9는 지연된 스크립트를 순서대로 실행할 수 있습니다. 당신이 그 브라우저를 지원해야하는 경우, 읽어 보시기 바랍니다 처음!

결론

현재의 최신 기술은 <head>태그 에 스크립트를 넣고 async또는 defer속성을 사용하는 것입니다. 이를 통해 브라우저를 차단하지 않고도 스크립트를 최대한 빨리 다운로드 할 수 있습니다.

좋은 점은 웹 사이트가 이러한 속성을 지원하지 않는 다른 2 %의 브라우저에서 여전히 98 %의 속도를 유지하면서 올바르게로드되어야한다는 것입니다.


63
나는 놀랄 아무도 구글의 설명 ... 언급하지 해요 developers.google.com/speed/docs/insights/BlockingJS
케이시 포크를

6
DOM에 닿는 것과 그렇지 않은 것에 대해서는 명확하지 않습니다. 당신은 명확히 할 수 있습니까? jquery.js와 같은 것에 비동기로드를하는 것이 안전합니까?
Doug

7
@Doug 예를 들어 document.writedom에서 작동합니다. 문제는 아닌 경우 스크립트가 DOM을 조작하지만, 경우 는 않습니다. domready이벤트가 발생한 후 모든 돔 조작이 발생하는 한 괜찮습니다. jQuery는 라이브러리이므로 dom 자체를 조작하지 않아야합니다.
Bart

24
이 답변은 잘못된 것입니다. 최신 브라우저는 HTML에 영향을 줄 수있는 동기 스크립트 태그에 도달 할 때 구문 분석을 중단하지 않고 렌더링 / 실행을 중지하고 HTML에 영향을 미치지 않는 경우 나중에 요청 될 다른 리소스를 다운로드하기 위해 낙관적으로 구문 분석을 계속 진행합니다.
Fabio Beltramini

40
asyncdefer속성이 어디에도 사용되지 않는 이유는 무엇 입니까? 나는 인터넷에서 HTML 소스를 많이 볼, 의미, 그리고는 표시되지 않습니다 asyncdefer어디 속성. ...?
john cj

239

에 표시된대로 닫는 본문 태그 바로 앞에

http://developer.yahoo.com/performance/rules.html#js_bottom

스크립트를 맨 아래에 놓으십시오

스크립트로 인한 문제는 병렬 다운로드를 차단한다는 것입니다. HTTP / 1.1 사양은 브라우저가 호스트 이름 당 2 개 이하의 구성 요소를 동시에 다운로드 할 것을 제안합니다. 여러 호스트 이름에서 이미지를 제공하는 경우 두 개 이상의 다운로드가 동시에 발생할 수 있습니다. 그러나 스크립트를 다운로드하는 동안 브라우저는 다른 호스트 이름에서도 다른 다운로드를 시작하지 않습니다.


7
개념과 설명에 동의했습니다. 그러나 사용자가 페이지를 재생하기 시작하면 어떻게됩니까? 페이지가 사용자에게 표시된 후에로드를 시작하지만로드하는 동안 사용자가 클릭하면 AJAX 드롭 다운이 있다고 가정하십시오! '실제로 참을성없는'사용자가 양식을 제출하면 어떻게 되나요?
Hemant Tank

9
@Hermant 이전 의견이지만 DOM이 완전히로드되면 기본적으로 필드를 비활성화 한 다음 JS를 사용하여 활성화하는 트릭을 수행 할 수 있습니다. 그것이 오늘날 페이스 북이하고있는 것입니다.
novato

2
크롬으로 테스트하여 여전히 동일한 지 확인하십시오. 그것은. 여기에서 브라우저의 페이지로드 시간 차이를 확인할 수 있습니다. stevesouders.com/cuzillion
cypher

46
이것이 가장 좋은 방법이라면 왜 stack overflow에 모든 스크립트 태그가 <head>에 포함됩니까? :-P
Philip

10
경우에 따라, 특히 아약스가 많은 사이트에서 헤드에로드하면 실제로로드 시간이 더 빨라질 수 있습니다. 참조 : encosia.com/dont-let-jquerys-document-ready-slow-you-down ( "live ()"함수는 jquery에서 더 이상 사용되지 않지만 기사는 여전히 "on ()"또는 " 델리게이트 "기능). @Hermant가 지적한대로 올바른 동작을 보장하기 위해 <head>에로드해야 할 수도 있습니다. 마지막으로 modernizr.com/docs 는 사이트에 설명 된 이유로 스크립트를 <head>에 배치 할 것을 권장합니다.
Nathan

76

비 차단 스크립트 태그는 다음과 같은 곳에 배치 할 수 있습니다.

<script src="script.js" async></script>
<script src="script.js" defer></script>
<script src="script.js" async defer></script>
  • async 스크립트는 사용 가능한 즉시 비동기식으로 실행됩니다
  • defer 문서 파싱이 끝나면 스크립트가 실행됩니다.
  • async defer 비동기가 지원되지 않으면 스크립트가 지연 동작으로 폴백

이러한 스크립트는 문서 준비 후 / 비동기 적으로 실행되므로 다음을 수행 할 수 없습니다.

<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
-->

그러나 비동기 스크립트는 다음과 같은 장점을 제공합니다.

  • 리소스의 병렬 다운로드 :
    브라우저는 스크립트가 다운로드되어 실행될 때까지 기다리지 않고도 스타일 시트, 이미지 및 기타 스크립트를 병렬로 다운로드 할 수 있습니다.
  • 소스 순서 독립성 :
    차단에 대해 걱정하지 않고 스크립트를 헤드 나 바디에 배치 할 수 있습니다 (CMS를 사용하는 경우 유용). 그래도 실행 순서는 중요합니다.

콜백을 지원하는 외부 스크립트를 사용하여 실행 순서 문제를 피할 수 있습니다. 많은 타사 JavaScript API는 이제 비 차단 실행을 지원합니다. 다음은 Google Maps API를 비동기 적 으로 로드 하는 예입니다 .


2
이것은 오늘날의 정답입니다.이 접근 방식을 사용하면 위젯을 독립적으로 유지하기가 쉬워지며 <head>논리를 포함시킬 필요가 없습니다 .
Daniel Sokolowski

1
당신이 사용할 수없는 이유를 혼동하고 있습니다 async또는 defer당신이 당신의 두 번째 블록에서 지정하는대로 jQuery를 포함 할 때 : <script src="jquery.js" async></script>. 이유를 설명 할 수 있습니까? jQuery가로드되는 동안에도 페이지가로드 될 수 있도록 허용 된 답변에 따라 비동기 태그가 필요하다고 생각했습니다.] 감사!
elbowlobstercowstand

3
@elbow 99 %의 시간 <script src=jquery.js>뒤에 $(function(){ ... })페이지 어딘가에 블록이 있습니다. 비동기 로딩은 브라우저가 해당 블록을 구문 분석하려고 할 때 jQuery가로드되도록 보장하지 않으므로 $ is not defined 오류가 발생합니다 (jQuery가 캐시에서로드되면 오류가 발생하지 않을 수 있음). jQuery를 비동기 적으로로드하고 보존하는 것에 대한 질문에 대답했습니다 $(function(){ ... }). 내가 그것을 찾을 수 있는지
Salman A

1
@SalmanA 감사합니다! 네, 99 %에 해당합니다. 먼저 jquerylib를로드 한 다음 나머지 .js스크립트 를로드 해야합니다 . 나는 선언 할 때 async또는 deferjqueryLIB 스크립트 태그, 내 .js스크립트가 작동하지 않습니다. 나는 그것을 $(function(){ ... })보호한다고 생각했다 . 현재 솔루션 : 내가 추가하지 deferasyncjquerylib 디렉토리 스크립트,하지만 난 추가합니까 async까지 내 추적에 .js스크립트. 참고 : 내가 뭘 이유 어떤 이의 구글 페이지 스피드 행복을 만드는 것입니다. 다시 한 번 도와주세요! 다른 조언은 환영합니다. (또는 이전 답변에 대한 링크). :)
elbowlobstercowstand

@elbow stackoverflow.com/a/21013975/87015를 참조 하면 아이디어 만 제공하지만 완벽한 솔루션은 아닙니다. 대신 "jquery async loader library"를 검색 할 수 있습니다.
살만 A

38

야후! 뛰어난 성능 팀은 <script>태그를 문서 본문의 끝에 배치 하여 페이지 렌더링을 차단하지 않는 것입니다.

그러나 Google 웹 로그 분석 자바 스크립트 파일의로드 시간에 대한 이 답변 에 설명 된 것처럼 더 나은 성능을 제공하는 몇 가지 새로운 방법이 있습니다 .

Steve Souders (클라이언트 측 성능 전문가)의 다음과 같은 훌륭한 슬라이드 가 있습니다.

  • 외부 JavaScript 파일을 병렬로로드하는 다양한 기술
  • 로딩 시간 및 페이지 렌더링에 미치는 영향
  • 브라우저에 표시되는 "진행 중"표시기 (예 : 상태 표시 줄에 '로드 중', 모래 시계 마우스 커서)

25

JQuery를 사용 $(document).ready()하는 경우 가장 좋은 곳에 자바 스크립트를 배치하고 함수를 실행하기 전에 항목이 올바르게로드되는지 확인하십시오.

참고 사항 : <head>섹션의 모든 스크립트 태그 가 가장 깨끗한 위치 인 것처럼 보입니다.


14
머리 속에 ... 어? <header>?
Dan Lugg

7
을 사용 $(document).ready()한다고해서 JavaScript 를 원하는 곳에 놓을 수있는 것은 아닙니다 . <script src=".../jquery.min.js">jQuery를 포함 하는 곳에 JavaScript 를 배치해야 $합니다.
Rory O'Kane

2
<head> 섹션에 스크립트 태그를 넣는 것이 가장 좋지 않습니다. 이렇게하면 스크립트가로드 될 때까지 페이지의 보이는 부분이 표시되지 않습니다.
CyberMonk

아니요, @Dan, header요소는 HTML 문서 내용의 일부이며 body요소 . The head 태그 내에서 한 번 이상 발생해야합니다 (문서의 메타 데이터 및 비 내용 데이터). 그것은으로, 요즘 deferasync스크립트 태그위한 이상적인 장소. header요소는 그 뒤에 나오는 문서의 섹션을 설명하는 정보 만 포함해야합니다.
ProfK

1
@ProfK, Dan은 4 년 전에 이것을 게시했을 때 원래의 편집되지 않은 질문을 언급하고있었습니다. 보시다시피 질문은 1 년 후에 편집되었습니다.
kojow7

18

2019 년의 최신 접근 방식은 ES6 모듈 유형 스크립트를 사용하는 것 입니다.

<script type="module" src="..."></script>

기본적으로 모듈은 비동기 적으로로드되고 지연됩니다. 즉, 어느 곳에 나 배치 할 수 있으며 페이지로드가 끝나면 병렬로로드되어 실행됩니다.

스크립트와 모듈의 차이점은 다음과 같습니다.

https://stackoverflow.com/a/53821485/731548

스크립트와 비교 한 모듈 실행은 다음과 같습니다.

https://developers.google.com/web/fundamentals/primers/modules#defer

지원은 다음과 같습니다.

https://caniuse.com/#feat=es6-module


지식베이스에 추가하기 좋은 정보
Sagar

1
서버가없는 로컬 파일 시스템에서 물건을 시험해 보는 경우에는 작동하지 않습니다. Chrome에서 파일 소스가 동일한 원본을 사용하더라도 HTML에서 js를로드하려고하면 교차 출처 오류가 발생합니다.
hippietrail

11

스크립트가 head 요소 이외의 다른 곳에 있으면 XHTML은 유효성을 검사하지 않습니다. 그것은 어디에나있을 수 있습니다.

jQuery와 같은 것을 사용하여 실행을 연기 할 수 있으므로 구문 분석 중 약간의 성능 저하를 제외하고는 위치에 관계가 없습니다.


1
XHTML은 본문에서 스크립트 태그를 사용하여 엄격하고 과도하게 유효성을 검사합니다. 그러나 스타일 태그는 헤드에만있을 수 있습니다.
I.devries

11
<script src="myjs.js"></script>
</body>

스크립트 태그 전에 항상 사용할 수 있어야 몸 가까이 또는 HTML의에서 아래 파일.

그런 다음 js 파일을 로드하기 전에 페이지의 내용을 먼저 볼 수 있습니다 .

필요한 경우 이것을 확인하십시오 : http://stevesouders.com/hpws/rule-js-bottom.php


2
이것은 실제로 질문에 대답했습니다. 나는 게시 된 거의 모든 예제들이 "페이지의 끝"에 대한 적절한 시각적 맥락을 보여주지 않을까 궁금했습니다.
Ken Ingram

1
이 답변은 매우 오해의 소지가 있으며 아마도 잘못된 것입니다. GoogleMDN 의 기사에 따르면 동기 JS (여기의 경우)는 항상 DOM 생성 및 구문 분석을 차단하여 첫 렌더링이 지연됩니다. 따라서 JS 파일이 동기되어있는 한 JS 파일을 HTML 문서에 배치하는 위치에 관계없이 JS 파일을 가져 와서 실행이 완료 될 때까지 페이지의 내용을 볼 수 없습니다.
Lingaraju EV

또한 2009 년에 작성되었으며 더 이상 관련이없는 사항을 참조합니다.
toxaq

7

기존의 (그리고 널리 받아 들여지는) 대답은 "하단에"있습니다. 왜냐하면 모든 DOM이 실행되기 전에 전체 DOM이로드되기 때문입니다.

여러 가지 이유로, 페이지 온로드 이벤트로 의도적으로 실행을 시작하는 사용 가능한 연습으로 시작하는 반대 의견이 있습니다.


6

넣어 최고의 장소 <script>태그를 닫기 전에이다 </body>태그 , 다운로드, 그래서 그것이 문서의 HTML을 구문 분석 브라우저를 차단하지 않습니다 실행

또한 외부 적 자신의 장점을 한 JS 파일을로드 좋아이 될 것입니다 브라우저 캐시를 할 수 있습니다 페이지로드 시간을 단축 , 그것은 되는 HTML과 자바 스크립트 코드를 분리 하고 더 나은 코드베이스를 관리하는 데 도움을 .

그러나 최신 브라우저는 외부 파일 async과 같은 다른 최적의 방법도 지원 합니다.deferjavascript

비동기 및 지연

일반적으로 HTML 페이지 실행은 한 줄씩 시작합니다. 외부 JavaScript 요소가 발견되면 JavaScript를 다운로드하여 실행할 준비가 될 때까지 HTML 구문 분석이 중지됩니다. 이 일반 페이지 실행은 deferasync속성을 사용하여 변경할 수 있습니다 .

Defer

지연 속성이 사용되면 JavaScript는 HTML 구문 분석과 병렬로 다운로드되지만 전체 HTML 구문 분석이 완료된 후에 만 ​​실행됩니다.

<script src="/local-js-path/myScript.js" defer></script>

Async

비동기 속성이 사용되면 스크립트가 발생하자마자 JavaScript가 다운로드되고 다운로드 후에는 HTML 구문 분석과 함께 비동기 적으로 (병렬로) 실행됩니다.

<script src="/local-js-path/myScript.js" async></script>

어떤 속성을 사용하는 경우

  • 스크립트가 다른 스크립트와 독립적이고 모듈 식인 경우을 사용하십시오 async.
  • script1과 script2를로로드하는 경우 async둘 다
    HTML 파싱과 함께 다운로드
    되어 사용 가능한 즉시 병렬로 실행 됩니다.
  • 스크립트가 다른 스크립트에 의존하는 경우 defer두 가지 모두에 사용하십시오 .
  • script1 및 script2가로 순서대로로드되면 script1 defer이 먼저 실행되도록 보장됩니다.
  • 그런 다음 script1이 완전히 실행 된 후 script2가 실행됩니다.
  • script2가 script1에 종속 된 경우이를 수행해야합니다.
  • 스크립트가 충분히 작고 다른 유형의 스크립트에 종속 된 async경우 속성없이 스크립트를 사용하여 모든 async스크립트 위에 배치하십시오 .

참조 : knowledgehills.com


3

페이지 스타일을 지정하는 데 필요한 스크립트를로드하거나 페이지에서 동작 (예 : 버튼 클릭)을 사용하는 경우 상단에 배치하는 것이 좋습니다. 스타일이 100 % CSS이고 버튼 동작에 대한 모든 대체 옵션이있는 경우 아래쪽에 배치 할 수 있습니다.

또는 가장 좋은 점은 모달 로딩 상자를 만들고 페이지 하단에 자바 스크립트를 배치하고 스크립트의 마지막 줄이로드되면 사라질 수 있다는 것입니다. 이렇게하면 스크립트를로드하기 전에 페이지에서 사용자가 작업을 사용하지 않도록 할 수 있습니다. 또한 부적절한 스타일을 피하십시오.


3

끝에 스크립트를 포함하는 것은 주로 웹 사이트의 내용 / 스타일이 먼저 표시 될 때 사용됩니다.

헤드에 스크립트를 포함하면 스크립트가 조기에로드되고 전체 웹 사이트를로드하기 전에 사용할 수 있습니다.

스크립트가 마지막에 입력되면 전체 스타일과 디자인을로드 한 후에 만 ​​유효성 검사가 수행되며 빠른 반응 형 웹 사이트에는 적합하지 않습니다.


2

스크립트와 사용법에 따라 (페이지로드 및 렌더링 시간 측면에서) 최상의 <script>-태그를 사용하지 않고 스크립트로드를 비동기 적으로 동적으로 트리거하는 것이 가장 좋습니다.

몇 가지 다른 기술이 있지만 가장 간단한 방법은 window.onload 이벤트가 트리거 될 때 document.createElement ( "script")를 사용하는 것입니다. 그런 다음 페이지 자체가 렌더링 될 때 스크립트가 먼저로드되므로 사용자가 페이지가 나타날 때까지 기다려야하는 시간에 영향을 미치지 않습니다.

이를 위해서는 페이지 렌더링에 스크립트 자체가 필요하지 않습니다.

자세한 내용 은 Steve Souders (YSlow 제작자이지만 현재는 Google) 의 Post Coupling async scripts 를 참조하십시오 .


2
  • IE <10의 지원 및 성능에 여전히 많은 관심이 있다면 항상 스크립트 태그를 HTML 본문의 마지막 태그로 만드는 것이 가장 좋습니다. 그렇게하면 나머지 DOM이로드되었고 차단 및 렌더링되지 않을 것입니다.

  • IE <10에 대해 더 이상 신경 쓰지 않는다면 스크립트를 문서의 머리에 defer넣고 DOM 이로 드 된 후에 만 스크립트를 실행 하는 것이 좋습니다 ( <script type="text/javascript" src="path/to/script1.js" defer></script>). 그래도 IE <10에서 코드가 작동하도록하려면 코드를 window.onload짝수로 묶어야합니다.


받아 들여진 대답에서 이것은“추천 된 권고”라고합니다. 여전히 그것을 의미한다면, 아마도 그것을 뒷받침하는 참조를 만들어야합니다.
dakab

1

스크립트는로드 및 실행될 때까지 DOM로드를 차단합니다.

<body>모든 DOM 끝에 스크립트를 배치하면 모든 DOM이로드되고 렌더링 될 수 있습니다 (페이지가 "빠르게 표시됩니다"). <script>모든 DOM 요소에 액세스 할 수 있습니다.

반면에 <body>시작 이후에 배치하면 스크립트가 실행됩니다 (DOM 요소가없는 경우).

jQuery를 포함하고 있습니다. 즉, 원하는 곳에 배치하고 .ready ()


1

웹 페이지 실행에 달려 있다고 생각합니다. 표시하려는 페이지가 먼저 JavaScript를로드하지 않고 제대로 표시되지 않으면 먼저 JavaScript 파일을 포함시켜야합니다. 그러나 처음 JavaScript 파일을 다운로드하지 않고 웹 페이지를 표시 / 렌더링 할 수 있으면 페이지 하단에 JavaScript 코드를 넣어야합니다. 빠른 페이지로드를 에뮬레이트하므로 사용자의 입장에서는 해당 페이지가 더 빨리로드되는 것처럼 보입니다.


1

당신은 대부분 배치 할 수 <script>의 끝에서 참조를 <body>,
외부 스크립트를 사용하는 페이지에 활성 구성 요소가있는 경우 그러나
(이상적으로 머리 태그에) 그 전에 와야한다 그들의 의존성 (JS 파일).



-1

HTML 문서의 끝에서

따라서 실행시 브라우저에서 HTML 문서를로드하는 데 영향을 미치지 않습니다.


-1

JavaScript코드 를 작성하기에 가장 좋은 위치 는 </body>태그의 바로 앞이나 뒤에 문서 를로드 한 다음 js 코드를 실행하는 것입니다.

<script> ... your code here ... </script>
</body>

그리고 JQuery다음 을 쓰면 헤드 문서에있을 수 있으며 문서가로드 된 후 실행됩니다.

<script>
$(document).ready(function(){
   //your code here...
});
</script>

그것은 던져SyntaxError
Raz

귀하의 답변은 틀리지 않았지만 업데이트가 절실히 필요했습니다.
Paul Carlton

-2

HTML 뒤에 스크립트를 포함시키는 것이 더 합리적입니다. 대부분의 경우 스크립트를 실행하기 전에 Dom을로드해야합니다. 헤드 태그에 넣을 수는 있지만 모든 문서 로딩 리스너 오버 헤드가 마음에 들지 않습니다. 코드가 짧고 달콤하고 읽기 쉽기를 원합니다.

헤드 태그 외부에 스크립트를 추가 할 때 이전 버전의 사파리가 엉뚱하다고 들었지만 누가 신경 쓰는지 말합니다. 나는 그 오래된 쓰레기를 사용하는 사람을 모른다.

그런데 좋은 질문입니다.


-6

스크립트를 원하는 곳에 배치 할 수 있으며 하나는 다른 방법보다 낫지 않습니다.

상황은 다음과 같습니다.

페이지는 선형으로 "하향식"으로로드되므로 스크립트를 헤드에 넣으면 스크립트가 모든 것보다 먼저로드되기 시작합니다. 이제 코드와 혼합 된 본문에 스크립트를 넣으면 페이지가보기 흉한 방식으로로드 될 수 있습니다.

모범 사례가 어디에 의존하지 않는지 확인하십시오.

귀하를 지원하기 위해 다음을 언급 할 것입니다.

당신은 배치 할 수 있습니다 :

페이지가 선형으로로드됩니다

다른 컨텐츠와 함께 페이지가 비동기 적으로로드 됨

스크립트로드가 완료되기 전과 후에 페이지의 내용이로드됩니다.

좋은 습관은 언제 구현할 것인가?

도움이 되었기를 바랍니다.이 문제에 대한 답변 만 있으면됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.