移動性能優化

移動頁面,包括pc頁面,優化主要包括兩個方面:javascript

  加載php

   運行css

優化在移動端顯得尤其重要,主要在於移動端網絡不給力,一般狀況下,cpu也比較低html

下面分別說這兩個大方向html5

先說加載,加載的優化又包括兩個java

    減小加載的數量ios

    少每一個加載內容都大小css3

減小加載的數量:也就是咱們常說的減小請求數量 web

    按需加載ajax

      好處是減小首屏時間,固然大量後加載當東西也會引發大量頁面重繪,影響渲染性能

      (lazylod, 滾屏加載, Media Query)

    預加載

      

    1 減小重定向

      不少網站會根據http的user-agent判斷是否移動設備,而後發空body和重定向301/302等,直接返回移動端頁面更好。

      最好是直接返回移動的頁面,固然,有時候和pc頁面在不一樣服務器上,有的網站重定向請求時候加上cookie來告訴應用是移動設備

    2 減小圖片請求

      使用css3代替圖片(圓形,圓角,下拉三角等等)

      合併小圖片等

    3 避免圖片的src屬性爲空,這樣會從新加載固然頁面,影響速度和效率(能夠直接不設置)

             "img src=''引起的問題"

      這樣的語句,會致使當前網頁被從新載入一次。尤爲是對於 php/ asp/ aspx 類型的後臺腳本,會致使程序被連續執行兩次

      若是該訪問該網頁的URL 還帶有參數,那麼第一次調用有參數,第二次調用沒有參數。

      在img 對象的src 屬性是空字符串("")的時候,瀏覽器認爲這是一個缺省值,值的內容爲當前網頁的路徑。瀏覽器會用當前路徑進行再一次載入,並把其內容做爲圖像的二進制內容並試圖顯示。

      src=""在不一樣瀏覽器解析不一樣,有的會從新請求當前頁面(一個新的請求,不帶ETAG等緩存),有可能使用session失效。有的則會解釋成"/",就去訪問默認頁面,而默認頁面有在有驗證服務器上不少時候設成login頁面而且清空session.

    4 緩存ajax的數據

    5 通用css和js能夠放在外聯文件,供多個頁面重用。 

    用HTML5緩存(cache manifest and client-side databases)來替代傳統緩存,還有新客戶端數據庫技術indexedDB

       關於manifest 關於manifest

      manifest版本更新問題

        更新manifest文件   經過javascript操做   清除瀏覽器緩存

        給manifest添加或刪除文件,均可更新緩存,

        若是咱們更改了js,而沒有新增或刪除,前面例子中註釋中的版本號,能夠很好的用來更新manifest文件。

        html5中引入了js操做離線緩存的方法,下面的js能夠手動更新本地緩存。

            window.applicationCache.update();

        若是用戶清除了瀏覽器緩存(手動或用其餘一些工具)都會從新下載文件。

      manifest緩存了頁面自己

         一旦頁面指定了manifest,那麼這個頁面就必定被儲存下來。若是有一個動態頁面,沒有辦法只緩存頁面所引用的css,js,img,不緩存頁面的內容

        第一次訪問page.html?id=1,緩存成功後。再訪問 page.html?id=2,不會去讀緩存,這是由於因爲參數變了,被認爲地址不同,不算是第二次請求,因此請求page.html?id=2時依然會從新加載manifest指定的文件。不過若是不是參數而是hash,#id=2,則認爲是同一個頁面

        manifest極不適合含有動態參數頁面跳轉的狀況下使用

    

    7 使用HTML5服務端發送事件

 

      Web應用已經使用了各類從服務器上輪詢資源的方法來持續地更新頁面。HTML5的EventSource對象和Server-Sent事件能經過 瀏覽器端的JavaScript代碼打開一個服務端鏈接客戶端的單向通道。服務端可使用這個寫通道來發送數據,這樣能節省了HTTP建立多個輪詢請求的 消耗。這種方式比HTML的WebSocket更高效。WebSocket的使用場景是,當有許多客戶端和服務端的交互的時候(好比消息或者遊戲),在全 雙工鏈接上創建一個雙向通道。

 

      若是你的網站當前是使用其餘的Ajax或者Comet技術來輪詢的,轉變成Server-Sent 事件須要重構網站的Javascript代碼。

 

    WebSokects(目前只有iOS4.2+支持 )websockects

      

減小加載內容大小

  1 壓縮, 服務器開啓gzip壓縮

  2 值爲0的時候不須要寫單位

  3 localstorage代替cookie,能夠減小每次請求時發送的額外cookie。對於json形式的字符串, JSON.stringify() and JSON.parse() 來輔助存儲

    4 圖片優化

    1) 使用智圖優化圖片,服務器能夠直接圖片優化

    2)合適的格式 (1. webP優於JPG 2. PNG8優於GIF)

    3) srcsetsrcset響應式圖片

再看運行

減小重排重繪

  1 border未none,不寫0,

    border:0; 瀏覽器對border-width/border-color進行了渲染,佔用了內存。

    border:none瀏覽器解析「none」時將不做出渲染動做,即不會消耗內存。

  2 移除空css規則

    增長css文件大小,影響css樹  

  3 正確使用display

    display影響頁面渲染 可參考csslint

      display:inline後不該該再使用width、height、margin、padding以及float

      display:inline-block後不該該再使用float

      display:block後不該該再使用vertical-align

      display:table-*後不該該再使用margin或者float

  4 避免屢次重設圖片大小

    感受實際工做中改動圖片大小不可避免,只能是減小沒必要要的改動,減小重繪

  5 減小dom節點

    dom節點多,尤爲又有深度,會影響頁面渲染,儘可能減小

減小性能開銷

  1 儘可能使用事件代理,避免批量綁定事件 

    以前是delegate實現, 如今用on實現,zepto爲on; 也能夠本身寫事件代理

// jQuery 1.4.3+
$( elements ).delegate( selector, events, data, handler );
// jQuery 1.7+
$( elements ).on( events, [selector], data, handler );
$(
"table").delegate("td","click",function(){...}); $("table").on("td", "p", function(){...});

  2 DataURL的使用,注意使用場景

<img src="data:image/jpg;base64,/9j/4AAQSkZJRgABAQEBLAEsAAD/4QLQRXhpZgAASUkqAEoCAAAs/>
//利用base64編碼把圖片數據翻譯成標準ASCII字符。
//Data URL是在本地直接繪製圖片,節省HTTP鏈接,  
//Base64編碼的圖片會比二進制格式的圖片體積大1/3,同時又沒有使用圖片的壓縮算法,文件會變大,而且要解碼後再渲染,會加劇客戶端的CPU和內存負擔
//Data URL形式的圖片不會被瀏覽器緩存
 

  適用於小圖片。這樣避免發送一次請求,只爲了得到比較少的數據

  另外,這個若是是css背景中使用,也是能夠緩存的。直接緩存在css文件中 

  在線轉換工具

.striped_box
  {
  width: 100px;
  height: 100px;
  background-image: url("data:image/gif;base64,R0lGODlhAwADAIAAAP///8zMzCH5BAAAAAAALAAAAAADAAMAAAIEBHIJBQA7");
  border: 1px solid gray;
  padding: 10px;
  }
<div class="striped_box">
這是一個有條紋的方塊
</div>

 

  3 GPU加速

    瀏覽器利用顯卡的計算能力,實現提速和釋放CPU

    css中如下屬性會觸發GPU渲染,合理使用,由於過多使用引起耗電量增長

      CSS3 transitions、CSS3 3D transforms、Opacity、Canvas、WebGL、Video  

  4 高頻事件優化

    touchmove 和 scroll致使屢次渲染

    增長響應變化等時間間隔,減小重繪次數

    使用requestAnimationFrame監聽幀變化,在正確的時間渲染 (這個替代了setTimeout方法)

  5 動畫優化

    儘可能使用css3,適當食用canvas(ios8能夠食用webGL,這個是什麼怎麼用,之後有時間再研究下)

    css3動畫只用-webkit和無前綴兩種

    -webkit, -moz, -ms

    有一些瀏覽器動畫事件可使用了,兼容性待定

    webkitAnimationEnd事件與webkitTransitionEndwebkitAnimationEnd事件與webkitTransitionEnd

  6 避免高級選擇符

    耗時長且不易讀懂

  7 webworker

    Android 2.0+,ios5+

    Web Workers不能進入到頁面的DOM,也不能改變頁面上的任何東西。

    Web Worker很適合大量計算的工做,基本沒用到

    8  服務端經過檢測請求中的User-Agent頭或者其餘的嵌入到請求中的信息能讓你的應用檢測到網絡情況 ? how?

  9 viewport屬性,(以前看過一篇棒棒嗒文章,下次有空分享出來)

相關文章
相關標籤/搜索