前端優(yōu)化:Gzip壓縮,附解決方案

什么是Gzip

Gzip是一種文件級別的數據壓縮算法,用來減少文件大小,節(jié)省帶寬從而提高網站的訪問速度。它可以有效減少網絡傳輸時間,這在大多數網站上可以大大提升用戶體驗,例如網站會更快地加載。Gzip是一種很好的優(yōu)化技術。

兩種使用Gzip壓縮的姿勢

一、構建時使用webpackvite生成對應的.gz文件,瀏覽器請求xxx.js時,返回對應的xxx.js.gz。實操方法在文章最后。
二、瀏覽器訪問xxx.js時,服務器對文件進行Gzip壓縮后傳輸給瀏覽器。

前端預生成gz文件

關于第一種方法,除了前端需要預先生成.gz的壓縮文件,還需要服務端進行一些配置,以Nginx為例,需要在nginx.conf中增加以下配置:

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    gzip_static on;
    server {
        listen       8462;
        server_name  localhost;
        location / {
            root   dist;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

gzip_static on; 開啟這個屬性就是靜態(tài)加載本地的gz文件。

服務器在線Gzip壓縮

前端無需進行配置,也不用預先生成.gz文件,服務器進行處理即可,以Nginx為例,需要在nginx.conf中增加以下配置:

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    # 開啟gzip
    gzip  on;
     
    # 設置緩沖區(qū)大小
    gzip_buffers 4 16k;
     
    #壓縮級別官網建議是6
    gzip_comp_level 6;
  
    #壓縮的類型
    gzip_types text/plain application/javascript text/css application/xml text/javascript application/x-httpd-php;
    server {
        listen       8462;
        server_name  localhost;
        location / {
            root   dist;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

更詳細的Gzip配置,可以查閱官方文檔。

兩種方案優(yōu)缺點

一、前端借助構建工具,預先生成gz文件,缺點是構打包后構建的產物體積會變大,優(yōu)點是不耗費服務器的性能。
二、使用nginx在線Gzip,缺點是需要實時壓縮,會耗費服務器的性能,但是無需前端預先生成gz文件。

如何使用、區(qū)分兩種方式

那么問題來了,如果想在有gz文件的時候進行靜態(tài)壓縮,不存在gz文件的時候進行在線壓縮而不是加載源文件,要如何做呢?
答案就是兩種配置都打開:

gzip on;
gzip_static on;
gzip_comp_level 2;
gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;  

gzip_static的優(yōu)先級高,會先加載靜態(tài)gz文件,當同目錄下不存在此文件的時候,會執(zhí)行在線壓縮的命令。所以我們兩個配置都開啟即可

那么都開啟的情況下,我們怎么區(qū)分使用了靜態(tài)加載還是在線壓縮呢?

響應頭的Content-Edcoding:gzip表示Gzip壓縮已經生效,而Etag中只有簡單字符表示靜態(tài)資源加載,而前面帶 W/ 表示啟動了在線壓縮。

靜態(tài)加載

image.png

在線壓縮
image.png

實踐

Vite打包生成gz文件

在Vite中使用vite-plugin-compression這個插件可以讓你的Vite應用程序在發(fā)布前自動壓縮 JavaScript 和 CSS 文件,大大減少文件大小,從而提高應用程序的性能。

首先,為你的項目安裝 vite-plugin-compression

npm install --save-dev vite-plugin-compression

接下來,在 vite.config.js 中添加以下代碼:

import { defineConfig } from 'vite'
import viteCompression from 'vite-plugin-compression'

export default defineConfig({
  plugins: [viteCompression()]
})

最后,只需要在命令行中運行vite build命令即可,構建產物中就會出現對應的.gz文件。

Webpack打包生成gz文件

Webpack使用的插件叫做compression-webpack-plugin。

首先,安裝插件:

npm install compression-webpack-plugin --save-dev

接下來,在vue.config.js文件進行配置:

const CompressionPlugin = require('compression-webpack-plugin');
module.exports = {
        plugins: [
            new CompressionPlugin({
                algorithm: 'gzip', // 使用gzip壓縮
                test: /\.js$|\.html$|\.css$/, // 匹配文件名
                filename: '[path].gz[query]', // 壓縮后的文件名(保持原文件名,后綴加.gz)
                minRatio: 1, // 壓縮率小于1才會壓縮
                threshold: 10240, // 對超過10k的數據壓縮
                deleteOriginalAssets: false, // 是否刪除未壓縮的源文件,謹慎設置,如果希望提供非gzip的資源,可不設置或者設置為false(比如刪除打包后的gz后還可以加載到原始資源文件)
            }),
        ],
    },
};

執(zhí)行構建命令,即可輸出對應的.gz文件。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容