<strike id="3tkic"><sup id="3tkic"></sup></strike>

  1. <ul id="3tkic"></ul>
      <b id="3tkic"><legend id="3tkic"></legend></b>
      <b id="3tkic"><meter id="3tkic"></meter></b>

    • <strike id="3tkic"></strike>

      <blockquote id="3tkic"></blockquote>

    • 亚洲AV无码国产在丝袜线观看_亚洲第一页A∨在线_亚洲国产人成在线观看69网站_无码日韩人妻AV一区免费l

      瀏覽器從輸入U(xiǎn)RL到渲染完頁面的整個(gè)過程是怎么樣的?

      2020/11/2 10:31:37   閱讀:2692    發(fā)布者:2692

            

         瀏覽器的主要功能是將用戶選擇的web資源呈現(xiàn)出來,它從服務(wù)器請求資源,并將得到的資源(HTML,PDF,image等等)顯示在瀏覽器窗口。那么從用戶敲入U(xiǎn)RL到完整渲染出來,經(jīng)歷了什么過程呢?也就是說整個(gè)瀏覽器的工作流程是怎樣的呢?

      整個(gè)過程大致如下:


             1. 輸入U(xiǎn)RL,瀏覽器根據(jù)域名尋找IP地址
             2. 瀏覽器發(fā)送一個(gè)HTTP請求給服務(wù)器,如果服務(wù)器返回以301之類的重定向,瀏覽器根據(jù)相應(yīng)頭中的location再次發(fā)送請求
             3. 服務(wù)器接受請求,處理請求生成html代碼,返回給瀏覽器,這時(shí)的html頁面代碼可能是經(jīng)過壓縮的
             4. 瀏覽器接收服務(wù)器響應(yīng)結(jié)果,如果有壓縮則首先進(jìn)行解壓處理
             5. 瀏覽器開始顯示HTML 

             6. 瀏覽器發(fā)送請求,以獲取嵌入在HTML中的對象。在瀏覽器顯示HTML時(shí),它會(huì)注意到需要獲取其他地址內(nèi)容的標(biāo)簽。


      這時(shí),瀏覽器會(huì)發(fā)送一個(gè)獲取請求來重新獲得這些文件——包括CSS/JS/圖片等資源,這些資源的地址都要經(jīng)歷一個(gè)和HTML讀取類似的過程。所以瀏覽器會(huì)在DNS中查找這些域名,發(fā)送請求,重定向等等…

       那么,一個(gè)頁面,究竟是如何從我們輸入一個(gè)網(wǎng)址到最后完整的呈現(xiàn)在我們面前的呢?還需要了解一下瀏覽器是如何渲染的。
      首先是用戶輸入url,瀏覽器通過DNS查詢要訪問頁面的IP,查詢到后,瀏覽器會(huì)替用戶去向這個(gè)IP地址發(fā)送請求拉取html文件,瀏覽器會(huì)派GUI線程去解析加載回來的html文件

      html解析過程:01機(jī)器碼-》charter字符-》tokens令牌-》node節(jié)點(diǎn)-》dom樹


      解析CSS,構(gòu)建CSSOM
      有了骨骼以后,接下來就是確定長相了,這是CSS要做的事情。和解析HTML類似,CSS解析各種樣式信息,生成網(wǎng)頁的“外觀”。但是有個(gè)問題,CSSA(class選擇器)說,我喜歡藍(lán)色,我家網(wǎng)頁的所有文字都要是藍(lán)色。CSSB(id選擇器)就不樂意了,憑啥啊,我喜歡紅色,我家的標(biāo)題必須是紅色。由于id選擇器是親生的,那就標(biāo)題是紅色的吧,于是不同選擇器就有了不同的權(quán)重。最后生成CSSOM

      因?yàn)闉g覽器解析文檔,如果遇到請求外部資源時(shí),如圖像,iconfont,JS等。瀏覽器將下載該資源。請求過程是異步的,并不會(huì)影響HTML文檔進(jìn)行加載,當(dāng)遇到 <script>標(biāo)簽的時(shí)候,會(huì)立即解析腳本,停止解析文檔(因?yàn)镴S可以操作DOM和CSS,可能會(huì)改動(dòng)DOM和CSS,所以繼續(xù)解析會(huì)造成浪費(fèi))。如果腳本是外部的,會(huì)等待腳本下載完畢,再繼續(xù)解析文檔。所以常見的做法是將js放到頁腳部分。

            

      構(gòu)建Render Tree(呈現(xiàn)樹)


      骨骼和長相都有了,那就組合到一起唄,DOM和CSSOM根據(jù)一定的規(guī)則組合起來生成了Render Tree。

       布局(Layout)


      創(chuàng)建渲染樹后,接下來正式開工,確定各個(gè)元素的位置,包括元素在視圖中的位置以及自身的大小,將其安置在瀏覽器的正確位置。


      繪制(Painting)


      這個(gè)階段,瀏覽器會(huì)遍歷呈現(xiàn)樹,并調(diào)用呈現(xiàn)器的“paint”方法,將前期所有的工作結(jié)合到一起,將網(wǎng)頁的內(nèi)容呈現(xiàn)出來。如果網(wǎng)頁只是HTML+CSS,那么可能就到此結(jié)束了,but還有神奇的JS呢,請看回流和重繪。

      回流(Reflow)和重繪(Repaint)


      如果這個(gè)時(shí)候我寫了用JS操作了DOM,將網(wǎng)頁的所有元素設(shè)置float:left,那么問題來了,上面兩步的工作白干了,推翻從新再來。如果將所有元素的顏色改變了(并沒有改變結(jié)構(gòu)),比如color:red,還好還好,上面一步的工作白干,推翻重來??梢韵胂笠幌?,你辛辛苦苦加班一個(gè)月終于完成工作,產(chǎn)品經(jīng)理來了一句:“好像要改一下需求…”
      頁面在首次加載時(shí)必然會(huì)經(jīng)歷reflow和repaint。reflow和repaint過程是非常消耗性能的,尤其是在移動(dòng)設(shè)備上,它會(huì)破壞用戶體驗(yàn),有時(shí)會(huì)造成頁面卡頓。所以我們應(yīng)該盡可能少的減少reflow和repaint。

      所以,盡可能少操作DOM,提升網(wǎng)頁的性能。

      總結(jié)一下:


             1. 解析HTML
             2. 構(gòu)建DOM樹
             3. DOM樹與CSS樣式進(jìn)行附著構(gòu)造呈現(xiàn)樹(render樹)
             4. 布局
             5. 繪制
            上述這個(gè)過程是逐步完成的,為了更好的用戶體驗(yàn),渲染引擎將會(huì)盡可能早的將內(nèi)容呈現(xiàn)到屏幕上,并不會(huì)等到所有的html都解析完成之后再去構(gòu)建和布局render樹。它是解析完一部分內(nèi)容就顯示一部分內(nèi)容,同時(shí),可能還在通過網(wǎng)絡(luò)下載其余內(nèi)容。
      亚洲AV无码国产在丝袜线观看_亚洲第一页A∨在线_亚洲国产人成在线观看69网站_无码日韩人妻AV一区免费l
      <strike id="3tkic"><sup id="3tkic"></sup></strike>

      1. <ul id="3tkic"></ul>
          <b id="3tkic"><legend id="3tkic"></legend></b>
          <b id="3tkic"><meter id="3tkic"></meter></b>

        • <strike id="3tkic"></strike>

          <blockquote id="3tkic"></blockquote>

        • 海林市| 喀什市| 永吉县| 晋州市| 龙里县| 句容市| 宁强县| 柯坪县| 安义县| 高唐县| 长治市| 两当县| 乐安县| 中方县| 运城市| 平度市| 榆树市| 香格里拉县| 那曲县| 瓦房店市| 海宁市| 临夏县| 桐城市| 临安市| 金堂县| 乐昌市| 探索| 镇平县| 扶沟县| 保山市| 宜城市| 定南县| 扶绥县| 阿瓦提县| 南投县| 常宁市| 周口市| 泾阳县| 海盐县| 泾源县| 广宗县|