相信很多与页面打过交道的同学都对 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 已经有了革命性的化变。
在开讲之前,有一个必须解决的问题是:为什么我们要把 JS 文件放在 之前的最底部。根本原因是,它不能平行下载。而其实并不是所有浏览器都不支持。现在大部分浏览器都支持 Script 的平行下载,除了老掉牙的 IE6&7、Firefox 2&3.0、 Safari 3、Chrome 1。但我们最熟悉的老掉牙同学 IE6 (或以IE为核的那些壳)还是中国(甚至世界上)市场上占用率最高的浏览器,因此我们需要一个折衷的方案。
我们有6种方法可以实现平行(NON-Blocking)下载:
eval()
执行 responseText.。
src
指向脚本URL.
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 |
어떤 솔루션을 사용해야 하나요? 그것은 모두 당신의 필요에 달려 있습니다. 이 다이어그램은 언제 어떤 방법을 사용해야 하는지 설명합니다.
전반적으로 Script DOM Element가 더 나은 솔루션입니다. NCZ 블로그에서는 현재 최고의 기술은 다음과 같다고 언급했습니다:
<script>
는 페이지 본문의 첫 번째 파일( 앞의 )을 소개합니다.
두 번째 创建第二个 <script>
<script>
를 생성하여 두 번째 Javascript 파일 및 기타 초기화 코드를 다운로드하는 기능을 실행합니다. 위에서 언급한 기술을 기반으로 합니다. NCZ에서는 두 번째 파일을 동적으로 로드하기 위해 첫 번째 파일에 해당 코드만 포함할 것을 권장합니다.
script type="text/ javascript">
코드 복사
YUI3의 로더는 NCZ의 방식을 사용합니다. 그리고 알리페이에서. 우리도 비슷한 접근 방식을 사용했습니다. 여기서 간단히 얘기해보자.
코드 복사