1.用戶輸入
當(dāng)用戶在地址欄中輸入一個(gè)查詢關(guān)鍵字時(shí),地址欄會(huì)判斷輸入的關(guān)鍵字是搜索內(nèi)容,還是請(qǐng)求的url
- 如果是搜索內(nèi)容,地址欄會(huì)使用瀏覽器默認(rèn)的搜索引擎,來合成新的帶搜索關(guān)鍵字的url
- 如果判斷輸入內(nèi)容符合url規(guī)則,比如輸入的time.geekbang.org,那么地址欄會(huì)根據(jù)規(guī)則,把這段內(nèi)容加上協(xié)議,合成為完整的url
當(dāng)用戶輸入關(guān)鍵字并鍵入回車之后,這意味著當(dāng)前頁面即將要被替換成新的頁面,在這個(gè)流程繼續(xù)之前,瀏覽器還給了當(dāng)前頁面一次執(zhí)行beforeupload事件的機(jī)會(huì),beforeupload事件允許頁面在退出之前執(zhí)行一些數(shù)據(jù)清理操作,還可以詢問用戶是否要離開當(dāng)前頁面,比如當(dāng)前頁面可能有為提交的表單
標(biāo)簽頁進(jìn)入加載狀態(tài),但是頁面并沒有立馬被替換成為新的頁面,因?yàn)樾枰却峤晃臋n階段,頁面內(nèi)容才會(huì)被替換
url請(qǐng)求過程
接下來,進(jìn)入頁面資源請(qǐng)求過程。這是瀏覽器進(jìn)程會(huì)通過進(jìn)程間通信(ipc)把url請(qǐng)求發(fā)送進(jìn)網(wǎng)絡(luò)進(jìn)程,網(wǎng)絡(luò)進(jìn)程接收到url請(qǐng)求后,會(huì)在這里發(fā)起真正的url請(qǐng)求流程。
首先,網(wǎng)絡(luò)進(jìn)程會(huì)查找本地緩存是否緩存了該資源,如果有緩存資源,那么直接返回資源給瀏覽器進(jìn)程;如果在緩存中沒有查到資源,那么直接進(jìn)入網(wǎng)絡(luò)請(qǐng)求流程。這請(qǐng)求前第一步是dns解析,以獲取域名的服務(wù)器的ip地址,如果請(qǐng)求協(xié)議是https,那么需要建立tls鏈接
接下來就是ip地址和服務(wù)器建立tcp鏈接。鏈接建立之后,向服務(wù)器發(fā)送請(qǐng)求信息,服務(wù)器接收到請(qǐng)求信息后,會(huì)根據(jù)請(qǐng)求信息生成相應(yīng)數(shù)據(jù)并發(fā)給網(wǎng)絡(luò)今晨g 。多個(gè)頁面同時(shí)運(yùn)行在同一個(gè)渲染進(jìn)程中(chrome的默認(rèn)策略是,每個(gè)標(biāo)簽對(duì)應(yīng)一個(gè)渲染進(jìn)程,但是如果從一個(gè)頁面打開了另一個(gè)新頁面,而新頁面和當(dāng)前頁面屬于統(tǒng)一站點(diǎn)的話,那么新頁面會(huì)復(fù)用父頁面的渲染進(jìn)程。)
同一站點(diǎn)定義為:定義為根域名加上協(xié)議,還包含了該根域名下的所有子域名和不同的端口
1. https://time.geekbang.org
2. https:www.geekbang.org
3. https://www.geekbang.org:8080
//他們都屬于同一站點(diǎn),因?yàn)樗麄儏f(xié)議都是https,而且根域名也都是geekbang.org
若新頁面和當(dāng)前頁面不屬于同一站點(diǎn),那么新頁面會(huì)使用一個(gè)新的渲染進(jìn)程
- 提交文檔
渲染進(jìn)程準(zhǔn)備好之后,通知瀏覽器進(jìn)程,可以替換當(dāng)前舊的文檔了,具體是以下幾個(gè)步驟
- 首先“提交文檔”的消息是由渲染進(jìn)程發(fā)出給瀏覽器繼承的,這是告訴瀏覽器進(jìn)程,它準(zhǔn)備好了,可以執(zhí)行解析渲染等后續(xù)操作了
- 瀏覽器進(jìn)程接收到當(dāng)前渲染進(jìn)程的“提交文檔”消息后,便開始清理當(dāng)前的舊文檔,然后發(fā)出“確認(rèn)提交”的消息給渲染進(jìn)程。同時(shí)瀏覽器進(jìn)程會(huì)更新瀏覽器界面狀態(tài),包括安全狀態(tài),地址欄的url,前進(jìn)后退的歷史狀態(tài),并更新web頁面
- 當(dāng)渲染進(jìn)程收到“確認(rèn)提交”的消息后,便開始執(zhí)行解析數(shù)據(jù)、下載字資源等后續(xù)流程,并時(shí)實(shí)向?yàn)g覽器進(jìn)程更新最新渲染的狀態(tài)
導(dǎo)航完成狀態(tài),這也就解釋了為什么瀏覽器的地址欄里面輸入了一個(gè)地址后,之前的頁面沒有立馬消失,而是要加載一會(huì)兒才更新頁面
- 渲染階段
一旦文檔被提交,渲染進(jìn)程便開始頁面解析和字資源加載。一旦頁面生成完成,渲染進(jìn)程會(huì)發(fā)送一個(gè)消息給瀏覽器進(jìn)程,瀏覽器接收到消息后,會(huì)停止標(biāo)簽圖標(biāo)上的加載動(dòng)畫