亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > 網頁設計 > 正文

讓你了解HTML及資源是如何加載的

2024-08-30 08:34:16
字體:
來源:轉載
供稿:網友

本博客所有內容采用 Creative Commons Licenses 許可使用. 引用本內容時,請保留 朱濤出處 ,并且 非商業 .

引入

完成了若干個基于WEB的項目, 也了解了從前端的js,css,html到后端python/php等, 二者如何交互, 最終瀏覽器如何執行, 這些在心里也已經很明確了. 不過一個問題一直縈繞在心中,那就是:

一個html有若干個外部資源(js,css,flash,image等),這些請求是何時下載的,又是何時執行的?

不清楚,不明白, 所以也就不知道我寫的js究竟何時執行的, 也就不知道為什么很多高性能的建議是要將js置于一個 html底端的</body>之前.

如果你也不是很明確,請來和我一起學習吧.

具體分析

首先我們來看一個示例的html頁面,如下:

<html>  <head>   <script src="/static/jquery.js" type="text/javascript"></script>   <script src="/static/abc.js" type="text/javascript">   </script>   <link rel="stylesheets" type="text/css" href="/static/abc.css"></link>   <script>    $(document).ready(function(){     $("#img").attr("src", "/static/kkk.png");   });   </script>  </head>  <body>  <div>  <img id="img" src="/static/abc.jpg" style="width:400px;height:300px;"/>  <script src="/static/kkk.js" type="text/javascript"></script>  </body></html>

它有如下幾種資源:

  1. 3個外部js文件,1個inline js代碼
  2. 1個外部css文件, 1個inline css代碼
  3. 1個image文件,及1個js請求的image

總共是6個http request.

在分析之前,我們來看看firefox對這個html請求的結果, 如下圖:

/do/uploads/allimg/091203/2217550.png

我們再看看chrome(linux)對這個html的請求結果,如下圖(圖比較小,可以在新標簽中打開):

/do/uploads/allimg/091203/2217551.png

我們先分析下,然后再去說明這2種請求結果的不同.

請求分析

首先說明下面這些描述主要是基于自己google, 咨詢朋友和在 SO 和 IRC 上獲得, 我并沒有閱讀相關的spec(當然我很想閱讀,如果知道相關spec的朋友請留言謝謝), 不能保證其正確性和準確性,風險自擔 :D.

基于相關的調研, 我的理解為, 對于一個URI請求, 瀏覽器會按照下面的請求和執行順序進行:

  1. 一個線程對DOM進行下載(也就是html, 而不去管html中的外部資源)
  2. 另外一個線程會開始分析已經下載的DOM, 并開始下載其中的外部資源(如js, css, image等)
  3. 第三個線程(如果有的話)會去下載2正在下載的以外的外部資源
  4. 如果允許更多的連接, 更多的線程會繼續下載其它資源

一個請求可以同時有多少個connection(線程), 取決于不同的瀏覽器, http1.1 標準中規定的是對于同一個server/proxy(也就是hostname) 不超過2個connection, 但是在實際的瀏覽器實現中, 具體如下:

Firefox 2: 2Firefox 3: 6Opera 9.26: 4Opera 9.5 beta: 4Safari 3.0.4 Mac/Windows: 4IE 7: 2IE 8: 6

所以請根據這個實際情況來思考上面的下載順序.

然后我們看執行順序(js的執行, css的應用等):

  1. 只要瀏覽器"看到了"了js代碼,它就會執行
  2. 瀏覽器是從下到下,一行一行地執行
  3. 如果js代碼位于一個函數或者對象中,則只有當函數或者對象被調用時才會執行
  4. 而所謂的direct code(不處于函數或者對象中的代碼),則會從上到下順序執行
  5. 當css文件下載完成時, 相應的樣式也會應用到DOM上
  6. onload或者jquery的$(document).ready()是在DOM下載完成后執行

在實際的瀏覽器中, 一般遇到<script>標簽會自動block住其它線程的下載, 如firefox, 這也是為什么 在web開發中常常推薦將<script>標簽置于</body>之前的原因.

但是并非所有的瀏覽器都block, 如chrome并不會block住其它的connection. 所以具體的load還需要參考具體的瀏覽器實現.

建議, 將<script></script>標簽置于</body>之前, 這樣可以在大多數情況下都得到較好的性能.

對Firefox和chrome的請求分析

我們回過頭來看下上面2個圖中的請求響應圖.

Firefox

有如下特征:

  1. 首先下載html
  2. html下載完成后, 從上到下依次下載外部文件(js, css,img)
  3. js會block其它外部文件的下載
  4. 其它文件會并行下載

chrome

有如下特征:

  1. 首先下載html
  2. 從上到下依次下載外部文件(js,css,img)
  3. 各個資源的下載順序是并行的

你可能會奇怪如果js可以并行下載,那么可能位于DOM下面的代碼會先執行, 首先可以肯定的是 即使下面的js先完成下載,也不會影響到整體的從上到下的執行順序,瀏覽器會維護這種順序的關系, chrome的這種方式也是未來瀏覽器的一種趨勢, 而這也是為什么chrome能夠更快的原因之一.

有意思的一個插曲

在提出這個問題后,我便多方入手, 向朋友咨詢, 向 SO 提出問題, 甚至去Firefox的 IRC 進行了提問,

回答的朋友還都是很耐心的, 不過, 他們大多向我問了一個問題 做WEB開發, 你為什么要了解這些細節.

對于這樣的問題,我還是比較納悶的, 我一直認為 一個好的程序員,不僅需要知道how, 還要知道what, 甚至why,

知道how,只說明你是一個合格的碼工,只會簡單地使用別人提供的東西來開發.

知道what, 說明你開始去關注背后是如何實現的, 隨著時間推進, 這時候你會逐漸成為一個有經驗的程序員.

知道why, 說明你開始向hacker的路邁進了, 開始逐步走向了技術牛人的路線了,長此以往你會有很大的成長的. 參考 How To Become A Hacker.

讓我們去享受細節,本質的快樂吧,而不是只停留在我會的層面那么表面的快樂.

結論

瀏覽器是各大廠商搶占的市場,無論是自主(Firefox, chrome, IE, Opera, Safari)或者基于一定的內核(遨游, 搜狗, TT, 360等), 但是可以肯定的是瀏覽器會更加強大, 遵守規范, 更快的響應等, 而我們WEB程序員的日子也會好過很多.

本文部分細節還是比較含糊, 后面可能還會在寫一篇文章來進行更徹底,清晰的說明.

歡迎討論.

后記

這次是不惜血本了, 之前積累了快400的 SO reputation score, 一下壓出去了150個來尋找最滿意的答案.

具體大家可以參考:

Load and execution sequence of a web page?

帖子中有較詳細的回答,可以作為參考.

參考資料

  1. Load and execution sequence of a web page?
  2. JavaScript DOM load events, execution sequence, and $(document).ready()
  3. JavaScript Execution Order
  4. Newbie - when is the CSS applied?
pdf版打包下載
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
激情成人中文字幕| www.久久草.com| 国产欧美日韩免费| 日韩精品福利网站| 亚洲成人激情小说| 日韩亚洲在线观看| 国产福利成人在线| 亚洲美女www午夜| 国产成人精品视频| 国产成人在线播放| 中文一区二区视频| 欧美一乱一性一交一视频| 欧美精品18videos性欧| 国产欧美精品久久久| 亚洲a一级视频| 中文字幕最新精品| 色悠久久久久综合先锋影音下载| 亚洲国产成人精品久久| 欧美精品一区二区三区国产精品| 日韩美女免费视频| 91在线观看欧美日韩| 国内精品中文字幕| 国产精品a久久久久久| 欧美激情亚洲一区| 国产一区二区在线免费视频| 久99久在线视频| 欧美性生交xxxxx久久久| 在线日韩av观看| 亚洲国产欧美久久| 亚洲成人激情在线观看| 岛国视频午夜一区免费在线观看| 亚洲国产精品va在线看黑人动漫| 亚洲视频国产视频| 欧美精品www| 欧美在线观看一区二区三区| 亚洲资源在线看| 中文字幕亚洲激情| 亚洲欧美日韩天堂| 亚洲精品福利免费在线观看| 欧美老女人性生活| 国产免费一区视频观看免费| 成人a在线视频| 亚洲欧美成人一区二区在线电影| 成人黄色短视频在线观看| 久久视频中文字幕| 国产一区二区在线免费视频| 91高清免费在线观看| 欧美黄色三级网站| 超碰日本道色综合久久综合| 永久免费精品影视网站| 国产精品三级在线| 亚洲精品美女久久久| 国产精品美女无圣光视频| 日本国产高清不卡| 亚洲成人黄色在线观看| 欧洲亚洲在线视频| 欧美激情xxxx性bbbb| 青青久久av北条麻妃黑人| 日韩电影免费在线观看| 这里只有精品在线播放| 欧美在线一区二区视频| 国产亚洲美女精品久久久| 亚洲综合在线播放| 亚洲欧美日韩视频一区| 欧美黑人xxxⅹ高潮交| 欧美国产第二页| 欧美性xxxx极品hd欧美风情| 色噜噜狠狠狠综合曰曰曰| 欧美高清视频在线播放| 不卡av电影在线观看| 成人乱色短篇合集| 国产欧美在线看| 91久久精品视频| 91热福利电影| 亚洲精品视频免费在线观看| 亚洲国产天堂久久综合网| 国产主播喷水一区二区| 欧美激情一区二区三级高清视频| 91精品久久久久久久久久| 一区二区亚洲精品国产| 国产精品一久久香蕉国产线看观看| 北条麻妃久久精品| 日韩中文在线中文网三级| 国产精品视频导航| 久久影视电视剧免费网站| 在线成人一区二区| 欧美国产一区二区三区| 欧美洲成人男女午夜视频| 欧美成人午夜激情| 亚洲天堂久久av| 欧美超级乱淫片喷水| 欧美亚洲在线观看| 2019国产精品自在线拍国产不卡| 91精品国产自产在线观看永久| 久热爱精品视频线路一| 欧美色图在线视频| 日韩精品视频在线播放| 久久久噜噜噜久久| 国产日本欧美在线观看| 亚洲一区二区三区乱码aⅴ| 欧美裸体xxxx极品少妇| 亚洲免费电影一区| 国产精品天天狠天天看| 精品久久久久久久久国产字幕| 日韩在线不卡视频| 久热精品视频在线免费观看| 日韩专区在线观看| 国产高清视频一区三区| 亚洲激情在线观看| 成人精品视频99在线观看免费| 国产精品无av码在线观看| 日韩国产一区三区| 国产精品第3页| 91在线高清视频| 欧美大尺度电影在线观看| 亚洲激情在线观看| 91九色在线视频| 91夜夜未满十八勿入爽爽影院| 国产高清在线不卡| 成人黄色午夜影院| 最近日韩中文字幕中文| 狠狠躁18三区二区一区| 亚洲第一网站男人都懂| 黑人巨大精品欧美一区二区| www欧美日韩| 51ⅴ精品国产91久久久久久| 97视频在线观看成人| 久久69精品久久久久久久电影好| 欧美性xxxx极品高清hd直播| 国产精品久久久久久久av大片| 日韩成人在线电影网| 亚洲成人网久久久| 中国人与牲禽动交精品| 国产成人精品在线播放| 激情久久av一区av二区av三区| 国语自产精品视频在线看一大j8| 久久精品最新地址| 亚洲国产天堂久久国产91| 国产精品777| 国产精品一区二区三区毛片淫片| 日韩av成人在线| 亚洲网站在线观看| 在线观看日韩av| 色视频www在线播放国产成人| 亚洲偷欧美偷国内偷| 久久精品99国产精品酒店日本| 成人xvideos免费视频| 欧美激情亚洲自拍| 亚洲肉体裸体xxxx137| 欧美成人小视频| 欧美激情精品久久久久久黑人| 精品综合久久久久久97| 欧美乱大交xxxxx| 久久综合久中文字幕青草| 91日韩在线播放| 欧美日韩在线第一页| 国产精品一区二区性色av| 国产亚洲一区二区在线| 精品久久中文字幕久久av| 国产精品美女主播在线观看纯欲| 亚洲欧美国产高清va在线播| 久久精品成人欧美大片| 国产成人欧美在线观看| 精品高清美女精品国产区|