當前位置:首頁 » 網頁前端 » 安卓前端界面渲染
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

安卓前端界面渲染

發布時間: 2023-04-28 20:24:29

前端渲染是靜態頁面嗎

渲染。。。是從後台獲取到數據後渲染到頁面顯示。。。。這個不是靜態頁面吧

Ⅱ 渲染的工作流程

前端web頁面的渲染流程

1、構建DOM與 CSSOM
瀏覽器通過http請求,獲得靜態資源後,進行頁面渲染時,構建dom與cssom是同時進行的。
html 構建dom
構建dom時,按照html頁面中標簽的順序,由上向下渲染。
css 構建cssom
html構建cssom的同時,將css樣式構建為cssom
2、渲染樹 Render Tree

該過程中DOM與CSSOM合並,生成渲染樹,樹中包含了渲染頁面所需要的節點。

3、布局Layout

計算出每個節點對象的精確位置和大小

4、繪制Paint

使用上面准備好的節點信息,繪制出頁面

javascript

我們看到,在構建DOM和CSSOM階段,會有javascript進入

1、當瀏覽器遇到一個 script 標記時,DOM 構建歷賀肢拍慧將暫停,直至腳本完成執行。

2、JavaScript 可以查詢和修改 DOM 與 CSSOM。

3、JavaScript 執行將暫停,直至肢世 CSSOM 就緒。

————————————————
原文鏈接: https://blog.csdn.net/_30891377/article/details/106313534

Ⅲ 「Android渲染」圖像是怎樣顯示到屏幕上的

我們每天花很多時間盯著手機屏幕,不知道你有沒有好奇過:

這時候來了一位Android程序員(當然也可以是iOS或者是前端程序員)說: 這里顯示的其實是一個View樹,我們看到的都是大大小小的View。

。。。聽起來很有道理,我們也經常指著屏幕說這個View怎麼怎麼樣,可問題又來了:

程序員老兄又來了: 屏幕當然不能識別View,它作為一個硬體,只能根據收到的數據改變每個像素單元的數據,這樣整體來看,用戶就發現屏幕上的內容變化了。至於View的內容是如何一步一步轉化成屏幕可是識別的數據的,簡單講可以分成三步:

。。。聽起來很有道理,可問題又來了:

那可就說來話長了。。。

對於 measure layout 和 draw ,Android工程師(大都)非常熟悉,我們常常在執行了 onDraw() 方法後,一個讓人自豪的自定義View就顯示出來了。在實際的Android繪制流程中,第一步就是通過 measure layout 和 draw 這些步驟准備了下面的材料:

在清芹Android的繪制中,我們使用Canvas API進行來告訴表示畫的內容,如 drawCircle() drawColor() drawText() drawBitmap() 等,也是這些內容最終呈現在屏幕上。

在當前應用中,View樹中所有元素的材料最終會封裝到 DisplayList 對象中(後期版本有用 RenderNode 對 DisplayList 又做了一層封裝,實現了更好的性能),然後發送出去,這樣第一階段就完成了。

當然就有一個重要的問題:

會將Bitmap復制到下一個階段(准確地講就是復制到GPU的內存中)。
現在大多數設備使用了GPU硬體加速,而GPU在渲染來自Bitmap的數據時只能讀取GPU內存中的數據, 所以需要賦值Bitmap到GPU內存,這個階段對應的名稱叫 Sync&upload 。另外,硬體加速並不支持所有Canvas API,如果自定義View使用了不支持硬體加速的Canvas API(參考 Android硬體加速文檔 ),為了避免出錯就需要對View進行軟體繪制,其處理方式就是生成一個Bitmap,然後復制到GPU進行處理。

這時可能會有問題:如果Bitmap很多或者單個Bitmap尺寸很大,這個過程可能會時間比較久,那有什麼辦法嗎?

當然有(做作。。。)

關於Bitmap這里再多說一句:
Bitmap的內存管理一直是Android程序員很關心的問題,畢竟它是個很占內存的大胖子,在Android3.0~Android7.0,Bitmap內存放在Java堆中,而android系統中每個進程的Java堆是有嚴格限制的,處理不好這些Bitmap內存,容易導致頻繁GC,甚至觸發Java堆的 OutOfMemoryError 。從Android8.0開始,bitmap的像素數據放入了native內存,於是Java Heap的內存問題暫時緩解了。

Tip:

現在材料已經備好,我們要真正地畫東西了。

接下來就要把東西畫出來了,畫出來的過程就是把前面的材料轉化成一個堆像素數據的過程,也叫 柵格化 ,那這個活兒誰來干呢?

候選人只有兩個:

大拍正廳部分情況下,都是GPU來干這個活兒,因為GPU真的特別快!!!

所謂的「畫」,對於計算機來講就是處理圖像,其實就是根據需要(就是DisplayList中的命令)對數據做一些特定類型的數學運算,最後輸出結果的過程。我們看到的每一幀精美界面,(幾乎)都是GPU吭哧吭哧"算"出來的,這個就有疑問了:

我們簡單地聊聊CPU與GPU的區別:
CPU的核心數通常是幾個,單個核心的主頻高,功能強大,擅長串列處理復雜的流程;
GPU ( Graphics Processing Unit ) 有成百上千個核心,單個核心主頻低,功能有限,擅長(利用超多核心)大量並行簡單運算;正如它的名字一樣,GPU就是為圖像繪制這個場景量身定做的硬體(所以使用GPU也叫硬體加速),後來也被用到挖礦和神經網路中。

圖襲隱片肯定沒有視頻直觀,我們從感性的角度感受一下GPU到底有多快,我想下面的視頻看過就不會忘掉,你會被GPU折服:
Mythbusters Demo GPU versus CPU

看這個視頻,我們對於「加速」應該有了更深刻的印象,這里不再進一步分析CPU和GPU更微觀的差別(因為不懂),我想已經講明白為什們GPU更快了。

另外,在GPU開始繪制之前,系統也做了一些優化(對DisplayList中的命令進行預處理),讓整個繪制流程更加高效:

第二步的具體過程還是很復雜的,比如涉及到Alpha繪制,相關的優化會失效,詳情查看文章 為什麼alpha渲染性能低 .

至於畫在哪裡,我們現在理解為一個緩沖(Buffer)中就可以了,具體的機制放在第三步講。

到此,我們已經畫(繪制)完了圖像內容,把這個內容發送出去,第二步的任務就完成了。

Tip:

我們知道,除了我們的應用界面,手機屏幕上同時顯示著其他內容,比如SystemUI(狀態欄、導航欄)或者另外的懸浮窗等,這些內容都需要顯示到屏幕上。所以要先 把這些界面的內容合成,然後再顯示到屏幕

在講合成圖像之前,我們有必要知道這些界面圖像(Buffer)是怎麼傳遞的:

Android圖形架構中,使用生產者消費者模型來處理圖像數據,其中的圖像緩沖隊列叫 BufferQueue , 隊列中的元素叫 Graphic Buffer ,隊列有生產者也有消費者;每個應用通常會對應一個 Surface ,一個 Surface 對應著一個緩沖隊列,每個隊列中 Graphic Buffer 的數量不超過3個, 上面兩步後繪制的圖像數據最終會放入一個 Graphic Buffer ,應用自身就是隊列的生產者( BufferQueue 在Android圖形處理中有廣泛的應用,當前只討論界面繪制的場景)。

每個 Graphic Buffer 本身體積很大,在從生產者到消費者的傳遞過程中不會進行復制的操作,都是用匿名共享內存的方式,通過句柄來跨進程傳遞。

我們可以通過以下命令來查看手機當前用到的 Graphic Buffer 情況:

關於上面的命令,你可能會好奇這個 SurfaceFlinger 是什麼東西啊?

上文提到過每個應用(一般)對應一個 Surface ,從字面意思看, SurfaceFlinger 就是把應用的 Surface 投射到目的地。

實際上, SurfaceFlinger 就是界面(Buffer)合成的負責人,在應用界面繪制的場景, SurfaceFlinger 充當了 BufferQueue 的消費者。繪制好的 Graphic Buffer 會進入(queue)隊列, SurfaceFlinger 會在合適的時機(這個時機下文討論),從隊列中取出(acquire)Buffer數據進行處理。

我們知道,除了我們的應用界面,手機屏幕上同時顯示著其他內容,比如SystemUI(狀態欄、導航欄)或者另外的懸浮窗等,這些部分的都有各自的Surface,當然也會往對應的 BufferQueue 中生產 Graphic Buffer 。

如下圖所示, SurfaceFlinger 獲取到所有Surface的最新Buffer之後,會配合HWComposer進行處理合成,最終把這些Buffer的數據合成到一個 FrameBuffer 中,而FrameBuffer的數據會在另一個合適的時機(同樣下文討論)迅速地顯示到屏幕上,這時用戶才觀察到屏幕上的變化。

關於上圖中的 HWComposer ,它是Android HAL介面中的一部分,它定義了上層需要的能力,讓由硬體提供商來實現,因為不同的屏幕硬體差別很大,讓硬體提供商驅動自己的屏幕,上層軟體無需關心屏幕硬體的兼容問題。

事實上,如果你觀察足夠仔細的話,可能對上圖還有疑問:

同學你觀察很仔細(...),事實上,這是 SurfaceFlinger 合成過程中重要的細節,對於不同 Surface 的Buffer, 合成的方法有兩種:

顯然第一種方法是最高效的,但為了保證正確性,Android系統結合了兩種方法。具體實現上, SurfaceFlinger 會詢問( prepare ) HWComposer 是否支持直接合成,之後按照結果做對應處理。

有的朋友憋不住了:

Good question! (太做作了。。。)

為了保證最好的渲染性能,上面各個步驟之間並不是串列阻塞運行的關系,所以有一個機制來調度每一步的觸發時機,不過在此之前,我們先講介紹一個更基礎的概念:

屏幕刷新率

刷新率是屏幕的硬體指標,單位是Hz(赫茲),意思是屏幕每秒可以刷新的次數。

回到問題,既然屏幕這個硬體每隔一段時間(如60Hz屏幕是16ms)就刷新一次,最佳的方案就是屏幕刷新時開始新一輪的繪制流程,讓一次繪制的流程盡可能占滿整個刷新周期,這樣掉幀的可能性最小。基於這樣的思考,在Android4.1(JellyBean)引入 VSYNC(Vertical Synchronization - 垂直同步信號)

收到系統發出的VSYNC信號後, 有三件事會同時執行(並行)

下圖描述了沒有掉幀時的VSYNC執行流程,現在我們可以直接回答問題了: 合適的時機就是VSYNC信號

從上圖可以看出,在一次VSYNC信號發出後,屏幕立即顯示2個VSYNC周期(60Hz屏幕上就是32ms)之前開始繪制的圖像,這當然是延遲,不過這個延遲非常穩定, 只要前面的繪制不掉鏈子 ,界面也是如絲般順滑。當然,Android還是推出一種機制讓延遲可以縮小到1個VSYNC周期,詳情可參考 VSYNC-offset 。

實際上,系統只會在需要的時候才發出VSYNC信號,這個開關由SurfaceFlinger來管理。應用也只是在需要的時候才接收VSYNC信號,什麼時候需要呢?也就是應用界面有變化,需要更新了,具體的流程可以參考 View.requestLayout() 或 View.invalidate() 到 Choreographer (編舞者)的調用過程。這個過程會注冊一次VSYNC信號,下一次VSYNC信號發出後應用就能收到了,然後開始新的繪制工作;想要再次接收VSYNC信號就需要重新注冊,可見,應用界面沒有改變的時候是不會進行刷新的。

我們可以看到,無論是VSYNC開關,還是應用對VSYNC信號的單次注冊邏輯,都是秉承著按需分配的原則,這樣的設計能夠帶來Android操作系統更好的性能和更低的功耗。

Tip:

終於。。。說完了

我們簡單回顧一下,

更形象一點就是:

之所以有這一節,是因為隨著Android版本的更替,渲染方案也發生了很多變化。為了簡化表達,我們前文都以當前最新的方案來講解,事實上,部分流程的實現方式在不同版本可能會有較大的變化,甚至在之前版本沒有實現方案,這里我盡可能詳細地列出Android版本更迭過程中與渲染相關的更新(包括監控工具)。

如果你居然能讀到這里,那我猜你對下面的參考文章也會感興趣:

https://source.android.com/devices/graphics

https://hencoder.com/tag/hui-/

https://www.youtube.com/watch?v=wIy8g8yNhNk&feature=emb_logo

https://www.youtube.com/watch?v=v9S5EO7CLjo

https://www.youtube.com/watch?v=zdQRIYOST64&t=177s

https://www.youtube.com/watch?v=we6poP0kw6E&index=64&list=

https://developer.android.com/topic/performance/rendering

https://developer.android.com/guide/topics/graphics/hardware-accel

https://developer.android.com/topic/performance/rendering/profile-gpu#su

https://mp.weixin.qq.com/s/0OOSmrzSkjG3cSOFxWYWuQ

Android Developer Backstage - Android Rendering

Android Developer Backstage - Graphics Performance

https://elinux.org/images/2/2b/Android_graphics_path--chis_simmonds.pdf

Ⅳ app如何查看前端渲染時間記錄

app查看前端渲染時間記錄步驟如下:
1、打開開發者工具。
2、找到Performance,點擊錄制按鈕。
3、F5刷新頁面,點擊關閉錄制(同錄滾鬧制按鈕)。
4、帆滾找到Summary(console只上偏大轎罩中部左側位置)。

Ⅳ 華為webview有什麼用渲染

webview渲染的作用是:webview可以內嵌在移動端,實現前端的混合式開發,大多數混合式開發框架都是基於webview模式進行二次開發的。webview可以直接使用html文件(網路上或本地assets中)作布局,可和JavaScript交互調用。webview是一個基於webkit的引擎。

一、webview基本介紹

webview 是一個基於webkit的引擎,可以解析DOM 元素,展示html頁面的控制項,它和瀏覽器展示頁面的原理是相同的,所以可以把它當做瀏覽器看待。(chrome瀏覽器也是基於webkit引擎開發的,Mozilla瀏覽器是基於Gecko引擎開發的)

二、使用webview的好處

原生APP是將頁面的布局設計,以及業務代碼打包然後用戶下載安裝使用,而webview是通過載入html文件來進行頁面的展示,當需要更新頁面的布局或者業務邏輯變更時,如果是原生的APP就需要修改前端內容,升級打包,重新發布才可以使用最新螞迅的。

而通過webview方式的頁面則只需要修改html代碼或者js文件(如果是從伺服器端獲取,只要新的文件部署完成),用戶重新刷新就可以使用更新後的,無需通過下載安裝的方式完成升級。

三、webview渲染的作用

webview渲染是用於展現web頁面的控制項。webview可以內嵌在移動端,實現前端的混合式開發,大多數混合式開發框架都是基於webview模式進行二次開發的。

webview可以直接使用html文件(網路上或本地assets中)作布局,可和JavaScript交互調用。webview控制項功能強大,除了具有一般View的屬性和設置外,還可以對url請求、頁面載入、渲染、頁面交互進行強大的處理。

webview是chrome瀏覽器的內核,所有臘物州安卓手機必須預裝,用於顯示網頁,手機的APP可以調用它顯示網頁而不需要瀏覽器,升級以提升系統整體集成應用的網頁性能。此應用缺失會導致手機功能故障。

海報分享

收藏
0
0
行業動態
後端技術棧有哪些
2022-12-22 16:40:00

行業動態
什麼是業務層
2022-12-22 17:20:00

0 條回復
A
文章作者
M
管理員
您必須登錄或注冊以後才能發表評論

登錄輪蔽
歡迎您,新朋友,感謝參與互動!
確認修改
稱呼
郵箱
說說你的看法
提交
暫無討論,說說你的看法吧
標簽
google Google SEO NFT seo tiktok 互聯網+ 亞馬遜 亞馬遜網路 倪葉明 創業 創業商機 副業 副業賺錢 副業項目 加盟代理 地攤創業 域名 小程序 小紅書 工具類 常識 開店指南 抖音 抖音小店 抖音帶貨 抖音電商 招商加盟 推廣 教程 新視點 海外賺錢 獨立站 網路 直播帶貨 短視頻 網路創業 老李談銷售 營銷推廣 行業報告 視頻號 谷歌seo 財稅代賬 賺錢 跨境電商 門路

Copyright © 2023 水源智庫
查詢 97 次,耗時 1.0783 秒
首頁
專題
圈子

Ⅵ 前端大量數據一次渲染的寫法

您好,前端大量數據一次渲染的寫法主要有以下幾種:
1. 使用懶載入:懶載入可以有效地減少頁面渲染時間,只有當用戶滾動到特定位置時,才會載入需要渲染的數據,從而減少頁面渲染時間。
2. 使用分頁:分頁可以有效地減少頁面渲染時間,只有當用戶滾動到特定位置時,才會載入需要渲染的數據,從而減少頁面渲染時間。
3. 使用緩存:緩存可以有效地減少頁面渲染時間,只有當用戶滾動到特定位置時,才會載入需要渲染的數據,從而減少頁面渲染時間。
4. 使用演算法:使用演算法可以有效地減少頁面渲染時間,只有當用戶滾動到特定位置時,才會載入需要渲染的數據,從而減少頁面渲染時間。
5. 使用延遲載入:延遲載入可以有效地減少頁面渲染時間,只有當用戶滾動到特定位置時,才會載入需要渲染的數據,從而減少頁面渲染時間。

Ⅶ 最全從輸入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")這種任務),執行棧被清空後再去微任務,這樣往復循環(冤冤相報何時了)

下面來看一段代碼

我們看看它的執行情況

具體的執行過程大致就是這樣。


Ⅷ 後端渲染html,前端模板渲染html,jquery的html,各有什麼區別

對於網頁而言者爛枯,無論後端程序是多麼的復雜,最終返回給客戶端的還是HTML文件。頁面渲歷罩染模式主要分:伺服器端渲染、客戶端(前端)渲染。不管哪種渲染模式,其實都是基於模板引擎而言的。

對於普通用戶而言,採用哪種渲染模式似乎並不重要,但對於網站架構而言其中區別還是很大的。

伺服器端渲染(SSR)

伺服器端渲染其實就是伺服器端在返回HTML給客戶端之前,先將HTML模板上特定區域填充上數據後生成完整的HTML返回給客戶端。

此時模板文件存儲首洞在伺服器端。

1、優點:由伺服器端進行數據填充工作,不會影響前端性能(解析模板是有性能開銷的)、SEO友好、首屏渲染快;

2、缺點:佔用了伺服器端運算資源,響應體較大(因為返回的是完整的HTML文本)。

客戶端渲染

客戶端渲染指的就是藉助前端的JavaScript調用後端API來實現頁面渲染。前端也是有模板引擎的,而前端模板引擎在填充數據時也是靠JS來操作DOM節點的。

此時模板文件存儲在前端。

1、優點:不佔用伺服器端資源,模板在前端改起來更容易,不用麻煩後端聯調;

2、缺點:由前端JS負責數據解析和填充工作,在弱網環境下頁面載入時可能會出現亂版現象,渲染起來速度可能會慢一些。另外使用前端渲染很多數據都是動態調用API進行填充的,所以不利於SEO。

以上就是我的觀點,對於這個問題大家是怎麼看待的呢?歡迎在下方評論區交流~我是科技領域創作者,十年互聯網從業經驗,歡迎在線咨詢

Ⅸ scrapy爬取前端渲染頁面

ok,現在我們就可以愉快的抓取動態渲染的頁面了,溜了。

Ⅹ 客戶端渲染和服務端渲染的區別(轉)

服務端渲染 :DOM樹在服務端生成,然後返回給前端。

客戶端渲染 (SSR):前端去後端取數據生成DOM樹。

服務端渲染的優點

1、盡量不佔用前端的資源,前端這塊耗時少胡埋,速度快。

2、有利於SEO優化,因為在後端有完整的html頁面,所以爬蟲更容易爬取信息。

服務端渲染的缺點

1、不利於前後端分離,開發的效率降低了。歷粗

2、對html的解析,對前端來說加快了速度,但是加大了伺服器的壓力。

客戶端渲染的優點

1、前後端分離,開發效率高。

2、用戶體驗更好,我們將網站做成SPA(單頁面應用)或者部分內容做成SPA,當用戶點擊時,不會形成頻繁的跳轉。

客戶端渲染的缺點

1、前端響應速度慢,特別是首屏,這樣用戶是受不了的。

2、不利於SEO優化,因為爬蟲不認識SPA,所以它只是記錄了一個頁面。

服務端和客戶端渲染的區別

1、二者本質的區別:是誰來完成了html的完整拼接,服務端渲染是在服務端生成DOM樹,客戶端渲染是在客戶端生成DOM樹。

2、響應速度:服務端渲染會加快頁面的響應速度,客戶端渲染頁面的響應速度慢。

3、SEO優化:服務端渲染因為是多個頁面,更有利於爬蟲爬取信息,客戶端渲染不利於SEO優化。

4、開發效率:服務端渲染邏輯分離的不好,不利於前後端分離,開發效率低,客戶端渲染是採用前後端分離的方式開發,效率更高,也是大部分業務採取的渲染方式。

直觀的區分服務端渲染和客戶端渲染:

源碼里如果能找到前端頁面中的內容文字,那就是在服務端構建的DOM,就是服務端渲染,反之是客戶端渲染。

應該使用服務端渲染還是客戶端渲染:

我們要根據業務場景去選擇渲染的方式。

如果是企業級網站,主要功能是頁面展示,它沒有復雜的交互,並且需要良好的SEO,那我們應該使用服務端渲染。

如果是後台管理頁面,交互性很強,它不需要考慮到SEO,那我們應該使用客戶端渲染。

具體使用哪種渲染方式也不是絕對的,現在很多肢做鎮網站使用 服務端渲染和客戶端渲染結合 的方式:首屏使用服務端渲染,其他頁面使用客戶端渲染。這樣可以保證首屏的載入速度,也完成了前後端分離。