訪問網頁後HTML,CSS,JavaScript文件的加載順序

目錄

前言

  本文轉載自:html,css,js加載順序

一般網頁的加載流程

(注:js放在head中會立即執行,阻塞後續的資源下載與執行。因爲js有可能會修改dom,如果不阻塞後續的資源下載,dom的操作順序不可控。
1. 瀏覽器一邊下載HTML網頁,一邊開始解析;
2. 解析過程中,發現<script>標籤;
3. 暫停解析,網頁渲染的控制權轉交給JavaScript引擎;
4. 如果<script>標籤引用了外部腳本,就下載該腳本,否則就直接執行;
5. 執行完畢,控制權交還渲染引擎,恢復往下解析HTML網頁。

  如果外部腳本加載時間很長(比如一直無法完成下載),就會造成網頁長時間失去響應,瀏覽器就會呈現“假死”狀態,這被稱爲“阻塞效應”。html需要等head中所有的js和css加載完成後纔會開始繪製,但是html不需要等待放在body最後的js下載執行就會開始繪製,因此將js放在body的最後面,可以避免資源阻塞,同時使靜態的html頁面迅速顯示。將腳本文件都放在網頁尾部加載,還有一個好處。在DOM結構生成之前就調用DOM,JavaScript會報錯,如果腳本都在網頁尾部加載,就不存在這個問題,因爲這時DOM肯定已經生成了。

JS的執行依賴前面的樣式

  js的執行依賴前面的樣式。即只有前面的樣式全部下載完成後纔會執行js,但是此時外鏈css和外鏈js是並行下載的。
  css需要分塊,首頁的css獨立,其餘的css需要動態加載,因爲html的繪製會被css阻塞,這樣可以減少首次進入時的白屏時間。

<script>標籤的defer屬性

  外鏈的js如果含有defer=”true”屬性,將會並行加載js,到頁面全部加載完成後纔會執行,會按順序執行。
  defer屬性的作用是,告訴瀏覽器,等到DOM加載完成後,再執行指定腳本。
1. 瀏覽器開始解析HTML網頁;
2. 解析過程中,發現帶有defer屬性的script標籤;
3. 瀏覽器繼續往下解析HTML網頁,同時並行下載script標籤中的外部腳本;
4. 瀏覽器完成解析HTML網頁,此時再執行下載的腳本;
  對於內置而不是連接外部腳本的script標籤,以及動態生成的script標籤,defer屬性不起作用。

<script>標籤的async屬性

  博主注:async 屬性是 HTML5 中的新屬性。
  外鏈的js如果含有async=”true”屬性,將不會依賴於任何js和css的執行,此js下載完成後立刻執行,不保證按照書寫的順序執行。因爲async=”true”屬性會告訴瀏覽器,js不會修改dom和樣式,故不必依賴其它的js和css。
  async屬性的作用是,使用另一個進程下載腳本,下載時不會阻塞渲染。
1. 瀏覽器開始解析HTML網頁;
2. 解析過程中,發現帶有async屬性的script標籤;
3. 瀏覽器繼續往下解析HTML網頁,同時並行下載script標籤中的外部腳本;
4. 腳本下載完成,瀏覽器暫停解析HTML網頁,開始執行下載的腳本;
5. 腳本執行完畢,瀏覽器恢復解析HTML網頁。
  async屬性可以保證腳本下載的同時,瀏覽器繼續渲染。需要注意的是,一旦採用這個屬性,就無法保證腳本的執行順序。哪個腳本先下載結束,就先執行那個腳本。另外,使用async屬性的腳本文件中,不應該使用document.write方法。
  一般來說,如果腳本之間沒有依賴關係,就使用async屬性,如果腳本之間有依賴關係,就使用defer屬性。如果同時使用async和defer屬性,後者不起作用,瀏覽器行爲由async屬性決定。

參考

  1. (轉)JS屬性defer的好處
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章