前端性能優化之gzip

前言:

若是你是個前端開發人員,你確定知道線上環境要把js,css,圖片等壓縮,儘可能減小文件的大小,提高響應速度,特別是對移動端,這個很是重要。經常使用的前端性能優化方法有以下幾種javascript

1、減小http請求php

2、CSS Spritescss

3、使用oss及CDN加速html

四 、css,js代碼壓縮前端

5、將樣式表放在頭部,將腳本放在底部java

六   精簡JavaScript,內存的管理,堆棧的釋放node

七   避免重定向webpack

八  瀏覽器渲染頁面原理,服務端渲染nginx

九  客戶端和服務端開啓gzipweb

下面咱們來着重講一下gzip

前端壓縮的方式不少,依賴java的有ant工具,前端本身打包壓縮的有grunt,gulp,webpack,這些壓縮也很重要,基本上能壓縮50%以上,下面咱們對壓縮文件來個對比,如圖所示,這是未壓縮的

 

這是壓縮後的

高能預警!!!gzip能在壓縮的基礎上再進行壓縮50%以上!!!

gzip壓縮原理

可是不是每一個瀏覽器都支持gzip的,若是知道客戶端是否支持gzip呢,請求頭中有個Accept-Encoding來標識對壓縮的支持。客戶端http請求頭聲明瀏覽器支持的壓縮方式,服務端配置啓用壓縮,壓縮的文件類型,壓縮方式。當客戶端請求到服務端的時候,服務器解析請求頭,若是客戶端支持gzip壓縮,響應時對請求的資源進行壓縮並返回給客戶端,瀏覽器按照本身的方式解析,在http響應頭,咱們能夠看到content-encoding:gzip,這是指服務端使用了gzip的壓縮方式。

那麼怎麼看有沒有用gzip壓縮的文件呢,打開f12,查看network,點擊「use large rows」表情來查看更多信息。包含了壓縮之後的大小和源文件的大小。

奇蹟般的,主頁從187kb壓縮到了59kb。

content-encoding是gzip的話就說明返回的是gzip

還有一點 gzip不壓縮圖片,由於壓縮以後會更大- -,因此通常到是壓縮css和js

如何啓用gzip

前面說過了,啓用gzip須要客戶端和服務端的支持,若是客戶端支持gzip的解析,那麼只要服務端可以返回gzip的文件就能夠啓用gzip了,如今來講一下幾種不一樣的環境下的服務端如何配置

 

node端

var compression = require('compression')
var app = express();

//儘可能在其餘中間件前使用compression
app.use(compression());

這是基本用法,若是還要對請求進行過濾的話,還要加上

app.use(compression({filter: shouldCompress}))

function shouldCompress (req, res) {
  if (req.headers['x-no-compression']) {
    // 這裏就過濾掉了請求頭包含'x-no-compression'
    return false
  }

  return compression.filter(req, res)
}

若是用的是koa,用法和上面的差很少

const compress = require('koa-compress');
const app = module.exports = new Koa();
app.use(compress());

由於node讀取的是生成目錄中的文件,因此要先用webpack等其餘工具進行壓縮成gzip,webpack的配置以下

const CompressionWebpackPlugin = require('compression-webpack-plugin');
plugins.push(
    new CompressionWebpackPlugin({
        asset: '[path].gz[query]',// 目標文件名
        algorithm: 'gzip',// 使用gzip壓縮
        test: new RegExp(
            '\\.(js|css)$' // 壓縮 js 與 css
        ),
        threshold: 10240,// 資源文件大於10240B=10kB時會被壓縮
        minRatio: 0.8 // 最小壓縮比達到0.8時纔會被壓縮
    })
);

plugins是webpack的插件

nginx

gzip使用環境:http,server,location,if(x),通常把它定義在nginx.conf的http{…..}之間

    • gzip on
      on爲啓用,off爲關閉
    • gzip_min_length 1k
      設置容許壓縮的頁面最小字節數,頁面字節數從header頭中的Content-Length中進行獲取。默認值是0,無論頁面多大都壓縮。建議設置成大於1k的字節數,小於1k可能會越壓越大。
    • gzip_buffers 4 16k
      獲取多少內存用於緩存壓縮結果,‘4 16k’表示以16k*4爲單位得到
    • gzip_comp_level 5
      gzip壓縮比(1~9),越小壓縮效果越差,可是越大處理越慢,因此通常取中間值;
    • gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php
      對特定的MIME類型生效,其中'text/html’被系統強制啓用
    • gzip_http_version 1.1
      識別http協議的版本,早起瀏覽器可能不支持gzip自解壓,用戶會看到亂碼
    • gzip_vary on
      啓用應答頭"Vary: Accept-Encoding"
    • gzip_proxied off
      nginx作爲反向代理時啓用,off(關閉全部代理結果的數據的壓縮),expired(啓用壓縮,若是header頭中包括"Expires"頭信息),no-cache(啓用壓縮,header頭中包含"Cache-Control:no-cache"),no-store(啓用壓縮,header頭中包含"Cache-Control:no-store"),private(啓用壓縮,header頭中包含"Cache-Control:private"),no_last_modefied(啓用壓縮,header頭中不包含"Last-Modified"),no_etag(啓用壓縮,若是header頭中不包含"Etag"頭信息),auth(啓用壓縮,若是header頭中包含"Authorization"頭信息)
    • gzip_disable msie6
      (IE5.5和IE6 SP1使用msie6參數來禁止gzip壓縮 )指定哪些不須要gzip壓縮的瀏覽器(將和User-Agents進行匹配),依賴於PCRE庫

警告

gzip壓縮的出現如此的使人振奮,可是還有如下三個注意點: 
- 低版本瀏覽器:一些瀏覽器接受壓縮文件仍是有問題(他們說他們能夠可是他們並不行),若是你的站點必須在window95的網景1.0瀏覽器上,你可能不想要壓縮文件。Apache mod_deflate設置了一些忽略規則來專門爲舊瀏覽器。 
- 已經壓縮過的文件:大多數的圖片,音樂和視頻都已經壓縮過了,不要浪費時間來壓縮他們了。事實上,你能夠只壓縮那三巨頭(HTML,CSS AND JAVARSCRIPT)。 
- CPU負載:在傳輸過程當中壓縮文件耗費CPU可是節省帶寬(用空間換時間)。一般壓縮速率的選擇須要權衡利弊。也存在一些預壓縮靜態文件的方法,但這要求更多的資源。考慮了cpu的耗費,壓縮文件也是利大於弊。經過壓縮實現更好的用戶體驗,更短的留白時間,值!


開啓gzip壓縮是優化網站最快的方法之一。大膽的用吧,讓你的用戶體驗更棒。

相關文章
相關標籤/搜索