> 웹 프론트엔드 > JS 튜토리얼 > Javascript 모범 사례 로드_javascript 팁

Javascript 모범 사례 로드_javascript 팁

WBOY
풀어 주다: 2016-05-16 18:00:00
원래의
1000명이 탐색했습니다.

相信很多与页面打过交道的同学都对 Yahoo 的 Best Practices for Speeding Up Your Web Site 不陌生。而这 35 条最佳实践中,对 Javascript 的加载顺序的要求是:Put Scripts at the Bottom。因为根据 HTTP/1.1 specification 看来,在同一时间加载两个文件是最理想的,而 Javascript 脚本会阻碍平行下载。Steve 说那是 2008 – 2009 那个时代用的。现在,加载 Javascript 已经有了革命性的化变。

javascript-download

在开讲之前,有一个必须解决的问题是:为什么我们要把 JS 文件放在 之前的最底部。根本原因是,它不能平行下载。而其实并不是所有浏览器都不支持。现在大部分浏览器都支持 Script 的平行下载,除了老掉牙的 IE6&7、Firefox 2&3.0、 Safari 3、Chrome 1。但我们最熟悉的老掉牙同学 IE6 (或以IE为核的那些壳)还是中国(甚至世界上)市场上占用率最高的浏览器,因此我们需要一个折衷的方案。

一、分析

我们有6种方法可以实现平行(NON-Blocking)下载:

  • XHR Eval – 用 XHR 下载,并 eval() 执行 responseText.。
  • XHR Injection – 用 XHR 下载,在页面中动态创建一个 script 元素,并将 responseText 作为其 text
  • Script in Iframe – 把脚本放在 HTML 中,使用 ifame  来下载它。
  • Script DOM Element – 动态创建一个 script 元素,把 src 指向脚本URL.
  • Script Defer – 给 script 标添加 defer 属性
  • document.write Script Tag – 利用 document.write <script src=""> 添加到 HTML 中。但这个只对 IE 有效。

兼容性可看下图:

Technique Parallel Downloads Differ Existing Scripts Busy Indicators Ensures Order Size (bytes)
XHR Eval IE, FF, Saf, Chr, Op no no Saf, Chr - ~500
XHR Injection IE, FF, Saf, Chr, Op no yes Saf, Chr - ~500
Script in Iframe IE, FF, Saf, Chr, Op no no IE, FF, Saf, Chr - ~50
Script DOM Element IE, FF, Saf, Chr, Op yes yes FF, Saf, Chr FF, Op ~200
Script Defer IE, Saf4, Chr2, FF3.1 yes yes IE, FF, Saf, Chr, Op IE, FF, Saf, Chr, Op ~50
document.write Script Tag IE, Saf4, Chr2, Op yes yes IE, FF, Saf, Chr, Op IE, FF, Saf, Chr, Op ~100

2. 계획

어떤 솔루션을 사용해야 하나요? 그것은 모두 당신의 필요에 달려 있습니다. 이 다이어그램은 언제 어떤 방법을 사용해야 하는지 설명합니다.

0405-load-scripts-decision-tree-04

전반적으로 Script DOM Element가 더 나은 솔루션입니다. NCZ 블로그에서는 현재 최고의 기술은 다음과 같다고 언급했습니다:

  1. 두 개의 JavaScript 파일을 만듭니다. 첫 번째 파일은 Javascript를 동적으로 다운로드하는 코드만 제공하고 두 번째 파일에는 페이지에 필요한 다른 모든 스크립트에 대한 파일이 포함되어 있습니다.
  2. 좋아요 <script>는 페이지 본문의 첫 번째 파일( 앞의 )을 소개합니다.
  3. 두 번째 创建第二个 <script><script>를 생성하여 두 번째 Javascript 파일 및 기타 초기화 코드를 다운로드하는 기능을 실행합니다.

3. 구현 코드

위에서 언급한 기술을 기반으로 합니다. NCZ에서는 두 번째 파일을 동적으로 로드하기 위해 첫 번째 파일에 해당 코드만 포함할 것을 권장합니다.

코드 복사 코드는 다음과 같습니다. :

function loadScript(url, callback){

var script = document.createElement("script")
script.type = "text/javascript"

if (script.readyState){ //IE
script.onreadystatechange = function(){
if (script.readyState == "loaded" ||
script.readyState == "완료 ") {
script.onreadystatechange = null;
callback();
}
};
} else { //기타
script.onload = function(){
콜백();
}

script.src = url;
document.getElementsByTagName("head")[0].appendChild(script);


그런 다음 페이지에서 이 작업을 수행할 수 있습니다.


script type="text/ javascript">
loadScript("http://your.cdn.com/second.js", function(){
//코드 초기화
}); 🎜>


HTML5에서는 async 속성을 사용할 수 있습니다. 이 HTML 속성은 NON-Blocking 다운로드 기술에 필요한 기능을 정확하게 수행합니다. 현재 지원되는 브라우저는 많지 않지만(Firefox 3.6만?) 병렬로 다운로드해야 하는 Javascript(계획에 따르면 일반적으로 첫 번째 JS 파일임)에 이 속성을 추가해도 지원되지 않는 다른 브라우저에는 영향을 미치지 않습니다. 브라우저이므로 사용을 권장합니다.



코드 복사YUI3의 로더는 NCZ의 방식을 사용합니다. 그리고 알리페이에서. 우리도 비슷한 접근 방식을 사용했습니다. 여기서 간단히 얘기해보자.



코드 복사
코드는 다음과 같습니다.
🎜>

사용 시 Loader.use()를 사용하여 코드의 동적 로딩을 구현합니다. 물론 동적 로딩뿐만 아니라 특정 캐싱 메커니즘도 있습니다. 관련 콤보 서비스 기술을 확인해 보시길 추천드립니다. 현재 Alipay 프런트 엔드 아키텍처 팀의 작업자는 이 분야에서 상당한 진전을 이루었습니다(테스트 보고서에 따르면 속도가 매우 좋으며 적절한 시기에 오픈 소스로 제공될 수 있습니다).

5. 요약
프론트엔드 성능 최적화. 할 수 있는 일은 훨씬 더 많습니다. 그리고 HTML5 기술의 등장과 Javascript 기술의 지속적인 혁신으로 앞으로 기대할 것이 더 많아졌다고 생각합니다. 프론트엔드 여러분, 앞으로는 여러분이 이끌어야 할 일들이 많이 있습니다.

참고:
  1. 차단하지 않고 스크립트 로드
  2. 외부 JavaScript를 로드하는 가장 좋은 방법
  3. 스크립트 로딩의 진화
  4. 논블로킹 스크립트란 무엇인가요?
  5. HTML5 – 스크립팅: 비동기 속성
관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿