搜尋
首頁web前端js教程如何能做到高效能行動端開發

如何能做到高效能行動端開發

Nov 18, 2017 am 10:53 AM
開發移動高效能

眾所周知,行動端不僅應該被快速加載,光有內容沒有用戶體驗也是不可以的,同時還應該流暢運行,比如快速響應的交互,如絲般順滑的動畫……

在實際開發中如何做到上面所說的效果呢?

1. 確認渲染效能的分析標準

2. 準備尺去衡量渲染效能標準

3. 對耗時多的地方進行最佳化

我們可以粗略的得到下面的最佳化目標

如何能做到高效能行動端開發


#第一個是首屏呈現時間,網路上的資料已經非常非常多了,壓縮代碼,使用webp圖片,使用sprite,按需加載,“直出”,CDN……

第二個是16ms 優化,本篇重點講16ms的優化。


一.瀏覽器渲染 原理介紹

#大多數裝置的更新頻率是60次/秒,(1000/60 = 16.6ms)也就說是瀏覽器對每一幀畫面的渲染工作要在16ms內完成,超出這個時間,頁面的渲染就會出現卡頓現象,影響使用者體驗。

這就是上圖的

如何能做到高效能行動端開發

如果改變屬性在上面圖中越往左,那麼影響就越大,效率就越低。

瀏覽器渲染的流程如下:

取得DOM 並將其分割為多個層(RenderLayer)

#將每個層柵格化,並獨立的繪製進位圖中

將這些點陣圖作為紋理上傳至GPU

複合多個圖層來產生最終的螢幕影像(終極layer)。

從上面圖可以看出,如果只是改變composite(渲染層合併),那效率就會大大提升。

下面粗略地列出要改變哪些樣式會分別改變渲染過程的哪一模組。

如何能做到高效能行動端開發

從上圖可以看到 transform,opacity 只會改變composite(渲染層合併),為什麼呢?因為開啟了GPU加速。

開啟GPU 加速

字面上的解釋: 紋理能夠以很低的代價映射到不同的位置,而且還能夠以很低的代價透過把它們應用到一個非常簡單的矩形網格中進行變形。

【字面上的理解非常地繞口,還是老道理,能用圖講清的道理不要用文字。 】

小tips:先選取timeline的某一幀,然後選擇下面的layer標籤tab,可以左右拖曳該模組出現3d

我們可以看到頁面上由如下層組成:

如何能做到高效能行動端開發

雖然我們最終在瀏覽器上看到的只是一個影印版,也就是最終只有一個層。類似於PhotoShop軟體中的「圖層」概念,最後合併所有可視圖層,輸出一張圖片到螢幕上

但是實際上一個頁面會因為有些規則被分成對應的層,一旦被獨立出來之後,便不會再影響其他dom的佈局,因為它改變之後,只是「貼上」了頁面。

目前下面這些因素都會造成Chrome建立層:

3D 或透視轉換(perspective transform) CSS 屬性

使用加速影片解碼的

擁有3D (WebGL) 上下文或加速的2D 上下文的 元素

混合插件(如Flash)

對自己的opacity 做CSS 動畫或使用一個動畫webkit 變換的元素

擁有加速CSS 過濾器的元素

元素有一個包含複合層的後代節點(換句話說,就是一個元素擁有一個子元素,該子元素在自己的層裡)

元素有一個z-index 較低且包含一個複合層的兄弟元素(換句話說就是該元素在複合層上面渲染)

在webkit核心的瀏覽器中,如果有上述情況,則會建立一個獨立的layer。

要注意的是,不要建立過多的渲染層,這意味著新的記憶體分配和更複雜的層管理。不要濫用GPU加速,注意看 composite layouts 是否超出了 16ms

如何能做到高效能行動端開發

說了這麼多瀏覽器渲染的原理,如果沒有尺測量也毫無用處。那麼,下面就選尺去測量:Google開發工具的Timeline。


二. Google開發工具Timeline 的常用功能


1. 點擊左上角的錄製之後,錄製結束之後會產生下面的樣子,紅色區域內就是幀了,移動上去可以看到每一幀的頻率,如果>60fps,就是比較流暢,如果。

如何能做到高效能行動端開發


2. 在timeline下面,可以看到各個模組的耗時,可以定位到耗時較大的函數上面,對該函數進行最佳化。

如何能做到高效能行動端開發


3. 依照下面步驟選擇,即可看到獨立的層,高亮重繪的區域,方便找出不必要重繪的區域,進行最佳化

如何能做到高效能行動端開發

選擇之後,目前頁面會出現下面2中顏色邊框

黃色邊框:有動畫3d變換的元素,表示放到了一個新的複合層(composited layer)中渲染

藍色的柵格:這些分塊可以看作是比層更低一級的單位,Chrome以這些分塊為單位,一次上傳一個分塊的內容到GPU。

工具也有了,瀏覽器渲染的原理也知道了,接下來是結合實際專案進行最佳化.


三. 在實際專案中進行16.6ms 最佳化

結合上面的渲染流程圖,我們可以針對性的分析並優化下面的一些步驟

優化JavaScript的執行效率

#降低樣式計算的範圍和複雜度

避免大規模、複雜的佈局

簡化繪製的複雜度、減少繪製區域

優先使用渲染層合併屬性、控制層數量

對使用者輸入事件的處理函數去抖動(行動裝置)


#1. 讀寫分離,大量操作 

JavaScript腳本運行的時候,它能取得的元素樣式屬性值都是上一格畫面的,都是舊的值。

因此,如果你在目前幀取得屬性之前又對元素節點有改動,那就會導致瀏覽器必須先套用屬性修改,結果執行佈局過程,最後再執行JavaScript邏輯。

// 先写后读,触发强制布局
function logBoxHeight() {
    // 更新box样式
    box.classList.add('super-big');
 
    // 为了返回box的offersetHeight值
    // 浏览器必须先应用属性修改,接着执行布局过程
    console.log(box.offsetHeight);
}

優化之後:

// 先读后写,避免强制布局
function logBoxHeight() {
    // 获取box.offsetHeight
    console.log(box.offsetHeight);
 
    // 更新box样式
    box.classList.add('super-big');
}


2. 閉包快取計算結果  (需要頻繁的調用,計算的函數)

getMaxWidth: (function () {
            var cache = {};
            function getwidth() {
                if (maxWidth in cache) {
                    return cache[maxWidth];
                }
                var target = this.node,
                 width = this.width,
                  screen = document.body.clientWidth,
                   num = target.length,
                  maxWidth = num * width + 10 * num + 20 - screen;
                cache[maxWidth] = maxWidth;
                 return maxWidth;
             }
             return getwidth;
})(),

改成這種方式後,直接蹭蹭~ 減少了10多ms


#3. 對使用者輸入事件的處理函數去抖動

如果被觸摸的元素綁定了輸入事件處理函數,例如touchstart/touchmove/touchend,那麼渲染層合併線程必須等待這些被綁定的處理函數執行完畢才能執行,也就是使用者的滾動頁面操作被阻塞了,表現出的行為就是滾動出現延遲或卡頓。

簡而言之就是你必須確保使用者輸入事件綁定的任何處理函數都能夠快速的執行完畢,以便騰出時間來讓渲染層合併線程完成他的工作。

輸入事件處理函數,例如scroll/touch事件的處理,都會在requestAnimationFrame之前被呼叫執行。因此,如果你在上述輸入事件的處理函數中做了修改樣式屬性的操作,那麼這些操作就會被瀏覽器暫存起來。

然後在呼叫requestAnimationFrame的時候,如果你在一開始就做了讀取樣式屬性的操作,那麼將會觸發瀏覽器的強制同步佈局操作(即在javascript階段中執行佈局),這樣會導致多次佈局,效率低。

優化如下:

window.requestAnimationFrame(function () {
    context.animateTo(nowPos);  //需要更新位置的交给RAF
});


4. 減少不必要的重繪

#續上面,開啟paint flashing 之後,可以看到瀏覽器重新繪製了哪些區域。發現有些不必要重繪的區域也重繪了~給這些開啟GPU優化(上文中提到)

#直接看timeline 效果,全綠了~懸著的心終於放下了

如何能做到高效能行動端開發

如何能做到高效能行動端開發

行動端開發的小技巧很多,今天先帶給大家這個高效能開發的技巧,更多知識請繼續關注我們網站PHP.cn

相關閱讀:

行動端開發之處理手機裝置的橫直螢幕

行動端開發必備知識( 轉載)_html/css_WEB-ITnose

#行動端開發的一些技巧_html/css_WEB-ITnose

以上是如何能做到高效能行動端開發的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
JavaScript引擎:比較實施JavaScript引擎:比較實施Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

超越瀏覽器:現實世界中的JavaScript超越瀏覽器:現實世界中的JavaScriptApr 12, 2025 am 12:06 AM

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

使用Next.js(後端集成)構建多租戶SaaS應用程序使用Next.js(後端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:23 AM

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

如何使用Next.js(前端集成)構建多租戶SaaS應用程序如何使用Next.js(前端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:22 AM

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript:探索網絡語言的多功能性JavaScript:探索網絡語言的多功能性Apr 11, 2025 am 12:01 AM

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的演變:當前的趨勢和未來前景JavaScript的演變:當前的趨勢和未來前景Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

神秘的JavaScript:它的作用以及為什麼重要神秘的JavaScript:它的作用以及為什麼重要Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python還是JavaScript更好?Python還是JavaScript更好?Apr 06, 2025 am 12:14 AM

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),