不管我們對(duì)于小程序這種形態(tài)存在何種質(zhì)疑,但不可否認(rèn)已經(jīng)融入到我們生活的方方面面,出門打車、掃碼、點(diǎn)外賣甚至收能量等等操作都是以小程序進(jìn)行承載。背后的緣由是小程序足夠輕量、便捷、跨平臺(tái)等特點(diǎn),為用戶提供了豐富的功能和優(yōu)質(zhì)的用戶體驗(yàn)。
究其核心,小程序能夠擁有媲美原生體驗(yàn)的重點(diǎn)在于快速渲染機(jī)制,其起到了至關(guān)重要的作用。這里就探究下快速渲染機(jī)制的實(shí)現(xiàn)流程,以及雙線程渲染技術(shù)和 WebView 在其中發(fā)揮的作用。
一、快速渲染實(shí)現(xiàn)流程
小程序的快速渲染主要經(jīng)歷以下四個(gè)階段:解析和編譯、預(yù)加載、頁(yè)面渲染和繪制與顯示。
1、解析和編譯
當(dāng)用戶打開小程序時(shí),小程序框架首先對(duì)小程序的代碼進(jìn)行解析和編譯。這一過程包括將小程序的代碼轉(zhuǎn)換成可執(zhí)行的指令,并生成對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu),如頁(yè)面樹和組件樹。解析和編譯過程需要消耗一定的時(shí)間,但在后續(xù)的頁(yè)面渲染中能夠大大提高效率。
2、預(yù)加載
在解析和編譯完成后,小程序框架進(jìn)行預(yù)加載。預(yù)加載是指在用戶進(jìn)入具體頁(yè)面之前,提前加載可能需要使用的資源,如圖片、樣式文件等。通過預(yù)加載,小程序能夠在用戶切換頁(yè)面時(shí)減少加載時(shí)間,提高渲染速度。
3、頁(yè)面渲染
當(dāng)用戶進(jìn)入具體頁(yè)面時(shí),小程序框架將頁(yè)面樹和組件樹渲染到屏幕上。渲染過程包括計(jì)算每個(gè)組件的位置和尺寸、應(yīng)用樣式和布局,并生成最終的繪制指令。
4、繪制與顯示
小程序框架將渲染得到的繪制指令交給底層的圖形系統(tǒng)進(jìn)行繪制。圖形系統(tǒng)會(huì)將指令轉(zhuǎn)換成圖像,并顯示在屏幕上。
二、雙線程技術(shù)的優(yōu)勢(shì)
在小程序的快速渲染中,雙線程技術(shù)起到了關(guān)鍵的作用。傳統(tǒng)的 web 開發(fā)中,頁(yè)面渲染和 JAVAScript 的執(zhí)行是在同一個(gè)線程中完成的,這就導(dǎo)致了渲染和 JavaScript 執(zhí)行互相影響的問題。而小程序引入了雙線程技術(shù),將渲染和邏輯分離到不同的線程中,從而提高了渲染的速度和效率。
這里說到的雙線程技術(shù)包括渲染線程和邏輯線程。
1、渲染線程
渲染線程負(fù)責(zé)頁(yè)面的渲染和繪制工作,通過解析和編譯小程序的代碼,構(gòu)建頁(yè)面樹和組件樹,并將其渲染到屏幕上。渲染線程與底層的圖形系統(tǒng)緊密配合,利用硬件加速等技術(shù)快速繪制頁(yè)面。通過將渲染任務(wù)分離到獨(dú)立的線程中,渲染線程可以專注于頁(yè)面的繪制,不受邏輯線程的影響,從而提高了渲染的效率。
界面渲染相關(guān)的任務(wù)全都在 WebView 線程里執(zhí)行,通過邏輯層代碼去控制渲染哪些界面。 一個(gè)小程序存在多個(gè)界面,所以渲染層存在多個(gè) WebView 線程。
2、邏輯線程
邏輯線程負(fù)責(zé)處理小程序的邏輯和交互。它執(zhí)行小程序的 JavaScript 代碼,處理用戶的輸入和事件,并更新頁(yè)面的狀態(tài)。邏輯線程與渲染線程通過消息機(jī)制進(jìn)行通信,當(dāng)邏輯線程有新的指令或數(shù)據(jù)更新時(shí),會(huì)將消息發(fā)送給渲染線程,觸發(fā)頁(yè)面的更新和重新渲染。通過將邏輯和渲染分離到不同的線程,邏輯線程能夠獨(dú)立執(zhí)行,不會(huì)阻塞頁(yè)面的渲染,保證了小程序的快速響應(yīng)和流暢的交互體驗(yàn)。

雙線程技術(shù)的應(yīng)用使得小程序在渲染和邏輯處理上能夠并行進(jìn)行,提高了整體的渲染效率和用戶體驗(yàn)。同時(shí),通過消息機(jī)制的通信,實(shí)現(xiàn)了渲染和邏輯的解耦,使得開發(fā)者可以更加靈活地處理和優(yōu)化小程序的渲染和邏輯代碼。
三、WebView 線程的作用
從雙線程技術(shù)我們可以看到存在 WebView 線程,但我們?cè)趯懶〕绦蝽?yè)面視圖時(shí),貌似并不關(guān)心 WebView,那 WebView 到底是個(gè)什么東西?View 視圖層小程序幫我們做了什么?

在小程序的快速渲染中,WebView 扮演了重要的角色。WebView 是一種在移動(dòng)應(yīng)用程序中嵌入網(wǎng)頁(yè)內(nèi)容的組件,它提供了一個(gè)可以顯示網(wǎng)頁(yè)內(nèi)容的容器。
1、顯示小程序頁(yè)面
小程序的頁(yè)面是通過 WebView 來顯示的。當(dāng)用戶打開小程序或切換到不同的頁(yè)面時(shí),小程序框架會(huì)將對(duì)應(yīng)的頁(yè)面渲染到 WebView 中,使用戶可以看到頁(yè)面內(nèi)容。WebView 提供了靈活的展示方式,可以支持小程序頁(yè)面的滾動(dòng)、縮放等操作。
2、解析和執(zhí)行小程序代碼
WebView 可以解析和執(zhí)行小程序的代碼,將代碼轉(zhuǎn)換成可執(zhí)行的指令。它提供了 JavaScript 執(zhí)行環(huán)境,使得小程序可以運(yùn)行和交互。通過 WebView,小程序可以實(shí)現(xiàn)動(dòng)態(tài)的頁(yè)面更新和交互效果。
3、提供網(wǎng)絡(luò)訪問功能
WebView 具有網(wǎng)絡(luò)訪問的能力,可以加載小程序中的網(wǎng)絡(luò)資源,如 html、css、JavaScript 文件、圖片等。通過網(wǎng)絡(luò)訪問,小程序可以獲取遠(yuǎn)程數(shù)據(jù),并將其展示在 WebView 中。WebView 的網(wǎng)絡(luò)訪問功能為小程序提供了與服務(wù)器交互和數(shù)據(jù)更新的能力。
4、支持小程序框架的功能
WebView 在底層實(shí)現(xiàn)了小程序框架的各種功能,如數(shù)據(jù)綁定、事件處理、組件渲染等。它能夠根據(jù)小程序的邏輯和交互規(guī)則,將頁(yè)面內(nèi)容正確地顯示給用戶。WebView 提供了與小程序框架的交互接口,使得小程序能夠與 WebView 進(jìn)行通信和交互,實(shí)現(xiàn)數(shù)據(jù)的雙向綁定、事件的監(jiān)聽和觸發(fā)等功能。

需要注意的是,由于 WebView 是一個(gè)嵌入式的組件,其性能和渲染能力也可能受到設(shè)備和瀏覽器的限制。因此,小程序框架通常會(huì)對(duì) WebView 進(jìn)行優(yōu)化,以提高渲染速度和用戶體驗(yàn)。例如,我們通過對(duì)小程序代碼進(jìn)行預(yù)編譯、增量更新和緩存機(jī)制等優(yōu)化措施,去減少 WebView 的解析和編譯時(shí)間,加快頁(yè)面的渲染速度。
小程序的快速渲染機(jī)制讓廣大的小程序開發(fā)者可以借助這些機(jī)制和技術(shù),優(yōu)化小程序的渲染性能,提供更加流暢的用戶體驗(yàn)。
除了在微信、支付寶等平臺(tái)上架我們自有開發(fā)的小程序外,「原生+小程序」的開發(fā)模式也成為移動(dòng)研發(fā)的另一選擇。小程序容器技術(shù)能夠幫助開發(fā)者讓自有的 App 具備小程序運(yùn)行能力,只需要通過集成 SDK 即能快速具備小程序能力。例如 FinClip SDK 極其輕量,支持微信小程序語法 WXML,也就是說微信小程序代碼可以直接在 FinClip中 復(fù)用,無需再二次開發(fā),體驗(yàn)與微信端保持一致。
我們一直在關(guān)注移動(dòng)應(yīng)用研發(fā)效率提升的同時(shí),用戶對(duì)于應(yīng)用的使用體驗(yàn)關(guān)注度越來越高,如何做好應(yīng)用的體驗(yàn)也值得開發(fā)者重視。






