HTML 파일에서 JavaScript를 어디에 두어야합니까?


210

대략 100kb 정도의 압축 된 JavaScript 파일이 있다고 가정 해 봅시다. 파일 <script src="...">은 HTML 자체에 붙여 넣지 않고 를 통해 연결되는 외부 파일임을 의미합니다 .

이것을 HTML에 넣을 가장 좋은 곳은 어디입니까?

<html>
<head>
    <!-- here? -->
    <link rel="stylesheet" href="stylez.css" type="text/css" />
    <!-- here? -->
</head>
<body>
    <!-- here? -->
    <p>All the page content ...</p>
    <!-- or here? -->
</body>
</html>

각 옵션마다 기능상의 차이가 있습니까?


답변:


175

야후! 뛰어난 성능 팀 은 브라우저가 구성 요소를 다운로드하는 방식으로 인해 페이지 하단에 스크립트를 배치 할 것을 권장 합니다.

물론 Levi의 의견은 "필요하기 전에 더 이상은 아닙니다"는 실제로 정답입니다. 즉 "의존"입니다.


4
예를 들어 많은 jQuery 작업을 수행하려면 실제로 사용하기 전에 라이브러리를로드해야합니다.
BryanH

58
또한 Yahoo EPT가 JS를 맨 아래에 배치하도록 권장하는 이유는 JS가로드 된 후 실행되는 동안 브라우저가 단일 스레드 모드로 전환되어야하기 때문입니다. 스크립트가 컨텐츠의 헤드 또는 중간에있는 경우 브라우저는 JS를 처리하는 동안 "일시 정지"합니다. JS를 맨 아래에두면 컨텐츠가로드되고 일반적으로 표시되므로 브라우저가 여전히 JS를 처리하는 동안 사용자가 읽을 수 있습니다.
BryanH

1
안녕하세요. $(function () {...})페이지 하단에 이와 같은 코드를 넣 <head>습니까 , 아니면 내부에 있어야 합니까?
Thang Pham

7
여기서 "페이지 하단"에 대한 언급 이 끝나지 않기를 바랍니다 </body>.
Mr_Green

1
최신 브라우저는 "지연"속성을 읽을 수도 있습니다. <body>의 맨 아래에 있지 않은 스크립트 태그에 defer = "defer"를 설정할 수 있으며 브라우저에서 해당 태그를 볼 때 먼저 나머지 HTML을로드 한 다음 돌아가서 내용을 해석합니다. 스크립트 태그 페이지를 완전히 제어 할 수없는 일종의 프레임 워크를 사용하는 경우에 유용합니다. 이 기사를
보라

75

가장 좋은 곳은 바로 전에 필요합니다.

또한 사용자의 실제 위치에 따라 Amazon S3 서비스와 같은 서비스를 사용하면 사용자가 서버보다 물리적으로 가까운 서버에서 서버를 다운로드하는 데 도움이 될 수 있습니다.

js 스크립트가 jQuery 또는 프로토 타입과 같이 일반적으로 사용되는 라이브러리입니까? 그렇다면 Google 및 Yahoo와 같은 여러 회사에서 분산 네트워크에서 이러한 파일을 제공하는 도구가 있습니다.


60

일반적으로 <script>태그 를 배치하는 가장 좋은 위치는 태그 바로 앞에 페이지 하단입니다 </body>. 이 같은:

<html>
    <head>
        <title>My awesome page</title>

        <!-- CSS -->
        <link rel="stylesheet" type="text/css" href="...">
        <link rel="stylesheet" type="text/css" href="...">
        <link rel="stylesheet" type="text/css" href="...">
        <link rel="stylesheet" type="text/css" href="...">

    </head>
    <body>
        <!-- Content content content -->

        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
        <script type="text/javascript" src="..."></script>
        <script type="text/javascript" src="..."></script>
        <script type="text/javascript" src="..."></script>
    </body>
</html>

왜?

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

CSS

주제를 조금 벗어 났지만 ... 스타일 시트를 맨 위에 놓습니다.

Yahoo!에서 성능을 조사하는 동안 스타일 시트를 문서 HEAD로 이동하면 페이지가 더 빨리로드되는 것으로 나타났습니다. HEAD에 스타일 시트를 넣으면 페이지가 점진적으로 렌더링 될 수 있기 때문입니다. 더...

추가 자료

야후는 웹 사이트 속도를 높이기위한 모범 사례를 소개하는 정말 멋진 안내서를 발표했습니다. 꼭 읽을 가치가 있습니다 : https://developer.yahoo.com/performance/rules.html


1
"스크립트로 인한 문제는 병렬 다운로드를 차단한다는 것입니다." — 더 이상 사실이 아닙니다. w3.org/TR/html5/scripting-1.html#attr-script-async
Quentin

4

100k Javascript를 사용하면 파일 안에 넣지 말아야합니다. 외부 스크립트 Javascript 파일을 사용하십시오. 한 번의 HTML 페이지에서만이 정도의 코드 만 사용하게 될 가능성은 없습니다. Javascript 파일을 어디에로드해야하는지 묻는 것일 수 있습니다. 이미 만족스러운 답변을 받았습니다.

그러나 일반적으로 최신 브라우저는 gzip ped Javascript 파일을 허용 합니다. x.js파일을 gzip으로 압축하고 속성 x.js.gz에서 해당 파일을 가리 킵니다 src. 로컬 파일 시스템에서는 작동하지 않으므로 작동하려면 웹 서버가 필요합니다. 그러나 전송 된 바이트의 절약은 막대 할 수 있습니다.

Firefox 3, MSIE 7, Opera 9 및 Chrome에서 성공적으로 테스트했습니다. Safari 3에서는 이런 식으로 작동하지 않는 것 같습니다.

자세한 내용은 이 블로그 게시물을 참조하십시오 . 그럼에도 불구하고 웹 서버가 브라우저에서 gzipped Javascript를 허용 할 수 있는지 여부를 웹 서버가 감지 할 수 있기 때문에 유용한 매우 오래된 또 다른 페이지참조하십시오 . 서버 측에서 gzip 또는 일반 텍스트를 동적으로 보내도록 선택할 수 있으면 모든 웹 브라우저에서 페이지를 사용할 수 있습니다.


8
OP의 질문을 오해했습니다. 그는 HTML에서 스크립트 태그를 어디에 넣을 것인지 묻고있었습니다. 그는 이미 스크립트를 인라인하지 않고 외부 파일을 사용하고있었습니다. 분명히, 이것은 '09 년 4 월에 질문을 편집하기 전에 명확하지 않았습니다. 이 답변을 삭제 하시겠습니까?
Mark Amery

@Leandro 사람들이 항상 실제 질문을 염두에 두지는 않지만 여전히이 질문과 같은 답변을 고려하기 때문이라고 생각합니다. 그럼에도 불구하고이 답변 유용하지만 반드시 관련이있는 것은 아닙니다. 투표 도구 설명에 '이 답변은 유용하고 관련이 있습니다'와 같이보다 명확한 문구가 포함되어 있으면 더 효과적 일 수 있습니다.
WynandB

1
gzipped Javascript : 웹 서버를 압축하도록 구성 할 수도 있습니다 ... (또는 nginx의 gzip_static 모듈 / 옵션과 같은 것을 사용하십시오) (그리고 다른 클라이언트를 위해 gunzip을 사용하십시오) 적어도 올바른 내용 유형 헤더를 보내야합니다. GZIP으로 표시 인코딩 가능성이 더 나은 브라우저 지원의 결과
게르트 반 베르그 덴

4

자바 스크립트를 맨 위에두면 깔끔한 것처럼 보이지만 기능적으로는 HTML을 따르는 것이 좋습니다. 그렇게하면 자바 스크립트가 실행되지 않고 HTML 요소가로드되기 전에 참조하려고합니다. 이러한 종류의 문제는 실제 인터넷 연결, 특히 느린 연결을 통해 페이지를로드 할 때만 분명해집니다.

다른 모든 자바 스크립트 코드에서 헤더 요소를 추가하여 자바 스크립트를 동적으로로드 할 수도 있지만, 항상 모든 코드를 사용하지 않는 경우에만 의미가 있습니다.


3

cuzillion 을 사용하면 인라인, 외부, "HTML 태그", "document.write", "JS DOM 요소", "iframe"및 "XHR eval"과 같은 다른 방법을 사용하여 스크립트 태그의 다른 배치의 페이지로드에 대한 영향을 테스트 할 수 있습니다. . 차이점에 대한 설명은 도움말 을 참조하십시오 . 또한 스타일 시트, 이미지 및 iframe을 테스트 할 수 있습니다.


1

대답은 자바 스크립트의 객체를 어떻게 사용하고 있는지에 달려 있습니다. 이미 지적한 것처럼 헤더가 아닌 바닥 글에 자바 스크립트 파일을로드하면 성능이 확실히 향상되지만 사용되는 객체가 바닥 글에로드 된 것보다 늦게 초기화되어야합니다. 또 다른 방법은 모든 파일에서 사용할 수있는 폴더에있는 'js'파일을로드하는 것입니다.


0

다른 사람들이 말했듯이 외부 파일로 이동해야합니다. <head /> 끝에 이러한 파일을 포함하는 것을 선호합니다. 이 방법은 기계 친화적보다 인간 친화적이지만 JS의 위치를 ​​항상 알고 있습니다. 스크립트 파일을 다른 곳 (imho)에 포함시키는 것은 읽기 쉽지 않습니다.

나는 당신이 정말로 모든 마지막 ms를 짜 내야한다. 그러면 아마 야후의 말을해야 할 것이다.


0

스크립트는 body 태그의 끝에 포함되어야합니다. 이렇게하면 브라우저에서 HTML을 구문 분석하고 스크립트가로드되기 전에 표시됩니다.


0

질문에 대한 대답은 다릅니다. 이 상황에는 두 가지 시나리오가 있으며 적절한 시나리오를 기반으로 선택해야합니다.

시나리오 1-중요 스크립트 / 필수 스크립트

사용중인 스크립트가 웹 사이트를로드하는 데 중요한 경우 HTML 문서 맨 위에 배치하는 것이 좋습니다 (예 :) <head>. 응용 프로그램 코드, 부트 스트랩, 글꼴 등이 여기에 해당합니다.

시나리오 2-덜 중요 / 분석 스크립트

웹 사이트의보기에 영향을 미치지 않는 스크립트도 사용됩니다. 이러한 스크립트는 모든 중요한 세그먼트가로드 된 후에로드하는 것이 좋습니다. 그에 대한 답은 문서의 맨 아래, 즉 <body>닫는 태그 앞의 맨 아래에 있습니다 . 몇 가지 예에는 Google 분석, hotjar 등이 포함됩니다.

보너스-비동기 / 지연

또한 브라우저에 다른 스크립트와 동시에 스크립트로드를 수행 할 수 있으며 스크립트 코드에서 지연 / 비동기 인수를 사용하여 브라우저의 선택에 따라로드 할 수 있다고 브라우저에 알릴 수 있습니다.

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


-1

자바 스크립트 링크는 헤드 또는 바디 태그의 끝에있을 수 있지만, 바디 태그의 끝에 링크를 넣어서 성능을 향상시키는 것은 사실이지만, 성능에 문제가없는 한 헤드에 배치하는 것이 더 좋습니다 사람들이 읽고 링크의 위치를 ​​알고 쉽게 참조 할 수 있습니다.


-1

Javascript 코드로 달성하려는 계획에 따라 다릅니다.

  • 외부 JS 스크립트를 삽입하려는 경우 가장 좋은 위치는 페이지 헤드입니다.
  • 스마트 폰에서 페이지를 사용하려는 경우 태그 바로 앞에 페이지 하단을 사용하십시오.
  • 그러나 HTML과 JS 조합 (예 : 동적으로 작성되고 채워진 HTML 테이블)을 작성하려는 경우 필요한 곳에 배치해야합니다.

내가 빼기 위해 말한 것!? 이런.
Ludus H

외부에있는 것은 스크립트를 머리에 두는 것과 어떤 관련이 있습니까? 페이지 하단이 스마트 폰 전용 스크립트를 작성하기에 좋은 이유는 무엇입니까? JS에서 HTML을 동적으로 생성하는 것에 대한 귀하의 진술은을 사용 document.write하는 경우에만 해당됩니다 .
Quentin

내가 생각한 것을 "추정"했는데 내 대답이 마이너스가 되었습니까? 당신은 아마 당신의 추정이 내 설명보다 낫다고 생각할 것입니다. 누군가가 이해할 수 없다면 더 많은 정보를 요구할 것입니다. 내 의견으로는 브라우저가 "단일 스레드"모드로 전환 할 필요가 없기 때문에 전체 페이지로드가 더 빠르기 때문에 본문 끝 직전에 JS를 스마트 폰 및 태블릿의 페이지 끝에 넣는 것이 좋습니다. 페이지 내용이 나타납니다. 화면에 ...하지만 당신은 아마 이것을 알고 있습니다.
Ludus H
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.