作者:京東物流 盧旭
大前端包括哪些技術棧
大前端指的是涵蓋所有與前端開發相關的技術和平臺,應用于各類設備和操作系統上。大前端不僅包括Web開發,還包括移動端開發和跨平臺應用開發,具體包括:
?原生應用開發:Android、iOS、鴻蒙(HarmonyOS)等;
?Web前端框架:Vue、React、Angular等;
?小程序開發:微信小程序、京東小程序、支付寶小程序等;
?跨平臺解決方案:React Native、Flutter、Taro、Weex等。
什么是渲染
?渲染:在計算機中,渲染是指將計算機程序中的圖形數據(三維模型、紋理、光源等)通過計算和圖形處理技術,最終轉化為圖像的過程。這個過程不僅限于靜態圖像的生成,也包括動畫和視頻的渲染,以實現逼真的視覺效果。
?渲染原理:是指將代碼轉換為用戶可以看到的UI界面的過程。如在Web前端領域,渲染原理主要涉及如何將HTML、CSS和JavaScript等代碼轉化為用戶界面上的實際顯示效果。這個過程通常包括解析、布局、繪制等步驟,具體根據不同的平臺有不同的實現方式,渲染引擎也有所不同。?
Android渲染原理
Android的渲染引擎負責將應用程序的用戶界面渲染到屏幕上。其中的核心組件包括:
?SurfaceFlinger?:負責合并來自不同應用程序的圖形輸出,并將其組合成一個屏幕圖像。它管理著EventControlThread、DispSyncThread等線程,以及處理VSYNC信號,確保UI的平滑顯示?;
?Skia:Android的2D圖形庫,用于繪制應用程序的用戶界面;Skia實現了Canvas系統,可以處理矢量圖形、文本和位圖等不同類型的繪圖需求。
?OpenGL ES/Vulkan: 兩種主要的圖形API,用于處理高性能的3D渲染;OpenGL ES是移動設備上常用的圖形API標準,而Vulkan是較新的高效低開銷圖形API。
?Hardware Composer (HWC):HAL(Hardware Abstraction Layer)組件,可與GPU和顯示器直接交互;它處理來自SurfaceFlinger的圖層,并決定如何高效地組合這些圖層。
?Gralloc:圖形緩沖區分配器,它負責管理內存從不同的圖形組件(如SurfaceFlinger、應用程序)之間的共享和分配。通過Gralloc,多個圖形組件可以有效地在共享的緩沖區上進行繪制操作。
?RenderThread:這是UI渲染pipeline的一個重要部分,特別是對于繪制復雜UI的應用程序;它運行在一個獨立的線程上,以處理資源密集型的渲染任務,避免阻塞主線程。
?Choreographer?:通過內部的FrameDisplayEventReceiver接收VSYNC信號,統一處理InputEvent、Animation和Traversal等任務。它負責協調UI的繪制,確保在每個VSYNC信號到達時執行必要的繪制操作
?GLSurfaceView: 提供一個OpenGL ES繪圖表面,并且可以將OpenGL的繪圖命令路由到相關的GL context中;通常用于實現高級別的3D圖形渲染。
?TextureView:可以在應用程序中作為一個UI組件來顯示內容,如視頻和其他動畫,它內部使用Texture來高效管理。
?WebView: 用于處理H5頁面顯示的組件,它內部不僅涉及HTML渲染,還包含圖形渲染組件。
View和ViewGroup是應用框架層的核心組件,View是界面的基本元素,而ViewGroup是View的容器。渲染引擎通過遍歷View樹,計算每個View的大小和位置,并將其繪制到屏幕上。主要涉及以下幾個步驟:
?測量(Measurement):在這個階段,渲染引擎會遍歷View樹,并調用每個View的onMeasure方法來計算其大小。這個過程會從上到下(從根View到子View)進行,以確保每個View都根據其父View的大小約束來確定自己的大小。
?布局(Layout):通過XML布局文件或者Java/Kotlin代碼定義View層級,系統解析后會生成相應的View樹,在測量階段完成后,渲染引擎會進入布局階段。在這個階段,它會調用每個View的onLayout方法來確定其在屏幕上的位置。這個過程同樣是從上到下進行的,以確保每個View都被放置在正確的位置上。
?繪制(Draw):渲染引擎會遍歷View樹,并調用每個View的onDraw方法來將其內容繪制到屏幕上。這個過程可能會使用到GPU加速來提高繪制效率。
?合并圖層(Layer Merge):將不同視圖的圖層合并為最終的顯示圖像。
?顯示到屏幕(Display to Screen):將合并后的圖像顯示到屏幕上。
Android的渲染過程是自上向下的遞歸測量和布局過程,Android 系統的渲染管道充分利用了多線程、硬件加速和顯示同步技術,確保流暢的用戶體驗。從應用程序定義的界面,經過 View 系統層的繪制,到 GPU 硬件加速實現,再到最終合成顯示。這些組件共同承擔了將應用程序的圖形內容高效地顯示到設備屏幕上的任務,確保圖形渲染的高效性和穩定性。
iOS渲染原理
iOS 的渲染原理是核心組件的共同協作,實現高效且流暢的界面顯示;主要核心組件包括:
?UIKit/Core Animation層:UIKit 中的所有界面元素都是基于 UIView 和 CALayer 的,它們共同起作用來描述并管理視圖的層級關系和屬性(例如背景顏色、邊框、陰影等);DisplayLink是解決屏幕刷新率問題,DisplayLink在每次屏幕刷新前會調用回調函數,保證整個渲染過程的刷新頻率與屏幕刷新頻率同步,確保幀率。
?Core Animation:Compositing是在代碼執行修改界面的屬性之后,UIKit 會將這些修改提交給 Core Animation,后者會將這些屬性變化組合在一起,并生成一個光柵化的視圖圖像。這些圖像然后會被傳遞到合成器進行處理。Animation是Core Animation 負責處理動畫效果,通過離屏渲染和硬件加速來提高性能,這樣保證界面動畫的流暢性和穩定性。
?Render Server:Layer Tree是當應用程序將信息提交給 Core Animation,Core Animation 會將這些信息發送到一個叫作 Render Server 的后臺進程。Render Server 會處理這個層級樹(Layer Tree),并對其進行必要的合成和繪制操作。打包成二進制元數據,發送到GPU進行實際渲染,Render Server打包所有的Layer信息并發送到GPU進行實際的渲染處理。
?Metal/ OpenGL ES:繪制指令是Render Server 將合成后的層(Layer)提交給 Metal 或 OpenGL ES,這些渲染框架會根據指令調度圖形處理單元(GPU)進行實際的繪制操作。它們負責將高層次的繪圖指令轉換為低層次的 GPU 指令。
?GPU 渲染:GPU 負責執行這些繪圖指令,把每一幀繪制到屏幕緩沖區。GPU加速能夠顯著提高圖形的繪制效率和性能。
?VSync 和 Framebuffer:VSync(垂直同步)是為了避免屏幕撕裂現象,iOS 使用 VSync 機制。VSync 會在屏幕刷新期間觸發通知,使應用程序和 Render Server 知道什么時候該提交新的一幀數據。
?Framebuffer是GPU 完成渲染后,幀緩沖區 (Framebuffer) 中的內容被送到顯示控制器,最終顯示在屏幕上。
整個過程是 CPU 和 GPU 的協作工作,分階段地處理和優化每一幀的渲染,確保最終的顯示效果流暢、精美;此外,通過使用硬件加速和高效的渲染算法,iOS 渲染系統能夠在保持高性能的同時節省設備的電力消耗;而繪制流程主要包括布局、繪制和渲染,如下:
??布局階段?:在iOS中,布局是通過Auto Layout系統實現的,這是一個基于約束的布局系統,它根據視圖及其子視圖的約束條件計算位置和大小。當約束條件發生變化時,Layout Engine會重新計算視圖的位置和大小,這個過程稱為布局?;布局階段涉及到視圖的層級關系設置,包括視圖的位置、大小、背景色等屬性。這個階段還包括了計算和設置視圖的frame,這是通過約束的計算來確定的?。
?繪制階段?:繪制階段涉及到將視圖的內容繪制到屏幕上。這包括調用drawRect:和drawLayer:inContext:等方法,這些方法在視圖需要重繪時被調用?。在這個階段,視圖會將其內容繪制到圖層上。每個UIView對象都有一個layer屬性,指向一個CALayer類的對象,視圖會將自己繪制到這個圖層上?。
?渲染階段?:渲染階段是將繪制好的圖層內容呈現到屏幕上。這個過程涉及到圖層的提交、核心動畫的處理、OpenGL幾何形狀的設置以及最終的屏幕渲染?。渲染階段主要由GPU執行,而布局和繪制階段主要由CPU處理。CPU和GPU的協同工作使得iOS設備的圖形渲染高效且流暢?。
鴻蒙渲染原理
鴻蒙系統(HarmonyOS)是華為開發的一種微內核操作系統,用于包括智能手機、平板、智能手表、物聯網設備等。鴻蒙系統的渲染原理涉及多個方面,主要包括UI渲染、圖形處理和硬件加速等。鴻蒙采用了分布式架構設計,可以實現一次開發,多端部署。
鴻蒙的渲染流程包括以下幾個步驟:
1.ArkUI聲明式UI:開發者使用ArkUI編寫界面描述文件。
2.編譯生成Render Node樹:將ArkUI文件編譯成中間表示形式Render Node樹。
3.生成VNode樹:將Render Node樹轉換為VNode樹,用于虛擬DOM的管理和更新。
4.渲染合成:根據VNode樹的數據結構和屬性信息進行繪制操作,最終輸出到屏幕上。
鴻蒙的亮點在于提供了分布式UI能力,即可以在多個設備上進行協同渲染,讓UI不僅局限于一個設備上運行,而是分布式地在多個終端設備上共同運行,從而提升性能和用戶體驗。
Vue渲染原理
Vue.js是一款JavaScript框架,用于構建用戶界面;Vue的渲染原理基于虛擬DOM技術;當組件的狀態發生變化時,Vue會創建一個新的虛擬DOM樹來反映這些變化;然后,Vue會比較新老虛擬DOM樹的差異,并計算出最小的修改量來更新實際的DOM結構,其渲染流程包括以下主要步驟:
?初始化:當創建 Vue 實例時,Vue 會進行初始化,包括綁定數據、計算屬性、方法和偵聽器。響應式系統會將數據對象轉換為響應式對象,并初始化模板編譯器和渲染函數。
?解析模板:Vue首先會解析模板,并生成一個抽象語法樹(AST)。這個過程中,Vue會將模板中的指令和屬性轉換為對應的AST節點。
?生成渲染函數:Vue根據AST生成一個渲染函數,該函數用于生成虛擬DOM樹。渲染函數是一個JavaScript函數,用于生成VNode(Vue的虛擬DOM節點)并將其渲染到真實的DOM樹上。
?執行渲染函數:當組件的狀態發生變化時,Vue會重新執行渲染函數,生成一個新的虛擬DOM樹。
?對比新舊虛擬DOM樹:Vue會對比新舊虛擬DOM樹的差異,找出需要更新的部分。這個過程通過Vue內部的“diff”算法實現,該算法會對比新舊虛擬DOM樹的結構和屬性,找出差異。
?更新DOM:根據差異更新真實的DOM樹。Vue會最小化DOM操作的次數,只更新需要變化的部分,而不必重新渲染整個頁面。
Vue的渲染原理通過響應式系統和虛擬DOM協同工作,實現了高效的數據綁定和靈活的視圖更新策略。我們只需關注數據的變化,Vue會自動處理視圖的更新,大大提高了開發效率和用戶體驗。
React渲染原理
React的渲染原理有幾個核心概念:Virtual DOM(虛擬DOM)、Reconciliation(協調)。
?Virtual DOM:Virtual DOM是React用來描述真實DOM樹的一個JavaScript對象樹,其結構和真實的DOM樹一一對應。當組件的狀態(state)或屬性(props)發生變化時,React不是直接操作真實的DOM樹,而是在內存中創建一個新的Virtual DOM樹。
?Diffing 算法:React通過比較新舊Virtual DOM樹的差異(使用Diff算法),來確定哪些部分需要更新,并只對更新的部分進行對應的DOM操作,從而提高了渲染效率。
?Reconciliation:當組件狀態或屬性發生變化時,React需要調用Reconciliation算法來決定哪些DOM節點需要更新以及如何更新。Reconciliation算法的基本流程包括比較新舊Virtual DOM的根節點,判斷是否可以復用,以及根據節點的類型和屬性進行更新或替換。React采用遞歸遍歷的方式來比較新舊Virtual DOM,這也是為什么更新操作不適合過于頻繁的原因,因為遞歸遍歷是一個高消耗的操作。
React的渲染流程可以大致分為兩個階段:render階段和commit階段。
?render階段:在這個階段,React會調合(reconcile)虛擬DOM,計算出最終要渲染出來的虛擬DOM。這個過程包括生成Fiber對象、收集副作用、找出哪些節點發生了變化,并打上不同的flags。Diff算法也是在這個階段執行的。render階段的工作都是在內存中進行的,計算出更新后的Fiber樹,但在這個階段并沒有更新UI,視圖不會有任何更改。
?commit階段:在這個階段,React會根據上一步計算出來的虛擬DOM,同步地渲染具體的UI。渲染器(Renderer)會根據協調器(Reconciler)計算出來的虛擬DOM,同步地渲染節點到視圖上。這個過程是同步執行的,不可以被打斷。
React的渲染原理通過Virtual DOM和Reconciliation算法,以及調度器、協調器和渲染器的協同工作,實現了高效、可靠的UI更新。
小程序渲染原理
小程序(這里以微信小程序為例,其它大同小異)的渲染原理主要如下:
?微信小程序采用了雙線程模型,將渲染和邏輯處理分離到不同的線程中,從而提高了渲染速度和效率。具體來說,渲染層負責頁面的渲染和繪制工作,而邏輯層則負責處理小程序的業務邏輯和數據處理。
?渲染層:負責將WXML模板和WXSS樣式解析并生成最終的頁面。渲染層會構建DOM樹和樣式表,并通過底層的圖形系統進行繪制和顯示;
?邏輯層:使用獨立的JSCore作為運行環境,執行小程序的JavaScript代碼,處理用戶的輸入和事件,并更新頁面的狀態。邏輯層與渲染層之間通過特定的通信機制進行數據傳輸和事件通知。
渲染流程主要包括解析和編譯、預加載、頁面渲染和繪制與顯示,具體如下:
?解析和編譯?:當用戶打開小程序時,小程序框架首先對小程序的代碼進行解析和編譯。這一過程包括將小程序的代碼轉換成可執行的指令,并生成對應的數據結構,如頁面樹和組件樹。解析和編譯過程需要消耗一定的時間,但在后續的頁面渲染中能夠大大提高效率。
??預加載?:在解析和編譯完成后,小程序框架進行預加載。預加載是指在用戶進入具體頁面之前,提前加載可能需要使用的資源,如圖片、樣式文件等。通過預加載,小程序能夠在用戶切換頁面時減少加載時間,提高渲染速度。
??頁面渲染?:當用戶進入具體頁面時,小程序框架將頁面樹和組件樹渲染到屏幕上。渲染過程包括計算每個組件的位置和尺寸、應用樣式和布局,并生成最終的繪制指令。
?繪制與顯示?:小程序框架將渲染得到的繪制指令交給底層的圖形系統進行繪制。圖形系統會將指令轉換成圖像,并顯示在屏幕上。
微信小程序的渲染原理是一個基于雙線程模型的高效渲染過程,通過渲染層和邏輯層的分離與協同工作,實現了頁面的快速渲染和流暢的用戶體驗。
ReactNative渲染原理
React Native是基于React技術棧開發跨平臺移動應用的一種框架;React Native的渲染原理主要涉及JavaScript線程與原生線程的交互,以及React的Virtual DOM(虛擬DOM)機制。其渲染原理如下:
?JavaScript線程與原生線程的交互:React Native在JavaScript線程中運行JavaScript代碼,包括React組件的渲染邏輯;當JavaScript線程計算出需要進行UI更新時,這些更新會被序列化并通過一個叫做Bridge的機制發送給原生線程;原生線程接收到更新后,會負責實際的UI繪制和更新操作,包括創建和更新原生UI組件。
?Virtual DOM機制:React Native利用React的Virtual DOM機制來優化UI的更新;當組件的狀態或屬性發生變化時,React Native會在JavaScript線程中創建一個新的Virtual DOM樹;然后,React Native會使用Diff算法比較新舊Virtual DOM樹的差異,找出需要更新的部分;只有差異部分會被通過Bridge發送給原生線程進行更新,從而減少了數據傳輸量,提高了性能。
React Native的渲染流程主要包括以下幾個步驟:
?組件渲染:在JavaScript線程中,React Native組件的render方法會被調用,生成對應的Virtual DOM描述。這個描述會被React的渲染系統用來構建組件樹。
?Diff算法比較:當組件的狀態或屬性發生變化時,React Native會使用Diff算法比較新舊Virtual DOM樹的差異。這個過程會找出需要更新的部分,并準備相應的更新指令。
?數據序列化與傳輸:更新指令會被序列化為原生線程可理解的數據格式。然后,這些數據會通過Bridge機制發送給原生線程。
?原生UI更新:原生線程接收到更新指令后,會解析這些指令并應用到實際的UI控件上。這包括創建新的原生UI組件、更新現有組件的屬性或移除不再需要的組件等。
?渲染結果展示:經過原生線程的處理后,UI的更新會實時反映在移動設備的屏幕上。用戶可以看到最新的界面效果,并根據需要進行進一步的交互。
React Native的渲染原理和主要流程通過JavaScript線程與原生線程的緊密協作,以及Virtual DOM和Diff算法的優化,實現了在JavaScript中編寫UI代碼并在App原生環境中高效渲染的能力。這種機制不僅提高了應用的性能,還降低了跨平臺開發的復雜性和成本。
Flutter渲染原理
Flutter是Google推出的開源UI框架,主要用于多平臺的應用開發。其渲染原理是構建跨平臺應用的關鍵部分,主要基于其獨特的三層樹結構:Widget樹、Element樹和RenderObject樹(或稱為渲染樹)。這三層結構的設計旨在優化性能,減少不必要的重繪和重建。
?Widget樹:Widget是Flutter中用戶界面的不可變描述,是構成Flutter應用程序的基本元素。Widget樹是存放渲染內容的配置數據結構,創建非常輕量,在頁面刷新的過程中隨時會重建。
?Element樹:Element是Widget樹和RenderObject樹之間的中間層,負責將Widget樹的變化抽象化,并管理RenderObject的復用。Element持有Widget的引用,并可以對其屬性進行修改,而不是完全重建整個樹。
?RenderObject樹(渲染樹):RenderObject樹用于應用界面的布局和繪制,保存了元素的大小、布局等信息。RenderObject的創建和銷毀相對耗能,因此Element樹會緩存RenderObject對象,以便在需要時復用。
Flutter的渲染流程主要包括以下幾個階段:
?構建(Build):Flutter框架根據Widget樹中的變化調用每個Widget的build方法;build方法返回一個新的Widget,表示當前Widget的最新狀態;此階段主要確定哪些Widget需要更新。
?布局(Layout):在構建階段之后,Flutter框架執行布局過程;為每個需要更新的Widget確定其在屏幕上的位置和大小;調用每個Widget的layout方法,根據其約束條件(如最大寬度、最小高度等)計算出最佳的位置和大小。
?繪制(Paint):布局階段完成后,Flutter框架執行繪制過程;根據每個Widget的布局信息將其繪制到屏幕上;調用每個Widget的paint方法,將Widget的內容繪制到一個離屏的Canvas上。
?合成(Compositing):在繪制階段完成后,Flutter框架執行合成過程;將所有已繪制的Canvas組合成最終的顯示圖像;調用每個Widget的compositing方法,將它們的繪制結果合并到一起。
?顯示(Display):合成階段完成后,Flutter框架將最終的顯示圖像發送給硬件,將其顯示在屏幕上。
綜上所述,Flutter的渲染原理通過三層樹結構的設計和優化,實現了高效、流暢的跨平臺應用界面渲染。
Taro渲染原理
Taro框架的核心思想是通過將Vue或React中編寫的代碼進行抽象和統一規范,然后映射到不同的平臺上,通過組件化的方式實現統一代碼覆蓋多個平臺。這種方式大大提高了代碼的復用率和開發效率。主要如下:
?統一抽象規范:Taro框架定義了一套跨平臺的組件、事件、CSS樣式等規范,使得在編寫React代碼時,能夠通過這些抽象出來的規范來編寫,從而實現跨平臺的兼容性。
?代碼轉換:Taro框架為不同的平臺提供對應的代碼轉換工具,將抽象的React代碼轉換為應該在目標平臺上運行的代碼。這一步驟是Taro實現跨平臺渲染的關鍵。
?統一API:將不同平臺上的API進行兼容性處理和封裝,使得在不同平臺上的開發人員都可以通過同樣的API進行開發。這樣做不僅降低了開發難度,還提高了開發效率。
?差異化處理:針對不同的平臺特性,Taro框架進行了特定平臺的定制化開發,充分利用不同平臺的特性,提供更多豐富的功能支持。這種差異化處理使得Taro框架在不同平臺上都能發揮出最佳的性能。
而渲染技術主要包括以下幾個方面:
?虛擬DOM:React或Vue使用虛擬DOM來提高頁面渲染的性能。虛擬DOM是在內存中維護的一個輕量級的JavaScript對象樹,它表示了真實的DOM結構。通過比較新舊虛擬DOM的差異,然后只更新實際DOM中需要改變的部分,從而避免不必要的DOM操作,提高渲染效率。
?事件處理:Taro框架對事件處理進行了跨平臺封裝,使得開發者可以使用統一的API來處理不同平臺上的事件。這種封裝方式簡化了事件處理的復雜度,提高了開發效率。
?Prerender技術:Prerender是由Taro CLI提供的一種技術,用于提高小程序頁面初始化的渲染速度。它通過將頁面初始化的狀態直接渲染為無狀態的wxml,在框架和業務邏輯運行之前執行渲染流程,從而提高頁面的加載速度。Prerender技術的實現原理與服務端渲染類似,但它是針對小程序端進行的優化。
Taro框架的渲染原理主要基于React或Vue的跨平臺渲染技術,通過統一抽象規范、代碼轉換、統一API和差異化處理等手段實現代碼的跨平臺復用和高效渲染;Taro還提供了Prerender等技術來優化頁面加載速度,提升用戶體驗。基于這些技術使得Taro框架成為了一個功能強大、易用、跨平臺兼容的開發框架。
瀏覽器的渲染原理
瀏覽器的渲染原理是一個復雜的過程,涉及到多個組件和線程的協作,才能確保網頁能夠正確、快速地顯示在用戶面前。瀏覽器渲染原理主要如下:
?瀏覽器的主要組件
?界面控件:包括地址欄、前進后退按鈕、書簽菜單等,這些是用戶與瀏覽器交互的界面部分。
?瀏覽器引擎:它是瀏覽器的核心,負責協調各個組件的工作,處理用戶的請求和操作。
?渲染引擎:它負責解析HTML、CSS,構建DOM樹和Render樹,最終將網頁內容呈現給用戶。
?網絡組件:它負責發送HTTP請求,獲取網頁資源。
?JS解釋器:它用于解析執行JavaScript代碼,實現網頁的動態效果。
?數據存儲持久層:它用于存儲cookies、localStorage等數據。
?瀏覽器的多進程架構
?隔離性:每個標簽頁運行在獨立的進程中,避免了一個標簽頁崩潰影響到其他標簽頁。
?安全性:不同進程之間不共享資源和地址空間,減少了安全隱患。
?瀏覽器的主要線程
?GUI渲染線程:它負責渲染瀏覽器界面HTML元素,當界面需要重繪或回流時,該線程會執行。
?JavaScript引擎線程:它負責解析執行JavaScript代碼,與GUI渲染線程互斥,確保DOM操作的安全。
?定時觸發器線程:它負責計時并觸發定時事件。
?事件觸發線程:它將事件添加到待處理隊列中,等待JS引擎處理。
?異步http請求線程:它負責處理XMLHttpRequest請求,將狀態變更事件放入JS引擎的處理隊列中。
?渲染流程
?解析HTML,構建DOM樹:當用戶輸入網址或點擊鏈接時,瀏覽器會向服務器發送請求,獲取網頁的HTML文件。瀏覽器開始解析HTML文件,將其轉換為瀏覽器能夠理解和操作的文檔對象模型(DOM)樹。DOM樹是由HTML標簽和它們的層級關系組成的樹狀結構,表示了網頁的結構和內容。
?樣式計算(CSSOM樹構建與渲染樹生成):CSSOM樹構建,瀏覽器解析CSS文件或
審核編輯 黃宇 標簽中的樣式信息,將其轉換為瀏覽器能夠理解的樣式表對象模型(CSSOM)樹。CSSOM樹表示了文檔中所有元素的樣式信息。渲染樹生成:瀏覽器將DOM樹和CSSOM樹合并,形成渲染樹(Render Tree)。渲染樹是DOM樹的一個可視化表示,只包含需要顯示的節點和這些節點的樣式信息。
?布局:瀏覽器根據渲染樹中的信息,計算每個節點的幾何信息(如位置、大小等),并生成布局樹(Layout Tree)。布局階段會確定頁面上所有元素的位置和大小,確保它們能夠按照預期的方式排列。
?分層:為了更高效地渲染頁面,瀏覽器會對布局樹進行分層處理,生成分層樹(LayerTree)。擁有層疊上下文屬性(如定位屬性、透明屬性、CSS濾鏡、z-index等)的元素會被提升為單獨的圖層。分層有助于瀏覽器進行并行繪制,減少重繪和重排的開銷。
?繪制:瀏覽器遍歷分層樹中的每個圖層,使用圖形庫將圖層的內容繪制成圖像。繪制階段會生成一個繪制列表,該列表包含了繪制每個元素所需的指令和順序。繪制操作是由渲染引擎中的合成線程來完成的。
?合成顯示:合成線程將圖層劃分為圖塊(tile),并將圖塊轉換為位圖(通過柵格化操作)。柵格化操作通常使用GPU來加速生成位圖。一旦所有圖塊都被柵格化,合成線程就會生成一個繪制圖塊的命令(DrawQuad),并將該命令提交給瀏覽器進程。瀏覽器進程根據DrawQuad命令生成頁面,并將其顯示到屏幕上。
?交互處理:當用戶與頁面進行交互(點擊、滾動、輸入等)時,瀏覽器會更新渲染樹,并重新進行布局和繪制。
瀏覽器的渲染原理是涉及資源的加載、解析、構建DOM和CSSOM樹、布局、繪制、合成以及交互處理等多個步驟;涉及多線程處理、緩存機制、?DNS解析、?TCP連接等,確保了網頁的快速、穩定、高效渲染。
它們的相同點與不同點
?相同點
?層次結構:所有技術棧都基于某種形式的樹狀結構來管理UI組件。
?測量和布局:渲染過程通常包含測量、布局、繪制階段。
?更新機制:大多數框架都采用某種形式的Diff算法來優化DOM更新,以提高性能。
?不同點
?運行環境不同:APP運行在操作系統之上,具有更高的權限和更豐富的系統資源;H5頁面是基于瀏覽器渲染,受到瀏覽器沙箱模型的限制;小程序受到宿主環境類瀏覽器環境的限制。
?渲染機制不同:APP渲染通常涉及到底層的圖形渲染接口(如Skia、OpenGL等),可以直接與GPU交互;而瀏覽器渲染則主要依賴于HTML、CSS和JavaScript等前端技術,并通過瀏覽器引擎(如Blink、Gecko等)進行渲染。iOS和Android利用GPU進行硬件加速渲染,大大提升復雜UI的繪制性能。Web前端如Vue和React采用虛擬DOM和Diff算法來更新UI。小程序等跨平臺框架通常需要在邏輯層與視圖層之間進行橋接通信。Web和小程序通常依賴瀏覽器或宿主環境的渲染引擎。
?性能優化不同:APP渲染可以利用操作系統的特性進行更深入的性能優化(如硬件加速、內存管理等);而瀏覽器渲染則受到瀏覽器引擎和前端技術的限制,在性能優化上可能相對較弱。
?跨平臺性不同:APP需要針對不同的操作系統和設備進行開發和適配;而瀏覽器渲染則具有更好的跨平臺性,可以在不同的瀏覽器和設備上運行。
?協同渲染:鴻蒙OS的分布式UI能力允許跨設備協同渲染,而其他框架通常只在單個設備上進行渲染。
綜上所述,APP渲染、H5頁面渲染、小程序渲染在多個方面存在多個區別。這些區別源于它們不同的運行環境、渲染機制、性能優化和跨平臺性等因素。
隨著技術的發展,大前端的各種技術棧不斷涌現,各自發展出了適合自身特性的渲染機制。不同技術棧在各自的應用領域都有獨特的優勢和適用場景,我們根據項目需求和團隊情況選擇合適的技術棧,可以更高效地實現高性能的UI和良好的用戶體驗。
審核編輯 黃宇
-
Android
+關注
關注
12文章
3923瀏覽量
127133 -
gpu
+關注
關注
28文章
4700瀏覽量
128697 -
前端
+關注
關注
1文章
190瀏覽量
17724 -
代碼
+關注
關注
30文章
4747瀏覽量
68349 -
DOM
+關注
關注
0文章
17瀏覽量
9564
發布評論請先 登錄
相關推薦
評論