整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          說一說從 URL 輸入到頁面呈現到底發生了什么?

          這是面試過程中一道高頻考題。

          從面試官的角度思考:

          • 出現頻繁,可能是因為面試官通常喜歡問一些考察可深可淺的題目
          • 很多面試官喜歡根據我們應聘者的考題回答中,甚至我們隨口說到的知識點,繼續追問

          基本回答:

          • 瀏覽器解析 URL 獲取協議,主機,端口, path
          • 瀏覽器獲取主機 IP 地址
          • 建立 TCP 連接,然后發送 HTTP 請求
          • 服務器將響應報文通過 TCP 連接發送回瀏覽器,瀏覽器接受 HTTP 響應,根據資源類型決定如何處理(假設資源為 HTML 文檔)
          • 解析 HTML 文檔,構件 DOM 樹,下載資源,構造 CSSOM 樹,執行 js 腳本,最后展現出來給用戶

          如果應聘者只回答了上述步驟,很多關鍵步驟(前端應該了解的知識點)沒有提及,很有可能達不到面試官想要的回答效果。

          筆者針對一些關鍵步驟,具體展開說明。讓這道題成為我們面試考卷中的加分項

          網絡請求

          構建請求

          瀏覽器會構建請求行:

          // 請求方法是 GET,路徑為根路徑,HTTP 協議版本為 1.1
          GET / HTTP/1.1
          復制代碼

          然后根據 Cache-control 和 Expires 字段,檢查強緩存,如果命中直接使用,否則進入下一步。關于強緩存,如果不清楚可以參考下圖:

          DNS 解析

          由于我們輸入的是域名,而數據包是通過 IP 地址傳給對方的。因此我們需要得到域名對應的 IP 地址。這個過程需要依賴一個服務系統,這個系統將域名和 IP 一一映射,我們將這個系統就叫做 DNS (域名系統)。

          DNS 協議提供通過域名查找 IP 地址,或逆向從 IP 地址反查域名的服務。得到具體 IP 的過程就是 DNS 解析。

          DNS 是一個網絡服務器,我們的域名解析簡單來說就是在 DNS 上記錄一條信息記錄。

          例如 baidu.com 220.114.23.56(服務器外網IP地址)80(服務器端口號)
          復制代碼

          瀏覽器通過域名去查詢 URL 對應的 IP :

          • 瀏覽器緩存:瀏覽器會按照一定的頻率緩存 DNS 記錄
          • 操作系統緩存:如果瀏覽器緩存中找不到需要的 DNS 記錄,那就去操作系統中找
          • 路由緩存:路由器也有 DNS 緩存
          • ISP 的 DNS 服務器:ISP 是互聯網服務提供商( Internet Service Provider )的簡稱,ISP 有專門的 DNS 服務器應對 DNS 查詢請求
          • 根服務器:ISP 的 DNS 服務器還找不到的話,它就會向根服務器發出請求,進行遞歸查詢(DNS 服務器先問根域名服務器 .com 域名服務器的 IP 地址,然后再問 .baidu 域名服務器,依次類推)

          建立 TCP 連接

          TCP 三次握手的過程如下:

          • 客戶端發送一個帶 SYN=1,Seq=X 的數據包到服務器端口(第一次握手,由瀏覽器發起,告訴服務器我要發送請求了)
          • 服務器發回一個帶 SYN=1, ACK=X+1, Seq=Y 的響應包以示傳達確認信息(第二次握手,由服務器發起,告訴瀏覽器我準備接受了,你趕緊發送吧)
          • 客戶端再回傳一個帶 ACK=Y+1, Seq=Z 的數據包,代表“握手結束”(第三次握手,由瀏覽器發送,告訴服務器,我馬上就發了,準備接受吧)

          謝希仁著《計算機網絡》中講“三次握手”的目的是“為了防止已失效的連接請求報文段突然又傳送到了服務端,因而產生錯誤”。

          發送 HTTP 請求

          現在 TCP 連接建立完畢,瀏覽器可以和服務器開始通信,即開始發送 HTTP 請求。瀏覽器發 HTTP 請求要攜帶三樣東西:請求行請求頭請求體

          1.請求行包含請求方法、URL、協議版本

          • 請求方法包含 8 種:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE
          • URL 即請求地址,由 <協議>://<主機>:<端口>/<路徑>?<參數> 組成
          • 協議版本即 HTTP 版本號
          POST /user.html HTTP/1.1
          復制代碼

          2.請求頭包含請求的附加信息,由關鍵字/值對組成,如下

          // 服務器可以接受的文件格式
          Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng;q=0.8,application/signed-exchange;v=b3
          // 指定瀏覽器可以支持的 Web 服務器返回的內容壓縮編碼類型
          Accept-Encoding: gzip, deflate, br
          // 瀏覽器支持的語言
          Accept-Language: zh-CN,zh;q=0.9
          // 緩存機制
          Cache-Control: no-cache
          // 是否需要持久連接
          Connection: keep-alive
          // 發送該請求域名下所有 Cookie 值到服務器
          Cookie: /* 省略cookie信息 */
          // 指定請求的服務器的域名和端口號
          Host: www.baidu.com
          Pragma: no-cache
          Upgrade-Insecure-Requests: 1
          // 用戶代理 UA,包含發出請求的用戶信息
          User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1
          
          復制代碼

          3.請求體,可以承載多個請求參數的數據,包含回車符、換行符和請求數據,一般在 POST 方法下存在。

          網絡響應

          跟請求部分類似,網絡響應具有三個部分:響應行響應頭響應體

          1.響應行包含:協議版本,狀態碼,狀態碼描述

          HTTP/1.1 200 OK
          復制代碼

          狀態碼規則如下:

          • 1xx:指示信息--表示請求已接收,繼續處理
          • 2xx:成功--表示請求已被成功接收、理解、接受
          • 3xx:重定向--要完成請求必須進行更進一步的操作
          • 4xx:客戶端錯誤--請求有語法錯誤或請求無法實現
          • 5xx:服務器端錯誤--服務器未能實現合法的請求

          2.響應頭部包含響應報文的附加信息,由 名/值 對組成,如下:

          // 緩存機制
          Cache-Control: no-cache
          Connection: keep-alive
          Content-Encoding: gzip
          // 表示具體請求中的媒體類型信息,決定瀏覽器將以什么形式、什么編碼讀取這個文件
          Content-Type: text/html;charset=utf-8
          // 原始服務器消息發出的時間
          Date: Wed, 04 Dec 2019 12:29:13 GMT
          // Web 服務器軟件名稱
          Server: apache
          // 由服務器端向客戶端發送 cookie
          Set-Cookie: rsv_i=f9a0SIItKqzv7kqgAAgphbGyRts3RwTg%2FLyU3Y5Eh5LwyfOOrAsvdezbay0QqkDqFZ0DfQXby4wXKT8Au8O7ZT9UuMsBq2k; path=/; domain=.baidu.com復制代碼

          這里注意下 Set-Cookie 中關于網絡安全方面的兩個值:HttpOnly、SameSite

          設置了 HttpOnly 屬性的 cookie 不能使用 JavaScript 經由 Document.cookie 屬性、XMLHttpRequest 和 Request APIs 進行訪問,以防范跨站腳本攻擊(XSS)。

          SameSite=Lax 允許服務器設定一則 cookie 不隨著跨域請求一起發送,這樣可以在一定程度上防范跨站請求偽造攻擊(CSRF)。

          3.響應主體包含回車符、換行符和響應返回數據,并不是所有響應報文都有響應數據

          響應完成之后要判斷 Connection 字段,如果請求頭或響應頭中包含 Connection: Keep-Alive ,表示建立了持久連接,這樣 TCP 連接會一直保持,之后請求統一站點的資源會復用這個連接。 否則斷開 TCP 連接, 請求-響應流程結束。

          總結瀏覽器端的網絡請求過程:

          瀏覽器解析渲染頁面

          瀏覽器解析渲染頁面分為以下五個步驟:

          • 根據 HTML 解析出 DOM 樹
          • 根據 CSS 解析生成 CSS 規則樹
          • 結合 DOM 樹和 CSS 規則樹,生成渲染樹
          • 根據渲染樹計算每一個節點的信息
          • 根據計算好的信息繪制頁面

          回流時,以上流程會重新走一遍。重繪時,會重新計算樣式,跳過中間步驟直接生成繪制列表。可見,重繪不一定導致回流,但回流一定發生了重繪。

          構建 DOM 樹

          • HTML 語法定義HTML 的詞匯與句法定義在 w3c 組織創建的規范中。當前版本是 HTML4 , HTML5 的工作正在進行中。
          • 不是上下文無關語法在對解析器的介紹中看到,語法可以用類似 BNF 的格式規范地定義。不幸的是所有常規解析器的討論都不適用于 HTML (我提及它們并不是為了娛樂,它們可以用于解析 CSS 和 JavaScript )。HTML 無法用解析器所需的上下文無關的語法來定義。過去 HTML 格式規范由 DTD ( Document Type Definition ) 來定義,但它不是一個上下文無關語法。HTML 與 XML 相當接近。XML 有許多可用的解析器。HTML 還有一個 XML 變種叫 XHTML ,那么它們主要區別在哪里呢?區別在于 HTML 應用更加”寬容”,它容許你漏掉一些開始或結束標簽等。它整個是一個“軟”句法,不像 XML 那樣嚴格死板。 總的來說這一看似細微的差別造成了兩個不同的世界。一方面這使得 HTML 很流行,因為它包容你的錯誤,使網頁作者的生活變得輕松。另一方面,它使編寫語法格式變得困難。所以綜合來說,HTML 解析并不簡單,現成的上下文相關解析器搞不定,XML 解析器也不行。
          • 解析算法標記化建樹對應的兩個過程就是分詞和語法分析(參考Babel 編譯的解析過程)。這里舉例重點介紹下 HTML5 的容錯機制:使用 </br> 而不是 <br>if (t->isCloseTag(brTag) && m_document->inCompatMode()) {
            reportError(MalformedBRError);
            t->beginTag = true;
            }
            復制代碼全部換為 <br> 的形式。表格離散<table>
            <table>
            <tr><td>inner table</td></tr>
            </table>
            <tr><td>outer table</td></tr>
            </table>
            復制代碼WebKit 會自動轉換為:<table>
            <tr><td>outer table</td></tr>
            </table>
            <table>
            <tr><td>inner table</td></tr>
            </table>
            復制代碼表單元素嵌套這時候直接忽略里面的 form 。

          樣式計算

          CSS 樣式來源一般為三種:

          • link 標簽引用
          • style 標簽中樣式
          • 元素內嵌 style 屬性
          格式化樣式表

          瀏覽器無法直接識別 CSS 樣式文本,這里渲染引擎接收到 CSS 文本之后將其轉化為一個結構化的對象,即 styleSheets 。

          可以在瀏覽器控制臺輸入 document.styleSheets 來查看這個最終結構(包含上述三種 CSS 來源)。

          標準化樣式屬性

          有一些渲染引擎不容易直接理解的 CSS 樣式數值,需要在計算樣式之前將它們標準化。如:em -> px,red -> #ff0000,bold -> 700 等等。

          計算每個節點的具體樣式

          計算具體樣式主要遵循兩個規則:繼承層疊

          • 繼承:每個子節點都會默認繼承父節點的樣式屬性,如果父節點中沒有找到,就采用瀏覽器默認樣式,也叫 UserAgent樣式。
          • 層疊:CSS 的層疊性體現在,最終的樣式取決與各個屬性共同作用的結果。

          計算完樣式之后,所有樣式值會被掛載到 window.getComputedStyle 中,也就是可以通過 JS 獲取計算后的樣式。

          生成布局樹

          布局樹生成主要分兩部:

          • 遍歷生成的 DOM 樹節點,并把它們添加到布局樹中
          • 計算布局樹節點的坐標位置

          布局樹只包含可見元素,對于 head 標簽和設置了 display: none 的元素將不會被放入其中。

          如果想了解布局的細節,可以讀一讀人人 FED 團隊的文章從Chrome源碼看瀏覽器如何layout布局。

          構建圖層樹

          這里分兩種情況,一種是顯式合成,一種是隱式合成

          顯式合成

          一、擁有層疊上下文的節點

          層疊上下文也基本上是有一些特定的 CSS 屬性創建的,一般有以下情況:

          1. HTML 根元素本身就具有層疊上下文
          2. 普通元素設置 position 不為 static 并且設置了 z-index 屬性,會產生層疊上下文
          3. 元素的 opacity 值不是 1
          4. 元素的 transform 值不是 none
          5. 元素的 filter 值不是 none
          6. 元素的 isolation 值是 isolate
          7. will-change 指定的屬性值為上面任意一個

          二、需要剪裁的地方

          比如一個 div,你只給他設置 100 * 100 像素的大小,而你在里面放了非常多的文字,那么超出的文字部分就需要被剪裁。當然如果出現了滾動條,那么滾動條會被單獨提升為一個圖層。

          隱式合成

          簡單說就是層疊等級低的節點被提升為單獨的圖層之后,那么所有層疊等級比它高的節點都會成為一個單獨的圖層。

          這個隱式合成其實隱藏著巨大風險,如果在一個大型應用中,當一個 z-index 比較低的元素被提升為單獨圖層之后,層疊在它上面的元素統統會被提升為單獨的圖層,可能會增加上千個圖層,大大增加內存壓力,甚至直接讓頁面崩潰。這就是層爆炸的原理

          當需要 repaint 時,只需要 repaint 本身,而不會影響到其他層。

          生成繪制列表

          渲染引擎會將圖層的繪制拆分成一個個繪制指令,比如先畫背景、再描繪邊框......然后將這些指令按順序組合成一個待繪制列表。

          大家可以 F12 打開 Chrome 開發者工具,在設置欄展開 more tools ,然后選擇 Layers 面板,就能看到繪制列表了。

          后面就是渲染進程的主線程把繪制列表提交給合成線程。然后合成線程選擇視口附近的圖塊,把它交給柵格化線程池生成位圖。

          柵格化操作完成后,合成線程會生成一個繪制指令 DrawQuad,并發送給瀏覽器進程。瀏覽器進程中的 viz 組件 接收到命令,把頁面內容繪制到內存,也就是生成了頁面。

          斷開連接

          當數據傳送完畢,需要斷開 TCP 連接,此時發起四次揮手。

          • 發起方往被動方發送報文,Fin、Ack、Seq,表示已經沒有數據傳輸了。并進入 FIN_WAIT_1 狀態。(請求報文發送完成)
          • 被動方發送報文,Ack、Seq,表示同意關閉請求。此時主機發起方進入 FIN_WAIT_2 狀態。(請求報文接受完成)
          • 被動方向發起方發送報文段,Fin、Ack、Seq,請求關閉連接。并進入 LAST_ACK 狀態。(響應報文發送完成)
          • 發起方向被動方發送報文段,Ack、Seq。然后進入等待 TIME_WAIT 狀態。被動方收到發起方的報文段以后關閉連接。發起方等待一定時間未收到回復,則正常關閉。(響應報文接受完成)

          參考文章

          • 從URL輸入到頁面展現到底發生什么?
          • (1.6w字)瀏覽器靈魂之問,請問你能接得住幾個?
          • 大揭秘!“恐怖”的阿里一面,我究竟想問什么

          感謝

          如果本文對你有幫助,就點個贊支持下吧!感謝閱讀。


          來源:掘金-推薦

          動端應用到底需要做SEO嗎?答案很重要。隨著智能手機的出現,越來越多的人使用智能手機進行搜索。交通意味著一切。很多人會在零碎的時間內使用手機來滿足他們的搜索和查詢需求。如果移動網站搜索引擎優化做得不錯,這意味著他們可以分享流量紅利。所以手機上的seo非常重要。

          如何做手機站SEO?移動站定位和頁面設計移動站和PC站除了頁面大小,顯示形式不同,在分析用戶需求時都要做。例如,對于一個地方裝修網站,PC站是重點展示裝修效果的圖紙案例、裝修報價和公司裝修設計師的風度,所以移動站應該重點關注公司的聯系人、地圖、電話等。移動網站需要”及時、快速“。同時,考慮到網站的反應速度,整個頁面應該用DIV CSS代碼編寫。不要為了方便而使用flash或js,所以搜索引擎很難掌握。還有許多移動瀏覽器不支持Flash播放。你需要單獨安裝手機falsh插件,但是為什么用戶有那么多時間等待呢?

          移動站應簡潔,用戶瀏覽量大的手機內容,或者屏幕大一些,在平板電腦上瀏覽,但不大于普通電腦屏幕,所以移動站頁面應更簡潔,特別是對于有下載需求的網站,移動站上的下載按鈕應為CLE。Arly放在用戶面前。用戶知道在哪里單擊以查找所需的內容。還有一點,內容頁面不應該太長,因為用手機瀏覽網站的用戶,時間非常緊迫,而且有些還在騎行過程中,流量和網絡速度是一個大問題,所以一個問題可以用一句話一張圖來解決,不要講太長的故事。

          對于商場的移動支付,除了以上幾點之外,最重要的支付頁面必須簡單化。這可以參考京東和淘寶,他們的支付頁面做得很好。移動臺應該簡單大方。

          移動臺應禁止使用彈窗(必須禁止)彈窗。PC站的用戶已經夠煩躁了。如果在像手機或平板電腦這樣的地方做了一個子彈窗,用戶會說不出話來:”我們進來吧,但這并不能讓我們輕松地看到它。“哪種網絡語言更適合移動臺?這一點我在之前的移動網站優化教程中已經討論過,詳細分析了HTML4和HTML5作為移動站的區別。

          URL路徑必須標準化為移動站。不要使用列表頁面來節省空間成本,也不要購買新的空間。最好使用單獨的輔助域名作為移動站。表單為m.xxx.com或wap.xx.com。

          PC站和移動站做開放匹配,我的裝修網站,移動站,在線后只有針對性的更新內容,一個外鏈不存在,現在大部分的主要關鍵字都排在主頁上,最重要的原因是我的移動站做了開放匹配。

          如果你不知道如何做開放匹配,你可以在我的博客的移動網站優化部分看到如何做開放匹配,這是以視頻的形式顯示的,一步一步地教你如何做開放匹配。關于機器人、地圖、關鍵字設置等問題,與PC站是一樣的,PC站怎么辦,移動站怎么辦。手機站首頁的標題只能寫公司品牌的文字,也可以和PC站的標題相同,這是沒有危害的 。

          5和html5是一個東西嗎?它們有什么區別?

          前幾天看到有同學問“H5和html5是一個東西嗎?它們有什么區別?”

          有網友回答說“H5和html5就像ps和photoshop一樣,h5更厲害一點兒”

          這個機智的回答我真的是看笑了~

          H5是html5的簡稱?

          很多人都以為H5是html5的簡稱,符合 HTML5 標準實現的頁面,大家為了方便,簡稱 H5“。百度和搜狗百科上的答案也似乎是這樣——H5(HTML5)”一般是指“html5,但是真的是這樣的嗎? 當連續有人問相關的問題,并詳細了解一些業務以后,慢慢的發現 H5 已經不單單是一個技術相關的詞。

          H5不等于HTML5

          按照百度百科理解來說:“符合 HTML5 標準實現的頁面就是 H5頁面”,那么當前互聯網上的網站基本上都在采用了 HTML5 標準。

          但大多數的客戶要求是把微信里面那種好友之間,或者朋友圈分享的那種帶有主題性質的宣傳頁面(實在是不知道怎么描述)和我們平時電腦上訪問的頁面通過技術區分識別出來。所以說在業務人員和一些客戶眼里,微信上分享的那種炫酷的頁面就是H5頁面。所以 H5 和 HTML5就不是一個東西了。

          H5的由來

          如果 H5 不等于 HTML5 了,那 H5 到底是什么呢?

          網友猜想可能是這樣的:HTML5 在 2013 年左右就發布,在 2014 年底宣布標準制定完成,但是市面的瀏覽器的支持主要還是在手機上,電腦上主要有 IE 的存在導致標準普及緩慢,所以開始有開發者在手機上做很多酷炫的頁面,當這些酷炫的效果在業務人員看到了以后,開始加以有效的利用,特別是在活動宣傳和廣告方面,為了宣傳業務人員會問技術人員:“這種炫酷的效果是怎么實現的?”

          技術人員說:“我用的是HTML5的技術”。業務人員的宣傳營銷能力那是相當厲害,在客戶面前大量的宣傳:“我們用到了一個牛逼技術,讓你的手機網頁非常炫酷好看”,慢慢的客戶都知道了有一種技術可以把頁面在手機上做的非常好看,非常炫酷,然后客戶又開始對其他人說:“我們的這個網頁用了現在最新的技術,叫什么什么5頁面,對H5頁面”。然后客戶之間口口相傳,當以后遇到同樣的業務需求的時候,找另外一家供應商說:“我要一個H5頁面,要長的類似什么..一樣的網頁”,然后這一家做網站的公司開始也把這種網站也開始叫著H5頁面。

          最后鋪天蓋地的“H5頁面”就出來了。

          當然,這只是網友的一個猜想……

          最后

          為幫助那些往想互聯網方向轉行想學習,卻因為時間不夠,資源不足而放棄的人。我搜集整理了一套完整的IT學習資料,包括Java、SEO優化、Python入門書籍等等等,比自己在網上零散收集的結構性和連貫性更強,只為幫助那些想學習的人!需要的同學可私信!私信!回復“學習”


          主站蜘蛛池模板: 亚洲一区精品视频在线| 国产av熟女一区二区三区| 国产主播一区二区| 女同一区二区在线观看| 无码精品一区二区三区免费视频 | 亚洲日韩激情无码一区| 正在播放国产一区| 日韩一区二区三区四区不卡| 久久4k岛国高清一区二区| 亚洲一区二区女搞男| 国精产品一区二区三区糖心| 国产成人高清精品一区二区三区 | 国产免费一区二区视频| 国产午夜精品一区二区三区小说| 日本一区视频在线播放| 波多野结衣一区二区三区高清av| 日本精品3d动漫一区二区| 亚洲AV无码一区二区三区鸳鸯影院| 亚洲.国产.欧美一区二区三区| 激情亚洲一区国产精品| 国产精品一区二区久久精品| 中字幕一区二区三区乱码 | 亚洲A∨精品一区二区三区| 午夜福利国产一区二区| 好湿好大硬得深一点动态图91精品福利一区二区 | 无码欧精品亚洲日韩一区夜夜嗨| 国产一区二区三区樱花动漫| 日本高清无卡码一区二区久久| 国产一区二区三区内射高清| 精品视频一区二区三区| 国产一区二区三区在线观看精品| 国产内射999视频一区| 精品无码成人片一区二区98 | 爱爱帝国亚洲一区二区三区| 日本精品一区二区三区在线视频| 丰满岳乱妇一区二区三区| 综合久久一区二区三区| 精品无码人妻一区二区三区| 无码精品不卡一区二区三区| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 亚洲AV无码一区二区三区网址 |