❶ 前端渲染和後端渲染的區別 及適用場景
前端渲染沒有後台渲染的功能強。但是前端渲染不佔用伺服器的資源,也不佔用網路。
❷ 最全從輸入URL到瀏覽器顯示頁面都發生了什麼前端瀏覽器渲染流程
首先了解一下URL的組成:
從上面的URL可以看出,一個完整的URL包括以下幾部分:
1、協議部分:該URL的協議部分為「http:」,這代表網頁使用的是HTTP協議。在Internet中可以使用多種協議,如HTTP,FTP等等本例中使用的是HTTP協議。在"HTTP"後面的「//」為分隔符
2、域名部分:該URL的域名部分為「www..com」。一個URL中,也可以使用IP地址作為域名使用
3、埠部分:跟在域名後面的是埠,域名和埠之間使用「:」作為分隔符。埠不是一個URL必須的部分,如果省略埠部分,將採用默認埠80
4、虛擬目錄部分:從域名後的第一個「/」開始到最後一個「/」為止,是虛擬目錄部分。虛擬目錄也不是一個URL必須的部分。本例中的虛擬目錄是「/news/」
5、文件名部分:從域名後的最後一個「/」開始到「?」為止,是文件名部分,如果沒有「?」,則是從域名後的最後一個「/」開始到「#」為止,是文件部分,如果沒有「?」和「#」,那麼從域名後的最後一個「/」開始到結束,都是文件名部分。本例中的文件名是「index.asp」。文件名部分也不是一個URL必須的部分,如果省略該部分,則使用默認的文件名
6、錨部分:從「#」開始到最後,都是錨部分。本例中的錨部分是「name」。錨部分也不是一個URL必須的部分
7、參數部分:從「?」開始到「#」為止之間的部分為參數部分,又稱搜索部分、查詢部分。本例中的參數部分為「boardID=5&ID=24618&page=1」。參數可以允許有多個參數,參數與參數之間用「&」作為分隔符。
很多大公司面試喜歡問這樣一道面試題, 輸入URL到看見頁面發生了什麼? ,今天我們來總結一下。 簡單來說,共有以下幾個過程
下面我們來看看具體的細節
輸入 www.google.com 網址後,首先在本地的域名伺服器中查找,沒找到去根域名伺服器查找,沒有再去 com 頂級域名伺服器查找,,如此的類推下去,直到找到IP地址,然後把它記錄在本地,供下次使用。大致過程就是 . -> .com -> google.com. -> www.google.com. 。 (你可能覺得我多寫 .,並木有,這個.對應的就是根域名伺服器,默認情況下所有的網址的最後一位都是.,既然是默認情況下,為了方便用戶,通常都會省略,瀏覽器在請求DNS的時候會自動加上)
既然已經懂得了解析的具體過程,我們可以看到上述一共經過了N個過程,每個過程有一定的消耗和時間的等待,因此我們得想辦法解決一下這個問題!
DNS存在著多級緩存,從離瀏覽器的距離排序的話,有以下幾種: 瀏覽器緩存,系統緩存,路由器緩存,IPS伺服器緩存,根域名伺服器緩存,頂級域名伺服器緩存,主域名伺服器緩存。
在你的chrome瀏覽器中輸入:chrome://dns/,你可以看到chrome瀏覽器的DNS緩存。
系統緩存主要存在/etc/hosts(Linux系統)中
檢查瀏覽器是否有緩存
通過 Cache-Control 和 Expires 來檢查是否命中強緩存,命中則直接取本地磁碟的html(狀態碼為200 from disk(or memory) cache,內存or磁碟);
如果沒有命中強緩存,則會向伺服器發起請求(先進行下一步的TCP連接),伺服器通過 Etag 和 Last-Modify 來與伺服器確認返回的響應是否被更改(協商緩存),若無更改則返回狀態碼(304 Not Modified),瀏覽器取本地緩存;
若強緩存和協商緩存都沒有命中則返回請求結果。
不知道你們有沒有注意這樣一件事,你訪問http://.com的時候,每次響應的並非是同一個伺服器(IP地址不同),一般大公司都有成百上千台伺服器來支撐訪問,假設只有一個伺服器,那它的性能和存儲量要多大才能支撐這樣大量的訪問呢?DNS可以返回一個合適的機器的IP給用戶,例如可以根據每台機器的負載量,該機器離用戶地理位置的距離等等,這種過程就是DNS負載均衡
TCP 協議通過三次握手建立連接。
翻譯成大白話就是:
為什麼是3次? :避免 歷史 連接,確認客戶端發來的請求是這次通信的人。
為什麼不是4次? :3次夠了第四次浪費
建立連接的過程是利用客戶伺服器模式,假設主機A為客戶端,主機B為伺服器端。
採用三次握手是為了防止失效的連接請求報文段突然又傳送到主機B,因而產生錯誤。失效的連接請求報文段是指:主機A發出的連接請求沒有收到主機B的確認,於是經過一段時間後,主機A又重新向主機B發送連接請求,且建立成功,順序完成數據傳輸。考慮這樣一種特殊情況,主機A第一次發送的連接請求並沒有丟失,而是因為網路節點導致延遲達到主機B,主機B以為是主機A又發起的新連接,於是主機B同意連接,並向主機A發回確認,但是此時主機A根本不會理會,主機B就一直在等待主機A發送數據,導致主機B的資源浪費。
採用兩次握手不行,原因就是上面說的失效的連接請求的特殊情況。而在三次握手中, client和server都有一個發syn和收ack的過程, 雙方都是發後能收, 表明通信則准備工作OK.
為什麼不是四次握手呢? 大家應該知道通信中著名的藍軍紅軍約定, 這個例子說明, 通信不可能100%可靠, 而上面的三次握手已經做好了通信的准備工作, 再增加握手, 並不能顯著提高可靠性, 而且也沒有必要。
第一次握手 :
客戶端發送syn包(Seq=x)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:
伺服器收到syn包,必須確認客戶的SYN(ack=x+1),同時自己也發送一個SYN包(Seq=y),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
第三次握手:
客戶端收到伺服器的SYN ACK包,向伺服器發送確認包ACK(ack=y+1),此包發送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。
握手過程中傳送的包里不包含數據,三次握手完畢後,客戶端與伺服器才正式開始傳送數據。理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP 連接都將被一直保持下去。
要先申請CA證書,並安裝在伺服器上(一個文件,配置nginx支持監聽443埠開啟ssl並設置證書路徑)
瀏覽器發送請求;
網站從瀏覽器發過來的加密規則中選一組自身也支持的加密演算法和hash演算法,並向瀏覽器發送帶有公鑰的證書,當然證書還包含了很多信息,如網站地址、證書的頒發機構、過期時間等。
瀏覽器解析證書。
驗證證書的合法性。如頒發機構是否合法、證書中的網站地址是否與訪問的地址一致,若不合法,則瀏覽器提示證書不受信任,若合法,瀏覽器會顯示一個小鎖頭。
若合法,或用戶接受了不合法的證書,瀏覽器會生成一串隨機數的密碼(即密鑰),並用證書中提供的公鑰加密。
使用約定好的hash計算握手消息,並使用生成的隨機數(即密鑰)對消息進行加密,最後將之前生成的所有消息一並發送給網站伺服器。
網站伺服器解析消息。用已有的私鑰將密鑰解密出來,然後用密鑰解密發過來的握手消息,並驗證是否跟瀏覽器傳過來的一致。然後再用密鑰加密一段握手消息,發送給瀏覽器。
瀏覽器解密並計算握手消息的HASH,如果與服務端發來的HASH一致,此時握手過程結束,之後所有的通信數據將由之前瀏覽器生成的隨機密碼並利用對稱加密演算法進行加密。這里瀏覽器與網站互相發送加密的握手消息並驗證,目的是為了保證雙方都獲得了一致的密碼,並且可以正常的加密解密數據,為後續真正數據的傳輸做一次測試。
發送HTTP請求
首先科補一個小知識,HTTP的埠為80/8080,而HTTPS的埠為443
發送HTTP請求的過程就是構建HTTP請求報文並通過TCP協議中發送到伺服器指定埠 請求報文由 請求行 , 請求抱頭 , 請求正文 組成。
請求行
請求行的格式為 Method Request-URL HTTP-Version CRLF eg: GET index.html HTTP/1.1 常用的方法有: GET , POST , PUT , DELETE , OPTIONS , HEAD 。
常見的請求方法區別
這里主要展示 POST 和 GET 的區別
常見的區別
注意一點你也可以在GET裡面藏body,POST裡面帶參數
重點區別
GET 會產生一個 TCP 數據包,而 POST 會產生兩個 TCP 數據包。
詳細的說就是:
注意一點,並不是所有的瀏覽器都會發送兩次數據包,Firefox就發送一次
請求報頭
請求報頭允許客戶端向伺服器傳遞請求的附加信息和客戶端自身的信息。
從圖中可以看出,請求報頭中使用了Accept, Accept-Encoding, Accept-Language, Cache-Control, Connection, Cookie等欄位。Accept用於指定客戶端用於接受哪些類型的信息,Accept-Encoding與Accept類似,它用於指定接受的編碼方式。Connection設置為Keep-alive用於告訴客戶端本次HTTP請求結束之後並不需要關閉TCP連接,這樣可以使下次HTTP請求使用相同的TCP通道,節省TCP連接建立的時間。
請求正文
當使用POST, PUT等方法時,通常需要客戶端向伺服器傳遞數據。這些數據就儲存在請求正文中。在請求包頭中有一些與請求正文相關的信息,例如: 現在的Web應用通常採用Rest架構,請求的數據格式一般為json。這時就需要設置 Content-Type: application/json 。
更重要的事情-HTTP緩存
HTTP屬於客戶端緩存,我們常認為瀏覽器有一個緩存資料庫,用來保存一些靜態文件,下面我們分為以下幾個方面來簡單介紹HTTP緩存
緩存的規則
緩存規則分為 強制緩存 和 協商緩存
強制緩存
當緩存資料庫中有客戶端需要的數據,客戶端直接將數據從其中拿出來使用(如果數據未失效),當緩存伺服器沒有需要的數據時,客戶端才會向服務端請求。
又稱對比緩存。客戶端會先從緩存資料庫拿到一個緩存的標識,然後向服務端驗證標識是否失效,如果沒有失效服務端會返回304,這樣客戶端可以直接去緩存資料庫拿出數據,如果失效,服務端會返回新的數據
強制緩存
對於強制緩存,伺服器響應的header中會用兩個欄位來表明——Expires和Cache-Control。
Expires
Exprires的值為服務端返回的數據到期時間。當再次請求時的請求時間小於返回的此時間,則直接使用緩存數據。但由於服務端時間和客戶端時間可能有誤差,這也將導致緩存命中的誤差,另一方面,Expires是HTTP1.0的產物,故現在大多數使用Cache-Control替代。
Cache-Control
Cache-Control有很多屬性,不同的屬性代表的意義也不同。
協商緩存
協商緩存需要進行對比判斷是否可以使用緩存。瀏覽器第一次請求數據時,伺服器會將緩存標識與數據一起響應給客戶端,客戶端將它們備份至緩存中。再次請求時,客戶端會將緩存中的標識發送給伺服器,伺服器根據此標識判斷。若未失效,返回304狀態碼,瀏覽器拿到此狀態碼就可以直接使用緩存數據了。
對於協商緩存來說,緩存標識我們需要著重理解一下,下面我們將著重介紹它的兩種緩存方案。
Last-Modified
Last-Modified:伺服器在響應請求時,會告訴瀏覽器資源的最後修改時間。
從字面上看,就是說:從某個時間節點算起,是否文件被修改了
這兩個的區別是一個是修改了才下載一個是沒修改才下載。
Last-Modified 說好卻也不是特別好,因為如果在伺服器上,一個資源被修改了,但其實際內容根本沒發生改變,會因為Last-Modified時間匹配不上而返回了整個實體給客戶端(即使客戶端緩存里有個一模一樣的資源)。為了解決這個問題,HTTP1.1推出了Etag。
Etag
Etag:伺服器響應請求時,通過此欄位告訴瀏覽器當前資源在伺服器生成的唯一標識(生成規則由伺服器決定)
但是實際應用中由於Etag的計算是使用演算法來得出的,而演算法會佔用服務端計算的資源,所有服務端的資源都是寶貴的,所以就很少使用Etag了。
緩存的優點
不同刷新的請求執行過程
瀏覽器地址欄中寫入URL,回車
F5
Ctrl+F5
伺服器處理請求並返回HTTP報文
它會對TCP連接進行處理,對HTTP協議進行解析,並按照報文格式進一步封裝成HTTP Request對象,供上層使用。這一部分工作一般是由Web伺服器去進行,我使用過的Web伺服器有Tomcat, Nginx和Apache等等 HTTP報文也分成三份, 狀態碼 , 響應報頭 和 響應報文
狀態碼
狀態碼是由3位數組成,第一個數字定義了響應的類別,且有五種可能取值:
平時遇到比較常見的狀態碼有:200, 204, 301, 302, 304, 400, 401, 403, 404, 422, 500
常見狀態碼區別
200 成功
請求成功,通常伺服器提供了需要的資源。
204 無內容
伺服器成功處理了請求,但沒有返回任何內容。
301 永久移動
請求的網頁已永久移動到新位置。 伺服器返回此響應(對 GET 或 HEAD 請求的響應)時,會自動將請求者轉到新位置。
302 臨時移動
伺服器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以後的請求。
304 未修改
自從上次請求後,請求的網頁未修改過。 伺服器返回此響應時,不會返回網頁內容。
400 錯誤請求
伺服器不理解請求的語法。
401 未授權
請求要求身份驗證。 對於需要登錄的網頁,伺服器可能返回此響應。
403 禁止
伺服器拒絕請求。
404 未找到
伺服器找不到請求的網頁。
422 無法處理
請求格式正確,但是由於含有語義錯誤,無法響應
500 伺服器內部錯誤
伺服器遇到錯誤,無法完成請求。
響應報頭
常見的響應報頭欄位有: Server, Connection...。
響應報文
你從伺服器請求的HTML,CSS,JS文件就放在這裡面
就是 Webkit 解析渲染頁面的過程。
這個過程涉及兩個比較重要的概念 迴流 和 重繪 ,DOM結點都是以盒模型形式存在,需要瀏覽器去計算位置和寬度等,這個過程就是迴流。等到頁面的寬高,大小,顏色等屬性確定下來後,瀏覽器開始繪制內容,這個過程叫做重繪。瀏覽器剛打開頁面一定要經過這兩個過程的,但是這個過程非常非常非常消耗性能,所以我們應該盡量減少頁面的迴流和重繪
這個過程中可能會有dom操作、ajax發起的http網路請求等。
web-socket、ajax等,這個過程通常是為了獲取數據
setTimeout、setInterval、Promise等宏任務、微任務隊列
當Render Tree中部分或全部元素的尺寸、結構、或某些屬性發生改變時,瀏覽器重新渲染部分或全部文檔的過程稱為迴流。
會導致迴流的操作:
一些常用且會導致迴流的屬性和方法:
當頁面中元素樣式的改變並不影響它在文檔流中的位置時(例如:color、background-color、visibility等),瀏覽器會將新樣式賦予給元素並重新繪制它,這個過程稱為重繪。
JS的解析是由瀏覽器的JS引擎完成的。由於JavaScript是單線程運行,也就是說一個時間只能幹一件事,干這件事情時其他事情都有排隊,但是有些人物比較耗時(例如IO操作),所以將任務分為 同步任務 和 非同步任務 ,所有的同步任務放在主線程上執行,形成執行棧,而非同步任務等待,當執行棧被清空時才去看看非同步任務有沒有東西要搞,有再提取到主線程執行,這樣往復循環(冤冤相報何時了,阿彌陀佛),就形成了Event Loop事件循環,下面來看看大人物
先看一段代碼
結果我想大家都應該知道。主要來介紹JavaScript的解析,至於Promise等下一節再說
JavaScript是一門單線程語言,盡管H5中提出了 Web-Worker ,能夠模擬實現多線程,但本質上還是單線程,說它是多線程就是扯淡。
既然是單線程,每個事件的執行就要有順序,比如你去銀行取錢,前面的人在進行,後面的就得等待,要是前面的人弄個一兩個小時,估計後面的人都瘋了,因此,瀏覽器的JS引擎處理JavaScript時分為 同步任務 和 非同步任務
這張圖我們可以清楚看到
js引擎存在monitoring process進程,會持續不斷的檢查主線程執行棧是否為空,一旦為空,就會去Event Queue那裡檢查是否有等待被調用的函數。 估計看完這些你對事件循環有一定的了解,但是事實上我們看對的沒這么簡單,通常我們會看到Promise,setTimeout,process.nextTick(),這個時候你和我就懵逼。
不同任務會進入不同的任務隊列來執行。 JS引擎開始工作後,先在宏任務中開始第一次循環( script裡面先執行,不過我喜歡把它拎出來,直接稱其進入執行棧 ),當主線程執行棧全部任務被清空後去微任務看看,如果有等待執行的任務,執行全部的微任務(其實將其回調函數推入執行棧來執行),再去宏任務找最先進入隊列的任務執行,執行這個任務後再去主線程執行任務(例如執行```console.log("hello world")這種任務),執行棧被清空後再去微任務,這樣往復循環(冤冤相報何時了)
下面來看一段代碼
我們看看它的執行情況
具體的執行過程大致就是這樣。
❸ vue前端非同步與頁面渲染問題:跪求大牛們幫我看看嘛,遇到好久了,快崩潰了,好人一生平安。
將頁面先隱藏起來,待testData賦值完成後再將頁面顯示
❹ 前端渲染可以用bs4解析嗎
可以。bs4可以做簡單的渲染處理,所以前端渲染可以用bs4解析。bs4全名BeautifulSoup,是編寫 python爬蟲常用庫之一,主要用來解析html標簽。
❺ 後端渲染html,前端模板渲染html,jquery的html,各有什麼區別
對於網頁而言者爛枯,無論後端程序是多麼的復雜,最終返回給客戶端的還是HTML文件。頁面渲歷罩染模式主要分:伺服器端渲染、客戶端(前端)渲染。不管哪種渲染模式,其實都是基於模板引擎而言的。
對於普通用戶而言,採用哪種渲染模式似乎並不重要,但對於網站架構而言其中區別還是很大的。
伺服器端渲染(SSR)
伺服器端渲染其實就是伺服器端在返回HTML給客戶端之前,先將HTML模板上特定區域填充上數據後生成完整的HTML返回給客戶端。
此時模板文件存儲首洞在伺服器端。
1、優點:由伺服器端進行數據填充工作,不會影響前端性能(解析模板是有性能開銷的)、SEO友好、首屏渲染快;
2、缺點:佔用了伺服器端運算資源,響應體較大(因為返回的是完整的HTML文本)。
客戶端渲染
客戶端渲染指的就是藉助前端的JavaScript調用後端API來實現頁面渲染。前端也是有模板引擎的,而前端模板引擎在填充數據時也是靠JS來操作DOM節點的。
此時模板文件存儲在前端。
1、優點:不佔用伺服器端資源,模板在前端改起來更容易,不用麻煩後端聯調;
2、缺點:由前端JS負責數據解析和填充工作,在弱網環境下頁面載入時可能會出現亂版現象,渲染起來速度可能會慢一些。另外使用前端渲染很多數據都是動態調用API進行填充的,所以不利於SEO。
以上就是我的觀點,對於這個問題大家是怎麼看待的呢?歡迎在下方評論區交流~我是科技領域創作者,十年互聯網從業經驗,歡迎在線咨詢❻ 什麼是前端渲染什麼是服務端渲染兩者區別及應用場景
舉個商品列表頁面為例子。
前端渲染:說的應該是剛進入頁面時,商品列表這些數據都不給你,不會渲染出這些數據。然後載入script時,再用ajax或者fetch之類的發起了請求另一個介面,服務端返回了商品列表的json數據給你,你在js中用模板引擎之類的技術,把這些數據拼成html字元串插入到Dom里。
服務端渲染:服務端用php的smarty模板或者java的jsp,把頁面的商品列表信息渲染出來了,返回一個html給瀏覽器了。
區別:如果頁面要求被蜘蛛抓取,前端渲染的數據就不能被抓取到,但是服務端渲染的頁面就能被抓取到。如果有SEO要求,只能用服務端渲染。如果用Node.js渲染的話,那就都沒這些問題了。
❼ 前端開發者應知必會:瀏覽器是如何渲染網頁的
主要由渲染引擎完成,渲染引擎主要包括:HTML解釋器 CSS解釋器 布局(layout) JavaScript引擎
HTML解釋器:解釋HTML文本的解釋器,主要作用是將HTML文本解釋成DOM(文檔對象模型)樹,DOM是一種文檔的表示方法;
CSS解釋器:級聯樣式表的解釋器,它的作用是為DOM中的各個元素對象計算出樣式信息,從而為計算機最後網頁的布局提供基礎設施;
布局:在DOM創建之後,Webkit需要將其中的元素對象跟樣式信息結合起來,計算它們的大小位置等布局信息,形成一個能夠表示這所有信息的內部表示模型;
JacaScript引擎:使用JavaScript代碼可以修改網頁的內容,也能修改CSS的信息,JavaScript引擎能夠解釋JavaScript代碼並通過DOM介面和CSSOM介面來修改網頁內容和樣式信息,從而改變渲染的結果;
繪圖:使用圖形庫將布局計算後的各個網頁的節點繪製成圖形結果(例如:需要依賴2D/3D圖形庫,音頻視頻和圖片解碼器等來實現高性能的網頁繪制和網頁的3D渲染);
此內容摘自webkit內核書上復制下來的
❽ ...前端模板渲染html,jquery的html,各有什麼區別
簡單來說
後端渲染html 叫吐或者噴,機器人可以看到完整的呈現源碼
前端模板渲染html叫填,機器人看不到完整的呈現源碼
所有的渲染最終瀏覽都是一個html頁面+js,差別就是在於後端渲染的很多都是會生成些冗餘的垃圾代碼(目前很對都是),前端比較好控制
❾ 前端由 PHP 渲染時的開發流程是怎樣的
前端發ajax請求php後端,如何後端返回json數據,前端接收到就可以渲染到模板上了。