성능을 최적화하기 위해 Javascript를 페이지에로드하는 가장 좋은 방법은 무엇입니까?


답변:


14

당신이 할 수있는 몇 가지가 있습니다 :

  1. 자바 스크립트 전에 HTML과 CSS를로드하십시오. 이를 통해 브라우저는 페이지를 레이아웃하고 렌더링하는 데 필요한 모든 것을 제공합니다. 이를 통해 사용자는 페이지가 거칠다는 인상을받습니다. 스크립트 태그 또는 블록을 가능한 한 닫는 본문 태그에 가깝게 배치하십시오.

  2. CDN 사용을 고려하십시오. JQuery와 같은 인기있는 라이브러리를 사용하는 경우 많은 회사 (예 : google, yahoo)가 라이브러리를로드하는 데 사용할 수있는 무료 CDN을 운영합니다.

  3. 내장 된 스크립트 대신 외부 파일에서 코드를로드하십시오. 이를 통해 브라우저는 JS 컨텐츠를 캐시하고 전혀로드하지 않아도됩니다. 연속적인 페이지 로딩이 더 빠릅니다.

  4. 웹 서버에서 zip 압축을 켭니다.

Yahoo에는 페이지로드 시간을 줄이는 데 도움 이되는 훌륭한 제안 페이지 가 있습니다.


1
Yahoo는 또한 Firefox 용 YSlow 플러그인을 배포하여 위에서 언급 한 모범 사례와 비교하여 페이지를 분석하고 보고서 카드를 제공합니다.
Alan

1
페이지가 처음 렌더링 될 때 스크립트를로드하지 않아도되는 사이트 요소가있는 경우 사용할 수있는 비동기 로딩과 같은 기술도 있습니다. 이것과 스크립트를 페이지 하단 가까이에 두는 것은 한계가 있습니다. 어떤 경우에는 문서 헤드에 JS를로드해야합니다.
JasonBirch

7

Minifing 외에도 gziping 및 CDNing (새로운 단어?). 로드 지연을 고려해야합니다. 기본적으로이 작업은 스크립트를 동적으로 추가하고 차단을 방지하여 병렬 다운로드를 허용합니다.

그것을하는 많은 방법이 있습니다, 이것은 내가 선호하는 방법입니다

<script type="text/javascript">
    function AttachScript(src) {
        window._sf_endpt=(new Date()).getTime();
        var script = document.createElement("script");
        document.getElementsByTagName("body")[0].appendChild(script);
        script.src = src;
    }
    AttachScript("/js/scripts.js");
    AttachScript("http://www.google-analytics.com/ga.js");
</script>

닫는 body 태그 바로 앞에 이것을 배치하고 AttachScript를 사용하여 모든 js 파일을로드하십시오.
더 많은 정보는 여기 http://www.stevesouders.com/blog/2009/04/27/loading-scripts-without-blocking/


1
CDNing을 훔쳤습니다. 그것은 캐나다 무언가를하는 것을 의미하는 것으로 간주된다! ;)
JasonBirch

jajajaja 좋은 하나
붕괴 자

7

Google이 웹 로그 분석을로드하는 방식도 살펴볼 수 있습니다.

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-xxxxxxx-x']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

"모범 사례"스크립트 유형으로 간주되므로
http://www.stevesouders.com/blog/2009/12/01/google-analytics-goes-async/


3

두 명의 Google 직원이 Velocity 2010에서 Diffable 이라는 새로운 오픈 소스 프로젝트를 발표했습니다 . Diffable은 새로운 버전이 출시 될 때 전체 새 파일을 보내지 않고 사용자 캐시에 저장된 버전 이후에 변경된 JS, HTML 및 CSS 부분 만 증분 적으로 게시하기 위해 약간의 마술을 수행합니다.

이 기술은 멋지다. 코드 변경이 빈번한 대규모 JavaScript 코드 기반을 사용하는 웹 사이트에서 현재 가장 효과적이고 노력할 가치가있다. 이는 매주 화요일 에 최소 한 번의 릴리스 를 거치며 매년 평균 약 100 개의 새로운 릴리스 를 수행하는 Google지도와 같은 애플리케이션에 적용됩니다 . HTML5 로컬 스토리지가 널리 보급되면 일반적으로 의미가 있습니다.

BTW, 구글의 마이클 존스가 (지리 공간적 맥락에서) 변화에 대해 이야기하는 것을 보지 못했다면 GeoWeb 2009에서 그의 기조 연설 전체를 볼 가치가 있습니다.


1

이 질문에 대한 업데이트를 제공합니다. 현대에서는 비 블로킹로드 방법이 더 이상 필요하지 않다고 생각합니다. 브라우저가 자동으로 수행합니다.

StackOverflow에 질문을 추가했습니다. 여기에도 내용을 추가하겠습니다.

유일한 차이점은로드 이벤트가 조금 일찍 발생하지만 파일로드 자체는 동일하게 유지된다는 것입니다. 또한 비 블로킹 스크립트로 onload가 더 일찍 시작 되더라도 JS 파일이 더 일찍 시작되었다는 의미는 아닙니다. 제 경우에는 정상적인 설정이 가장 잘 나왔습니다.

이제 스크립트는 다음과 같습니다.

<script>
(function () {
    var styles = JSON.parse(myObject.styles);
    for( name in styles ){
        var link  = document.createElement('link');
        link.setAttribute('rel', 'stylesheet');
        link.setAttribute('type', 'text/css');
        link.setAttribute('href', styles[name]);
        document.getElementsByTagName('head')[0].appendChild(link);
    }

    var scripts = JSON.parse(myObject.scripts);
    for( name in scripts ){
        var e = document.createElement('script');
        e.src = scripts[name];
        e.async = true;
        document.getElementsByTagName('head')[0].appendChild(e);
    }
}());
</script>

myObject.styles 여기에 모든 파일의 모든 URL을 보유하는 객체 일뿐입니다.

3 테스트를 실행했으며 결과는 다음과 같습니다.

일반 설정

머리에 CSS가 있고 페이지가 아래쪽에 자바 스크립트

이것은 일반적인 설정이며 헤드에는 4 개의 CSS 파일이 있고 페이지 하단에는 3 개의 CSS 파일이 있습니다.

이제 막는 것이 보이지 않습니다. 내가 보는 것은 모든 것이 동시에로드됩니다.

비 차단 JS

비 차단 자바 스크립트로 페이지로드

이제 이것을 조금 더 진행하기 위해 js 파일 만 비 차단으로 만들었습니다. 이것은 위의 스크립트와 함께합니다. 갑자기 CSS 파일이로드를 차단하고 있음을 알았습니다. 첫 번째 예제에서 아무것도 차단하지 않기 때문에 이상합니다. CSS가 갑자기 부하를 차단하는 이유는 무엇입니까?

모든 비 차단

모든 비 차단 페이지로드

마지막으로 모든 외부 파일이 비 차단 방식으로로드되는 테스트를 수행했습니다. 이제 첫 번째 방법과 차이가 없습니다. 둘 다 똑같이 보입니다.

결론

내 결론은 파일이 이미 차단되지 않은 방식으로로드되었다는 것입니다. 특별한 스크립트를 추가 할 필요가 없습니다.

아니면 여기에 뭔가 빠졌습니까?

더:


차이점은 파란색 선의 위치이며 페이지가 렌더링되기 시작할 때입니다. 최종 사용자의 관점에서 볼 때 이것은 페이지가 "로드"될 때입니다. 첫 번째 예에서는 마지막 JS 파일이로드 된 후 900ms 표시에서 렌더링이 시작됩니다. 두 번째로 스타일 시트가로드 된 후 (~ 700ms)입니다. 세 번째는 HTML이 다운로드 된 후 (~ 500ms)입니다. 페이지 렌더링 후에 CSS로드를 실제로 원하지 않기 때문에 여전히 두 번째 접근법을 사용합니다.
팀 분수
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.