主頁 > 企業開發 > 高性能Web影片和渲染原理系列(2)——渲染管線和CPU渲染

高性能Web影片和渲染原理系列(2)——渲染管線和CPU渲染

2020-10-20 06:20:42 企業開發

示例代碼托管在:http://www.github.com/dashnowords/blogs

博客園地址:《大史住在大前端》原創博文目錄

華為云社區地址:【你要的前端打怪升級指南】

目錄
  • 一. 高性能影片
  • 二. 像素渲染管線
    • 基本渲染流程
    • 回流和重繪
  • 三. 舊軟體渲染
    • 渲染物件(RenderObject)
    • 渲染層(RenderLayer)
  • 四. 從canvas體會分層優勢
    • 不分層的情況
    • 分層繪制
    • 層的合并
  • 五.小結

一. 高性能影片

影片的流暢程度通常是以FPS(Frame Per Second,每秒幀率)作為衡量的,在攝像機錄制視頻時每一幀實際上包含了一段時間內的畫面記錄(長曝光攝影的道理相同的),如果畫面里的事物在運動,那么暫停播放時看到的畫面通常都是模糊的,這樣的畫面也被稱為“模糊幀”,加上雙眼“視覺暫留”效果的影響,影視作品一般只要達到24FPS就可以展示出看起來連續運動的畫面;而在頁面的渲染中,每一幀都是由計算機計算渲染出來的精確畫面,幀和幀之間并不存在模糊過渡,所以通常認為需要達到50FPS~60FPS的幀率,才能夠得到較好的觀看體驗,

為了達到盡可能接近60FPS以上的幀率,瀏覽器每一幀的計算和繪制所花費的時間就需要控制在1000/60≈16.6ms以內,根據Google開發者社區提供的資料,開發者最好能夠將所有的作業控制在10ms左右,以便給瀏覽器一些處理內部作業的時間,否則就無法在限定的時間內完成畫面更新,動態的內容就會表現出卡頓,對用戶體驗造成負面影響,下一節就來看一下,在這16ms的時間里,瀏覽器都需要完成哪些任務,

二. 像素渲染管線

基本渲染流程

談起瀏覽器的作業流程,你可能會在大多數文章中見過下面這張圖:

它直觀地描述了瀏覽器如何將HTML檔案和CSS樣式檔案通過逐步處理最終合成渲染樹并展示在頁面上的程序,當然其中每一步都是非常復雜的,如果你對此還不熟悉,可以通過【瀏覽器的作業原理:新式網路瀏覽器幕后揭秘】這篇文章進行了解(極力推薦這篇文章!),但實際上上面的流程里并沒有覆寫網站的整個生命周期,它只是描述了從用戶獲取到網站首頁和資源檔案后到完成首屏渲染這段時間內所做的作業,盡管作業流程幾乎是一致的,但諸如回應用戶的互動動作,在頁面上實作影片等等內容,只通過上面的宏觀原理圖理解起來還是很困難的,當開發者談及瀏覽器渲染性能的話題時,我們通常會聽到“重排”、“重繪”等術語,實際上它們就是對這后半部分作業的描述,它被稱為“瀏覽器像素渲染管線”,此時就需要祭出Google開發者社區提供的基本原理圖:

撰寫在JavaScript代碼中的那些事件監聽器、定時任務等等異步觸發的代碼就會在橙色的部分執行,這部分代碼運行在主執行緒中,如果有問題的代碼或是執行時間較長的代碼在其中造成了阻塞,后續的幾個步驟就只能等著,這會直接延緩頁面的渲染甚至導致頁面直接崩潰,當JavaScript執行完一個宏任務并清空了當前的微任務佇列后,就會開始UI渲染流程,進入下一個環節,

Style階段需要找出發生變更的樣式并重新計算相關的尺寸,當然在首屏渲染之前第一次處理CSS樣式時,瀏覽器肯定已經對計算結果進行了快取,以便在這像素渲染管線處理時節省時間,

計算完樣式本身后,就需要進入Layout階段,重新來計算發生樣式變動的元素應該以怎樣的盒模型尺寸繪制在畫面上的哪個位置,網頁中的基本排版遵循正常檔案流的規則,所以一個元素尺寸變化后,就有可能需要重新計算其父子元素或臨近元素的位置,不難想象這是一個極容易引發蝴蝶效應的環節,完成了Layout布局后,可以看到圖中使用的顏色也發生了變化,因為相對而言它們的開銷就比較輕量了,

Paint階段就是生成像素資料的程序,它會將元素的背景、邊框、陰影等等可見的部分繪制出來,它們可能會被繪制在多個層上,

Composite階段,由于繪制階段生成的畫面可能分布于多個層,那么最終渲染的結果就需要將它們按照一定的順序完成畫面的重疊,這就是瀏覽在合成階段主要的作業,當然這個程序并不一定是由CPU獨自完成的,后面還會講到,當影片執行時,瀏覽器會不斷創建幀,上面的程序就會反復發生,從而實作幀畫面的不斷變動:

回流和重繪

不同的CSS樣式的性能開銷和造成的影響是不同的,所以上面的像素渲染管路的各個階段并不一定都有作業要做,如果發生變更的元素樣式不會造成布局變化,那么layout階段就不需要做什么作業,如果發生變更的CSS屬性也可以不用重新計算各部分的像素顏色,那么paint階段也就沒有什么作業要做,這樣渲染管路就被簡化成為:

這是我們最期望得到的理想狀態,如果發生變化的CSS屬性導致Layout階段任務量的增加,這類情況就被稱為“回流”“重排”,如果發生變化的CSS屬性導致了Paint階段任務量的增加,這類情況就被稱為“重繪”,它的開銷相比Layout而言更小,從管線的特征不難明白,“回流”必然會導致“重繪”,但反之則不一定成立,

只通過Composite階段的作業就可以處理的CSS屬性就是opacity(透明度)和transform(變形),它們是各類場景中優先推薦使用的性能最高的特性,transform可以很方便地模擬出位置變化,在可以忽略畫面精度的情況下(例如純色的背景)也可以使用scale來模擬尺寸變化,

所以在滿足需求的前提下,我們當然希望選擇改變性能開銷更小的屬性,以便可以在16ms的時間內完成整個渲染管線的任務,這里所說的性能,通常是指持續修改樣式時的性能開銷,暫不討論低頻的頁面狀態變動,關于CSS屬相詳細的性能開銷,可以在【CSS Triggers】查看詳情,每個瀏覽器的實作上有細微的差別,

opacitytransform的影片性能開銷最小,并不是因為處理它們造成的影響時作業量減小了,而是因為這兩個屬性造成的影響可以在圖層合成時可以委托給強大的GPU來執行,GPU的基本架構和CPU不同,它擁有更多算術邏輯單元(也就是ALU),這使得它非常適合以并行計算的形式執行計算密集型任務,例如圖形的矩陣變換、人工神經網路的訓練等等,

opacitytransform造成的影響,都可以通過改變圖層合成時的引數來進行處理,換句話說就是它可以直接使用之前生成的位影像素資料的快取,而不需要再重新計算,也不用更新像素資料快取,配合上GPU強大的算力,性能自然很能打,

三. 舊軟體渲染

現代瀏覽器多采用軟硬體混合渲染的方式來處理,軟體渲染的方式通常也被成為“舊軟體渲染”(與之相對應的是硬體加速渲染),“舊”只是出現時間比較早,并不表示它已經被硬體渲染所取代,最初的網頁并不是作為完整的應用存在的,而只是用來做一些資訊展示,二維渲染的場景居多(因為頁面上大多都是基于“盒模型”的矩形區域和文字包圍盒的計算和繪制),這時使用CPU渲染的性能并不低,“舊軟體渲染”通常使用底層的二維圖形繪制庫,你可以借助HTML Canvas 2D API來類比理解,在canvas畫板上實作的二維影片,即使在逐幀影片中進行覆寫式的全畫布重繪,也能夠保持較高的幀率;對3D圖形學有一定了解的小伙伴都知道,3D渲染引擎只支持點、線和三角形的繪制,所以一個矩形就至少需要2個三角形來表示(當然也可是多個),直觀感覺上就是一種“殺雞用牛刀”的體驗,GPU的算力雖然很牛逼,但通常記憶體空間非常有限,所以最好只在必要時有節制地使用GPU

本節我們先忘掉GPU的加速能力,來看看軟體中需要如何處理頁面渲染,下面以WebKit內核為例來說明一下渲染的基本處理程序以及創建合成層的條件,想要進一步了解的小伙伴可以嘗試閱讀朱永勝的《WebKit技術內幕》一書(不要輕易嘗試,很容易覺得自己不適合搞前端,甚至懷疑人生),

渲染物件(RenderObject)

DOM樹決議時,瀏覽器會為可見元素創建一個RenderObject類的實體,用于記錄繪制這個節點需要的一些資訊和方法,RenderObject會依據HTML中的DOM結構生成一棵RenderObjectTree,但瀏覽器并沒有直接使用它來生成一張位圖畫面,因為如果這樣做的話,頁面上發生任何變化時,都需要重新計算變更的區域并更新快取,它的確很節省空間,畢竟只需要快取一張靜態圖片中各個像素點的顏色資料就可以了,但節省空間的代價就是無法節省時間,這樣的策略會加重重復運算的負擔,

渲染層(RenderLayer)

為了方便處理,WebKit會根據RenderObjectTree來對RenderObject進行按層分類,并最終創建一棵包含多個渲染圖層資訊的RenderLayerTree(渲染層樹),兩棵樹中的節點并不是一一對應的,當遍歷RenderObjectTree時,只有符合一定條件的節點(比如獲取了背景關系的canvas節點、video節點、具有透明樣式的節點等等,詳細的規則會根據平臺實作不同可能會有變化)會創建出新的RenderLayer節點,而其他的節點只需要添加到祖先節點上已經存在的RenderLayer節點上就可以了,規則如下:

除了根節點以外,一個RenderLayer節點的父親,就是它對應的RenderObject節點的祖先鏈中最近的祖先,且兩者所在的RenderLayer不是同一個,

根據《Webkit技術內幕》一書中的介紹,在軟體渲染中,每一個RenderLayer物件都會有一個后端類,用來存盤該層繪制的結果(但是在硬體渲染中由于合成層的存在,所以并不會為每一個RenderLayer生成后端類),你可以把后端類簡單地理解為結果快取,CPU會將各個RenderLayer的結果最終渲染為到一張位圖里,然后交給GPU展示,合成的程序也可以在GPU中進行,也就是硬體加速渲染,這里不再展開,但是僅考慮軟體渲染環節的話,RenderLayer樹就已經可以實作目的了,用過photoshop的用戶可能會對分層這種處理形式比較熟悉,它的關鍵點就是在處理有重疊的區域時必須考慮先后順序,

直接看概念可能比較繞,做個簡單的比喻,比如碼農小強的爺爺有自己的房子,然后生了幾個孩子,這些孩子里有的發展的比較好就自己買房單獨住處去了,發展的不太好的只能住在爺爺家里,接著每個孩子又生了一堆孩子,也就是小強這一輩,當然也是發展的有好有差,以碼農小強為例,發展的好的就可以自己買房子住,發展的不好的就得拼爹了,如果他爹有房子,就可以住在爹家,如果很悲劇他爹也沒房子,那他就得和他爹一起住到他爹的爹家里去(說住到墳墓里的你放學別走),RenderObjectRenderLayer的生成程序也是類似的,

四. 從canvas體會分層優勢

Webkit底層的2D渲染使用Skia庫,它是類似于Canvas API的二維圖形繪制庫,為了方便理解軟體渲染的優勢,下面通過Canvas API來看看分層到底帶來了哪些變化,本例中我們先不考慮重新計算布局的情況,僅考慮重繪的作業,以下圖為例(如果不了解canvas影片繪制,可以參考筆者曾經寫的一篇相關博文【回應式編程的思維藝術 (2)回應式Vs面向物件】):

假設在下面的分析中,地面天空是分別繪制上去的,人物和云是可以水平運動的,人比山距離觀察者更近,

不分層的情況

canvas中,使用context.getImageData(x, y, width, height)方法取得畫布上對應矩形區域的像素資料,在不分層的情況下,假設第一次渲染后,使用這個方法將畫布中的像素資料取出來存盤在backUp變數上(像素資料是一個很長的一維陣列,按順序逐行存盤著畫面中每個像素點的rgba4個值),也就是只為最終結果建立了一份快取,此時實際上已經丟失了一部分資訊了,例如云和天空、人和天空都有重疊的部分,而重疊部分的像素只保留了最上面一層的值,

當需要繪制逐幀影片時,問題就來了,人物是運動的,那么程式自然知道下一幀應該將人物繪制在什么地方,但是如果直接繪制,原來的人物仍然會留在圖中,這樣逐幀畫下去,畫面上就會留下一排人物運動的分解畫面,這顯然是不行的;如果把人物先擦掉呢?也是不行的,這樣雖然可以保持畫面上只有一個跑動的人物,但是因為畫面被快取時,像素已經被覆寫掉了,如果把人物擦掉,只從快取的資料中,是無法知道被擦掉的這部分像素點應該被修復成什么樣子的,例如下圖中,快取中是上一幀的資料復原后的圖,但是如果下一幀人物離開了原位置,原來的畫面就無法利用快取直接恢復了,例如上圖中紅框中的部分就留下了人物的殘影,

假設在上面的畫面中,人物的大小是100*100,快取的像素中,其位置是(200,400),假設一幀中它平移了10個像素,那么就可以粗略地認為需要更新的區域是左上角為(200,400),寬110,高100的矩形區域,盡管這個110*100的矩形區域可能只占了整個快取區域的10%,也就是大部分快取的像素點還是有效的,但為了修復這部分畫面,程式將不得不重新計算每個物件的繪制結果,然后將這個區域的畫面按照層次重新繪制上去,在上面的示例中,變更區擦除后從下到上依次要繪制天空、山和人物,人物是繪制在最上層的以便可以完整顯示,人物離開后的空白像素也在重繪中被修復,

分層繪制

單幅位影像素快取的劣勢其實已經很明顯了,下面再來看看分層的情況,假如上述畫面中的物件分別繪制在不同的canvas畫布上,那么一共就需要5個canvas元素,由于畫布是透明底色的,所以最終顯示結果是疊加而成的,接著為每個canvas層都生成像素資料的快取,那么在面對同樣的更新場景時,天空、地面、山和云都可以不用操作,而只需要更新人物所在的canvas層,先將受影響的區域擦除,接著重新計算人物的繪制結果并更新單層的快取,最后將新的結果繪制到目標位置上,相比之下,分層快取的方案使用了更多的存盤空間來快取繪制的像素資料,但減少了更新時的計算量,是典型的空間換時間的做法,

層的合并

顯示幕上最終呈現的是一幅位圖畫面,所以即使在上面的示例中使用了5個分布在不同層次的canvas標簽,實際上計算機在處理時仍然會對各層的像素資料按層進行合并計算,上面的示例中存在一個很容易發現的優化點,就是無論怎么重繪,實際上地面的繪制結果都會擋住對應區域的天空的繪制結果,而且它們都是靜態的,所以天空的快取資料中,與地面重疊的部分實際上沒什么用,如果更新的區域發生在重疊區,那么更新畫面的時候,天空層總是要先繪制一次然后再被更高層的或者地面覆寫掉,這時候就可以利用層合并的思想進行優化,也就是直接將天空,山和地面繪制在同個canvas上,它們整體的繪制結果快取時只需要占用原來1/3的空間(3張位圖變1張了),但對于后續的重繪卻不會造成影響,這樣就可以省掉很大一部分確定沒有用的快取,當然上面的示例只是比較簡單的情況,在DOM節點渲染結果的處理時有更加復雜的層劃分層合并的規則,但是優化的思想基本是一樣的,

五.小結

從直接繪制到分層繪制再到層的合并的程序,實際上就是從DOM節點到RenderObject樹再到RenderLayer樹的變換程序,利用canvas的實體就比較容易理解軟體渲染程序中的一些策略了,很多東西你覺得不理解,并不一定是因為它本身有多復雜,只是因為你無法知道它是為了解決什么問題而存在的,實際上當你面對同樣的問題時,可能也會采取類似甚至更好的處理策略,但當我們只看別人描述解決方案時,通常都會感覺到一個東西“特別復雜”或者“特別高大上”,所以請永遠保持謙遜,但也別丟了你的自信,最后分享一個最近很喜歡的冷段子,下一期再見,

問:"從前有一只菜鳥,他特別菜,但是他仍然在飛,請問為什么?"

答:“因為他有一顆勇敢的心!”

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/181602.html

標籤:JavaScript

上一篇:ArcGIS JsAPI 模塊化技術演變程序

下一篇:JavaScript的變數和常量

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more