1. 程式人生 > >前端效能優化,我們可以做哪些?

前端效能優化,我們可以做哪些?

1、雪碧圖技術

這個很簡單,把每個小圖示都整合到一張大圖上面,極大的減輕http請求數,同時能夠讓圖片快速載入進來。

考慮到當前的5g的發展前景,以後圖片不會造成載入延遲的現象。

2、瀏覽器渲染機制

輸入一個網址:我們得到服務端html檔案。

根據html檔案,從頭到尾的一個個的依次渲染頁面渲染頁面。

但是遇到圖片——不會等待圖片的載入完畢,會直接渲染下面的標籤。

如果圖片加載出來——根據圖片選擇,由於圖片要佔用空間,決定是否重新載入頁面,這個概念叫reflow。(優化的方式——給圖片寬高)。

reflow和什麼相關:佔位面積、定位方式、邊距。

對於樣式中的顏色變化,叫做repaint、這個就只需要把顏色改變。所以效能上來說,repaint稍微比reflow高點。

repaint和什麼相關:和顏色變化相關

3、webpack、gulp等打包工具的使用

壓縮程式碼,減少了程式碼體積。

可以把多個css檔案,多個js檔案,合併為一個css檔案/js檔案。

合併檔案,讓我們減少了http請求數。

4、避免頁面跳轉,也就是使用單頁面應用的開發。

每次頁面跳轉,就是一次html檔案的下載過程。而這個過程,我們首先從服務端下載網頁,再進行渲染,網頁效能體驗會很差。而單頁面應用,它從一開始,就把完整的網頁給載入到本地。

5、延遲載入、懶載入技術

什麼是懶載入技術:

  1. 原理:先將img標籤中的src連結設為同一張圖片(空白圖片),將其真正的圖片地址儲存再img標籤的自定義屬性中(比如data-src)。當js監聽到該圖片元素進入可視視窗時,即將自定義屬性中的地址儲存到src屬性中,達到懶載入的效果。
  2. 這樣做能防止頁面一次性向伺服器響應大量請求導致伺服器響應慢,頁面卡頓或崩潰等問題。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>懶載入技術</title>
    <style>
        li{
            width: 300px;
            height: 400px;
        }
        li img{
            width: 100%
; height: 100%; }
</style> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script> <script> window.onload = function () { var lazyLoad = (function () { var timer = 0; function init() { $(window).on('scroll',function () { timer && clearTimeout(timer); timer = setTimeout(function () { console.log('scroll') showImage(); },200) }); showImage(); } function showImage() { $('img').each(function () { var current = $(this); if(current.attr('isLoaded')) return; shouldShow(current) && showImg(current); }) } function shouldShow(node) { var scrollH = $(window).scrollTop(), winH = $(window).height(), top = node.offset().top; if(top < winH + scrollH){ return true; }else{ return false; } } function showImg(node) { node.attr('src',node.attr('data-src')); node.attr('isLoaded',true); } return { init: init } })(); lazyLoad.init(); }; </script> </head> <body> <ul> <li> <img data-src="https://img11.360buyimg.com/babel/s700x360_jfs/t17803/198/955524217/34057/c1046b73/5ab469d6Nb7738eba.jpg!q90!cc_350x180" src="https://img10.360buyimg.com/babel/s340x420_jfs/t17560/109/1280106391/43247/e6499029/5ac48cf1N6ae7ba3a.jpg!q90!cc_340x420" alt="" > </li> <li> <img data-src="https://img11.360buyimg.com/babel/s700x360_jfs/t17803/198/955524217/34057/c1046b73/5ab469d6Nb7738eba.jpg!q90!cc_350x180" src="https://img10.360buyimg.com/babel/s340x420_jfs/t17560/109/1280106391/43247/e6499029/5ac48cf1N6ae7ba3a.jpg!q90!cc_340x420" alt="" > </li> <li> <img data-src="https://img11.360buyimg.com/babel/s700x360_jfs/t17803/198/955524217/34057/c1046b73/5ab469d6Nb7738eba.jpg!q90!cc_350x180" src="https://img10.360buyimg.com/babel/s340x420_jfs/t17560/109/1280106391/43247/e6499029/5ac48cf1N6ae7ba3a.jpg!q90!cc_340x420" alt="" > </li> <li> <img data-src="https://img11.360buyimg.com/babel/s700x360_jfs/t17803/198/955524217/34057/c1046b73/5ab469d6Nb7738eba.jpg!q90!cc_350x180" src="https://img10.360buyimg.com/babel/s340x420_jfs/t17560/109/1280106391/43247/e6499029/5ac48cf1N6ae7ba3a.jpg!q90!cc_340x420" alt="" > </li> <li> <img data-src="https://img11.360buyimg.com/babel/s700x360_jfs/t17803/198/955524217/34057/c1046b73/5ab469d6Nb7738eba.jpg!q90!cc_350x180" src="https://img10.360buyimg.com/babel/s340x420_jfs/t17560/109/1280106391/43247/e6499029/5ac48cf1N6ae7ba3a.jpg!q90!cc_340x420" alt="" > </li> <li> <img data-src="https://img11.360buyimg.com/babel/s700x360_jfs/t17803/198/955524217/34057/c1046b73/5ab469d6Nb7738eba.jpg!q90!cc_350x180" src="https://img10.360buyimg.com/babel/s340x420_jfs/t17560/109/1280106391/43247/e6499029/5ac48cf1N6ae7ba3a.jpg!q90!cc_340x420" alt="" > </li> <li> <img data-src="https://img11.360buyimg.com/babel/s700x360_jfs/t17803/198/955524217/34057/c1046b73/5ab469d6Nb7738eba.jpg!q90!cc_350x180" src="https://img10.360buyimg.com/babel/s340x420_jfs/t17560/109/1280106391/43247/e6499029/5ac48cf1N6ae7ba3a.jpg!q90!cc_340x420" alt="" > </li> <li> <img data-src="https://img11.360buyimg.com/babel/s700x360_jfs/t17803/198/955524217/34057/c1046b73/5ab469d6Nb7738eba.jpg!q90!cc_350x180" src="https://img10.360buyimg.com/babel/s340x420_jfs/t17560/109/1280106391/43247/e6499029/5ac48cf1N6ae7ba3a.jpg!q90!cc_340x420" alt="" > </li> <li> <img data-src="https://img11.360buyimg.com/babel/s700x360_jfs/t17803/198/955524217/34057/c1046b73/5ab469d6Nb7738eba.jpg!q90!cc_350x180" src="https://img10.360buyimg.com/babel/s340x420_jfs/t17560/109/1280106391/43247/e6499029/5ac48cf1N6ae7ba3a.jpg!q90!cc_340x420" alt="" > </li> <li> <img data-src="https://img11.360buyimg.com/babel/s700x360_jfs/t17803/198/955524217/34057/c1046b73/5ab469d6Nb7738eba.jpg!q90!cc_350x180" src="https://img10.360buyimg.com/babel/s340x420_jfs/t17560/109/1280106391/43247/e6499029/5ac48cf1N6ae7ba3a.jpg!q90!cc_340x420" alt="" > </li> </ul> </body> </html>

6、將css放在HEAD中

如果將 CSS放在其他地方比如 BODY中,則瀏覽器有可能還未下載和解析到 CSS就已經開始渲染頁面了,這就導致頁面由無 CSS狀態跳轉到 CSS狀態,使用者體驗比較糟糕。除此之外,有些瀏覽器會在 CSS下載完成後才開始渲染頁面,如果 CSS放在靠下的位置則會導致瀏覽器將渲染時間推遲。

7、Vue專案的按需載入

主要是在載入路由的時候,使用:
const Main = r => require.ensure([], () => r(require(‘../views/main/Main’)))

require.ensure就是webpack提供的非同步載入的方式。

8、關於React的效能優化

react中,進行效能優化的核心就是shouldComponentDidMount周期函式。
下面是我寫的效能優化的部落格:
react效能優化

9、設定合理的http快取

http請求中,我們可以合理的設定headers,就能達到快取的目的。

有兩種常見的快取,強制快取和對比快取:

第一種:強制快取。
這裡寫圖片描述
直接訪問瀏覽器中的快取資料,如果存在,則直接使用瀏覽器中的資料。如果不存在,則再向伺服器傳送請求,然後得到伺服器的資料,再把這些資料存在瀏覽器中。

第二種:對比快取。
這裡寫圖片描述
首先,獲取瀏覽器中的資料快取標識,再獲取伺服器上面的資料快取標識,如果相匹配,則直接從瀏覽器中獲取資料,如果不匹配,則從伺服器上獲取資料。

關於快取標識,有兩類標識:

第一類:
第一次請求,伺服器會返回一個Last-Modified。
下一次請求,瀏覽器會自動在headers中新增一條If-Modified-Since屬性,記錄的就是上一次資料發生修改的時間。

第二類:
第一次請求,服務端返回一個Etag資源唯一識別符號。
第二次請求,瀏覽器會自動攜帶一個If-None_Match識別符號。

應用程式快取

建立cache manifest檔案,通過給html檔案中的HTML標籤新增一個manifest屬性來實現的。

<!DOCTYPE HTML>
<html manifest="demo.appcache">

<body>
文件內容......
</body>

</html>