Jquery 코드가 머리글이나 바닥 글에 들어가야합니까?


답변:


189

모든 스크립트는 마지막에로드해야합니다

거의 모든 경우에있어 모든 스크립트 참조를 페이지의 끝에 페이지 바로 앞에 배치하는 것이 가장 좋습니다 </body>.

템플릿 문제 및 기타 사항으로 인해 그렇게 할 수없는 경우 deferHTML을 다운로드 한 후 브라우저가 스크립트를 다운로드 할 수 있도록 속성을 사용 하여 스크립트 태그를 장식하십시오 .

<script src="my.js" type="text/javascript" defer="defer"></script>

가장자리 케이스

일부 가장자리 경우 그러나, 당신은 페이지 깜박임 또는 일반적으로 단순히 귀하의 jQuery 스크립트 참조를 배치하여 해결할 수있는 페이지로드시 다른 유물 발생할 수있는 경우가 있습니다 <head>태그 없이defer 속성을. 이러한 경우에는 jQuery UI 및 기능의 일부로 DOM을 수정하는 jCarousel 또는 Treeview와 같은 기타 애드온이 포함됩니다.


추가 경고

폴리 필과 같이 DOM 또는 CSS 전에로드해야하는 라이브러리가 있습니다. Modernizr은 헤드 태그에 배치해야하는 라이브러리 중 하나 입니다.


5
음,이 사항을 고려하십시오 themeforest.net/item/portfolious-professional-business-template/...은 . jCarousel과 함께 jQuery를 사용하는 기능을 홈페이지에서 최근에 구입 한 사이트 테마입니다. 스크립트 블록을 헤드에서 파일 끝으로 옮길 때 회전 목마에 사용 된 이미지가 페이지로드 중에 한 번에 모두 표시되는 반면 스크립트 파일이 헤드에 있으면 페이지가보다 부드럽게로드되는 것을 알았습니다.
채드 레비

5
CSS를 사용하여 컨텐츠의 초기 상태를 설정하십시오. CSS는 머리 속에 들어가야합니다. 무언가 다른 것을 만들기 위해 무언가를 깨는 것은 해결책이 아닙니다. 방문자가 컨텐츠를 렌더링하기 전에 jQuery 및 모든 관련 플러그인이로드 될 때까지 기다려야하는 경우 컨텐츠를 볼 수있을만큼 오래 머 무르지 못할 수 있습니다.
던컨

9
ChadLevy가 옳습니다. jQuery 플러그인이에서 참조되는 경우 더 잘 작동하는 조건이 <head>있습니다. 마크 업이 콘텐츠를 정렬하는 jQuery 플러그인에 의존하는 경우 플러그인이로드 될 때까지 웹 페이지에 펑키 마크 업이 표시되므로 페이지 하단에 플러그인 참조를 배치하는 것은 의미가 없습니다. 규칙은 더 이상 작동하지 않을 때까지 따라야하며, 이때 규칙을 어기 게됩니다.
Robert Harvey

2
@ Duncan : 이상적으로는 모든 종속성을 제어 할 수있는 경우입니다. jQuery (특히 jQuery UI 및 기타 애드온과 같은 것)에 대한 것은 의도적으로 기능을 완벽하게 제어 할 수 없으므로 가시성 속성과 같은 것을 DOM 요소에 추가하여보다 우아하게로드 할 수없는 경우입니다 해당 요소를 사용하는 애드온은 해당 속성을 고려하지 않습니다. 때로는 원하는 방식으로 작업하기 위해 의존성을 얻는 것보다 간단한 규칙을 무시하는 것이 좋습니다.
채드 레비

2
@ 스테판 : jQuery 플러그인이 DOM을 조작 할 수 없다면 요점은 무엇입니까?
Robert Harvey

229

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

스크립트로 인한 문제는 병렬 다운로드를 차단한다는 것입니다. HTTP / 1.1 사양에서는 브라우저가 호스트 이름 당 2 개 이하의 구성 요소를 동시에 다운로드 할 것을 제안합니다. 여러 호스트 이름에서 이미지를 제공하는 경우 두 개 이상의 다운로드가 동시에 발생할 수 있습니다. 그러나 스크립트를 다운로드하는 동안 브라우저는 다른 호스트 이름에서도 다른 다운로드를 시작하지 않습니다. 어떤 상황에서는 스크립트를 맨 아래로 옮기기가 쉽지 않습니다. 예를 들어 스크립트가 document.write를 사용하여 페이지 내용의 일부를 삽입하면 페이지에서 더 아래로 이동할 수 없습니다. 범위 지정 문제가있을 수도 있습니다. 대부분의 경우 이러한 상황을 해결하는 방법이 있습니다.

종종 나타나는 대체 제안은 지연된 스크립트를 사용하는 것입니다. DEFER 속성은 스크립트에 document.write가 포함되어 있지 않으며 브라우저에서 렌더링을 계속할 수있는 단서입니다. 불행히도 Firefox는 DEFER 속성을 지원하지 않습니다. Internet Explorer에서 스크립트가 지연 될 수 있지만 원하는 만큼은 아닙니다. 스크립트를 연기 할 수 있으면 페이지 하단으로 이동할 수도 있습니다. 그러면 웹 페이지가 더 빨리로드됩니다.

편집 : Firefox는 버전 3.6 이후 DEFER 속성을 지원합니다.

출처 :


4
스크립트를 맨 위에 배치해야한다는 현대적인 조언을 보았습니다. 스크립트를 맨 아래에 배치하면 페이지 본문의 이미지 및 기타 컨텐츠를 병렬로로드 할 수 있지만 나중에 페이지의 스크립트를 효과적으로로드 할 수 있습니다. 브라우저가 알기 전에 전체 HTML 본문을 다운로드해야합니다. 로드 할 스크립트 URL 대부분의 사람들은 야후 가이드를 참조합니다. 더 이상 정확하지 않습니다. Firefox는 실제로 스크립트의 지연된 속성을 존중합니다. 상단의 지연은 측정시 페이지로드가 더 빨라질 것입니다.
ShadowChaser 2016 년

이 방법으로 페이지로드 속도에 대한 통계를 볼 수 있습니까?
Gabriel Alack

1
Firefox는 버전 3.6 이후 DEFER 속성을 지원합니다. 출처 : w3schools.com/tags/att_script_defer.asp
Nikita 웃

1
업데이트 : 2016 년 초중반 현재 모든 최신 브라우저는 호스트 이름 당 연결 수를 최소 6 개로 늘 렸습니다.
Night Owl

32

물론 CDN을 통해 헤드에 jQuery 자체 만로드하십시오.

왜? 일부 시나리오에서는 jQuery 종속 코드가 포함 된 부분 템플리트 (예 : 아약스 로그인 양식 스 니펫)를 포함 할 수 있습니다. jQuery가 페이지 하단에로드되면 "$ is not defined"오류가 발생합니다.

물론이 방법을 해결할 수있는 방법이 있습니다 (예 : JS를 포함하지 않고 하단로드 js 번들에 추가하는 것과 같이). 느리게로드 된 js의 자유를 잃고 jQuery 종속 코드를 원하는 곳에 배치 할 수있는 이유는 무엇입니까? Javascript 엔진은 jQuery가로드되는 것과 같은 종속성이 충족되는 한 DOM에서 코드가 어디에 있는지 신경 쓰지 않습니다.

공통 / 공유 js 파일의 경우 예를 들어 앞에 배치하십시오 </body>. 그러나 예외는 예외입니다. 예를 들어 html의 해당 지점에서 jQuery 종속 스 니펫 또는 파일 참조를 유지하는 것이 응용 프로그램 유지 관리 측면에서 실제로 의미가 있습니다.

헤드에 jquery를로드하는 성능 적중이 없습니다. 지구상의 어떤 브라우저가 캐시에 jQuery CDN 파일을 가지고 있지 않습니까?

jQuery를 머리에 붙이고 js의 자유를 통치하십시오.


1
많은 브라우저는 그렇지 않습니다. 약 2 %는 내가 읽은 가장 높은 수치입니다. 버전을 고려할 때 팩트 캐싱은 정확한 리소스 이름을 기반으로하므로 jquery1.4.2는 jquery1.7 또는 1.9.1과 동일하지 않습니다. .
토니 리

그 중 2%, 말, 절반은 처음으로 페이지가로드되기 전에 떠날 것이다. 이런 식으로 1%방문자를 잃지 만 잠재적으로 많은 개발 시간과 문제를 줄일 수 있습니다. 이것이 귀하의 비즈니스 모델에 맞는지 확인하십시오.
osa

13

님 부즈 는 관련된 문제에 대한 아주 좋은 설명을 제공하지만 최종 답변은 귀하의 페이지에 달려 있다고 생각합니다.

이미지 없이는 이해가되지 않는 페이지가 있지만, 중요하지 않은 사소한 스크립트 만 있습니다. 이 경우 스크립트를 맨 아래에 두는 것이 좋습니다. 따라서 사용자는 이미지를 더 빨리보고 페이지를 이해할 수 있습니다. 다른 페이지는 스크립팅을 통해 작동합니다. 이 경우 이미지가있는 작동하지 않는 페이지보다 이미지가없는 작동중인 페이지를 갖는 것이 좋습니다. 따라서 스크립트를 맨 위에 두는 것이 좋습니다.

고려해야 할 또 다른 사항은 스크립트가 일반적으로 이미지보다 작다는 것입니다. 물론 이것은 일반화이며 페이지에 적용되는지 확인해야합니다. 그렇다면 이미지가 스크립트를 지연시킬만큼 이미지를 지연시키지 않기 때문에 그것들을 경험에 근거하여 (즉, 달리할만한 이유가 없다면) 저에게 먼저 주장해야합니다. 마지막으로, 스크립트를 맨 앞에 놓는 것이 훨씬 쉽습니다. 스크립트를 사용해야 할 때 아직로드되었는지에 대해 걱정할 필요가 없기 때문입니다.

요약하면 기본적으로 스크립트를 맨 위에 배치하는 경향이 있으며 페이지가 완료된 후 스크립트를 맨 아래로 이동할 가치가 있는지 여부 만 고려합니다. 그것은 최적화입니다-나는 조기에하고 싶지 않습니다.


조기 최적화 인수를 끌어낼 때까지 그것은 사람들이 그 의미를 완전히 이해하지 않고 교리 적으로 따르는 또 다른 규칙입니다.
Robert Harvey

6
잘, 그들 모두를 이길 수 없습니다! 나는 그 의미를 이해한다고 믿습니다. :)
EMP

스크립트가로드되었는지 걱정할 필요가 없습니다. 스크립트가로드 될 때까지 블록을 렌더링합니다. 이는 대부분의 논의입니다. 로드하기 전에 아무 것도 호출하지 않는 한 괜찮습니다. 또한 콜백이 필요한 것이므로 실제로 페이지에 다른 내용을 포함해서는 안됩니다. 내가 이해하는 것처럼 이미지는 차단되지 않으며 (병렬로로드) 이미지가 완전히로드되기 전에 DOM이 준비되고 스크립트가 실행될 수 있습니다. 스크립트를 차단하지 않기 위해 스크립트를 먼저 배치하는 것은 이치에 맞지 않습니다.
던컨

4
일반적인 합의는 스크립트를 맨 아래에 두는 것이기 때문에 기본적으로 스크립트를 작성하는 것이 좋지 않고 문제가 발생하면 맨 위로 이동하는 것이 낫습니까? 거꾸로 일을하는 것이 이상해 보입니다. 지출 노력에 차이가 없다면 때로는 최적의 일을하는 것이 좋습니다 :)
Duncan

@ 던컨, 네, 그것은 저의 접근 방식이었습니다. 플러그인을 맨 아래에 놓고 문제가 발생했을 때 맨 위에 놓고 문제를 해결했습니다.
Robert Harvey

6

대부분의 jquery 코드는 문서 준비 상태에서 실행되며 페이지 끝까지 발생하지 않습니다. 또한 자바 스크립트 파싱 / 실행으로 페이지 렌더링이 지연 될 수 있으므로 모든 자바 스크립트를 페이지 하단에 배치하는 것이 가장 좋습니다.


5

표준 연습은 모든 스크립트를 페이지 맨 아래에 배치하는 것이지만 여러 jQuery 플러그인과 함께 ASP.NET MVC를 사용 <head>하고 마스터 섹션에 jQuery 스크립트를 넣으면 더 잘 작동한다는 것을 알았습니다. 페이지.

필자의 경우 스크립트가 페이지 하단에 있으면 페이지를로드 할 때 발생하는 아티팩트가 있습니다. jQuery TreeView 플러그인을 사용하고 있으며 처음에 스크립트가로드되지 않으면 플러그인이 필요한 CSS 클래스없이 트리가 렌더링됩니다. 따라서 페이지가 처음로드 될 때이 재미있는 엉망이 생기고 TreeView가 올바르게 렌더링됩니다. 아주 안 좋아. <head>마스터 페이지 의 섹션에 jQuery 플러그인을 넣으면 이 문제가 해결됩니다.


인트라넷은 인터넷과 동일한 조건이 적용되지 않으므로로드 지연이 덜 인식 될 수 있습니다. 그래도 규칙을 따르는 것이 좋습니다.
던컨

아닙니다. CSS 식별자 / 스타일을 마크 업에 넣으면 (jQuery가 DOM을 준비 할 때까지 기다리지 않고) 문제가 해결됩니다.
Dan Beam

1
@ Dan Beam : Treeview는 데이터베이스 테이블에서 채워지고 Treeview의 스타일은 테이블의 내용을 기반으로 Treeview 플러그인에 의해 설정되므로 작동하지 않습니다.
Robert Harvey

1
페이지 상단에 수정되지 않은 Treeview Plugin 스크립트를 넣을 수 있는데 왜 잘 작동합니까? 그건 말이 안 돼요, 댄
Robert Harvey

1
건배 Robert, 나는 또한 부분적으로 양식과 함께 ASP.NETMVC를 사용하고 있습니다. 새로운 필드가 부분이 실행될 때마다 (예 : 유효성 검사) 기능이 재 할당되므로 부분적으로 Javascript를 유지하는 것이 좋습니다. 내가 사용하려는 경우에만이 문제를 직면 @Html.Action동적 출력에 결과를 기록, 내 부분으로 부여합니다 $ is undefined부분을로드 ( 'Url.Action @') 내가 대신 .load 사용해야 의미한다. 그러나 이것은 추가 요청으로 인해 혼란을 낳습니다. 입력 내용을 기반으로 마스터 페이지에서 jQuery를 RenderBody () 위로 이동합니다.
Malkin

4

거의 모든 웹 사이트가 여전히 헤더 : D에 Jquery 및 기타 자바 스크립트를 배치하지만 stackoverflow.com도 확인하십시오.

또한 신체의 끝 태그 앞에 착용하는 것이 좋습니다. 어느 장소에 배치 한 후 로딩 시간을 확인할 수 있습니다. 스크립트 태그는 웹 페이지를 일시 중지하여 추가로로드합니다.

바닥 글에 자바 스크립트를 배치 한 후 자바 스크립트가로드 될 때까지 웹 페이지가 비정상적으로 보일 수 있으므로 헤더 섹션에 CSS를 배치하십시오.


2
그러나 스크립트에서 지연을 사용하여 동일한 결과를 얻을 수 있습니다. w3schools.com/tags/att_script_defer.asp
Jack Tuck

2

직전 </body>가장 좋은 장소에 따라입니다 야후 개발자 네트워크귀하의 웹 사이트 속도 향상을위한 최상의 방법 이 링크를 , 그것은 의미가 있습니다.

가장 좋은 방법은 직접 테스트하는 것입니다.


0

나에게 jQuery는 조금 특별하다. 아마도 표준에 대한 예외 일 수 있습니다. 그것에 의존하는 다른 스크립트가 너무 많아서 나중에로드하는 다른 스크립트가 의도대로 작동하도록 조기에로드하는 것이 중요합니다. 다른 사람이 지적 했듯이이 페이지조차도 헤드 섹션에 jQuery를로드합니다.

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