css、js的相互阻塞


先決條件:腳本前面存在外部樣式

 以下試驗雖然是在chrome下,但是對於IE8+以及其他瀏覽器也適用。

 

1、內聯腳本(http://jsbin.com/mudab/1

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
  <script>var start = +new Date;</script>
  <link href="http://udacity-crp.herokuapp.com/style.css?rtt=2" rel="stylesheet">
  <script>
var end = +new Date;
console.log(end-start);
</script> </head> <body> <span></span> </body> </html>

控制台打印結果>2000,可以得出結論:外部樣式會阻塞后面內聯腳本的執行。

 

2、阻塞型外部腳本(http://jsbin.com/qeliri/1

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
  <script>var start = +new Date;</script>
  <link href="http://udacity-crp.herokuapp.com/style.css?rtt=2" rel="stylesheet">
  
</head>
  
<body>
  test
  <script src="http://udacity-crp.herokuapp.com/time.js?rtt=1&a"></script>
  <div id="result"></div>
  <script>var end = +new Date;document.getElementById("result").innerHTML = end-start;</script>
  
</body>
</html>

瀑布流中可以看出腳本和css並行加載,但是從js執行結果(js執行結果和打印時間基本同時出現,時間上可以相當於js執行時間)大於2000,可以得出結論:外部樣式不會阻止后面外部腳本的加載,但是外部腳本的執行必須等到css加載完畢。也就是說外部樣式不會阻塞外部腳本的加載,但會阻塞外部腳本的執行。

 

3、異步執行型外部腳本(http://jsbin.com/velat/1)

注:IE6-9不支持async(IE支持defer)。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
  <script>var start = +new Date;</script>
  <link href="http://udacity-crp.herokuapp.com/style.css?rtt=2" rel="stylesheet">
  
</head>
  
<body>
  test
  <script src="http://udacity-crp.herokuapp.com/time.js?rtt=1&a" async></script>
  <div id="result"></div>
  <script>var end = +new Date;document.getElementById("result").innerHTML = end-start;</script>
  
</body>
</html>

腳本執行結果>1000&&<2000,從瀑布流中可以看出腳本是和css並行加載的,說明此時並沒有出現阻塞。對於具有async屬性的腳本,外部css不會阻塞。

 

4、異步加載型外部腳本(http://jsbin.com/zuvuce/1

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
  <script>var start = +new Date;</script>
  <link href="http://udacity-crp.herokuapp.com/style.css?rtt=2" rel="stylesheet">
  
</head>
  
<body>
  test
  <script> 
    var script = document.createElement('script');
    script.src = "http://udacity-crp.herokuapp.com/time.js?rtt=1&a";
    document.getElementsByTagName('head')[0].appendChild(script);
  </script>
  <div id="result"></div>
  <script>var end = +new Date;document.getElementById("result").innerHTML = end-start;</script>
  
</body>
</html>

腳本執行結果大於3000,從瀑布流中可以看出,受內聯腳本被阻塞(1)的影響,js開始加載時間在css加載完之后。結論如第一條。

 

建議:

1、腳本應該放在外部css的前面,不論腳本是內聯還是外部(當然,最好是腳本放在body的最后面);

2、可以的話,外部css最好直接內聯到頁面。

 

PS:css並不會阻塞圖片等資源的下載,但會影響body內容的呈現(http://jsbin.com/jokopa/1)。

 

參考文章:

Script-injected "async scripts" considered harmful

JS 和 CSS 的位置對其他資源加載順序的影響

js和css的順序關系

Properly including stylesheets and scripts

移除阻止呈現的JavaScript

Thinking Async


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM