為什么建議js代碼放在前


理論上來說js標簽放在html文檔的任何位置都可以,規范起見,推薦放到body結束標簽的末尾,包含到body標簽內:

<body>
    <!-- 這里是其他的HTML標簽 -->
    <script> // 這里是代碼 </script>
</body>

這樣處理的好處是無需擔心因頁面未完成加載,造成DOM節點獲取不到,使腳本報錯的問題,而且能避免因腳本運行緩慢造成頁面卡死的問題。另外,Yahoo的前端優化指南里就有這一條。

放在body后面是等body載入完后,依次往下執行,避免,先載入了js,缺找不到body里面的dom對象而造成js出錯,所以一般要用window.onload來判斷頁面是否載入完成。

參考資料

  1. 為什么要將js代碼放在body最后 - Tinypan - 博客園 (cnblogs.com)
  2. script標簽到底該放在哪里

一般script標簽會被放在頭部或尾部。頭部就是里面,尾部一般指里[4-5]。

將script放在里,瀏覽器解析HTML,發現script標簽時,會先下載完所有這些script,再往下解析其他的HTML。討厭的是瀏覽器在下載JS時,是不能多個JS並發一起下載的。不管JS是不來來自同一個host,瀏覽器最多只能同時下載兩個JS,且瀏覽器下載JS時,就block掉解析其他HTML的工作[1]。將script放在頭部,會讓網頁內容呈現滯后,導致用戶感覺到卡。所以yahoo建議將script放在尾部,這樣能加速網頁加載。

將script放在尾部的缺點,是瀏覽器只能先解析完整個HTML頁面,再下載JS。而對於一些高度依賴於JS的網頁,就會顯得慢了。所以將script放在尾部也不是最優解,最優解是一邊解析頁面,一邊下載JS。

所以[2]提出了一種更modern的方式:使用async和defer。80%的現代瀏覽器都認識async和defer屬性[3],這兩個屬性能讓瀏覽器做到一邊下載JS(還是只能同時下載兩個JS),一邊解析HTML。他的優點不是增加JS的並發下載數量,而是做到下載時不block解析HTML。

<script type="text/javascript" src="path/to/script1.js" async></script>
<script type="text/javascript" src="path/to/script2.js" async></script>

帶async屬性的script會異步執行,只要下載完就執行,這會導致script2.js可能先於script1.js執行(如果script2.js比較大,下載慢)。defer就能保證script有序執行,script1.js先執行,script2.js后執行。
結論

  1. [2]認為,如果可以不考慮支持<IE9的IE,最好的做法是將script標簽放在head中,並使用async/defer屬性。這樣瀏覽器就能一邊下載JS,一邊解析其他的HTML。
  2. Google自己的代碼script放的也有點亂,有的放在后面[6],有的放在里面[7],還有的放在里面[8]。總體來說,放在里其實是最常見的做法。
  3. 本文只討論script的位置,至於link和style,還是放在head里的做法比較常見。link也是要下載CSS的啊,為毛不考慮下載CSS阻塞HTML解析的問題呢?其實,一般情況下,JS和CSS,放在head和放在body區別不大。CSS的link放在body也是可以的,只是可能導致頁面暫時沒有樣式[9-10]。
    參考
    [1] https://developer.yahoo.com/performance/rules.html#js_bottom=
    [2] http://stackoverflow.com/questions/436411/where-is-the-best-place-to-put-script-tags-in-html-markup
    [3] http://caniuse.com/#search=defer
    [4] https://github.com/IgorMinar/foodme/blob/master/app/index.html
    [5] https://github.com/GoogleChrome/wReader-app/blob/master/index.html
    [6] https://github.com/GoogleChrome/multi-device/blob/master/_preview.html
    [7] https://github.com/GoogleChrome/samples/blob/b2668086c25470e107e59f4ffa92dc0c21c63de3/beacon/index.html
    [8] https://github.com/GoogleChrome/web-audio-samples/blob/gh-pages/samples/audio/adaptive-release.html
    [9] http://stackoverflow.com/questions/4957446/load-external-css-file-in-body-tag
    [10] http://stackoverflow.com/questions/1642212/whats-the-difference-if-i-put-css-file-inside-head-or-body


免責聲明!

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



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