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

什么是Gzip

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

兩種使用Gzip壓縮的姿勢

一表箭、構(gòu)建時使用webpackvite生成對應(yīng)的.gz文件赁咙,瀏覽器請求xxx.js時,返回對應(yīng)的xxx.js.gz燃逻。實操方法在文章最后序目。
二、瀏覽器訪問xxx.js時伯襟,服務(wù)器對文件進(jìn)行Gzip壓縮后傳輸給瀏覽器猿涨。

前端預(yù)生成gz文件

關(guān)于第一種方法,除了前端需要預(yù)先生成.gz的壓縮文件姆怪,還需要服務(wù)端進(jìn)行一些配置叛赚,以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文件。

服務(wù)器在線Gzip壓縮

前端無需進(jìn)行配置俺附,也不用預(yù)先生成.gz文件肥卡,服務(wù)器進(jìn)行處理即可,以Nginx為例事镣,需要在nginx.conf中增加以下配置:

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    # 開啟gzip
    gzip  on;
     
    # 設(shè)置緩沖區(qū)大小
    gzip_buffers 4 16k;
     
    #壓縮級別官網(wǎng)建議是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;
        }
    }
}

更詳細(xì)的Gzip配置步鉴,可以查閱官方文檔。

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

一璃哟、前端借助構(gòu)建工具氛琢,預(yù)先生成gz文件,缺點是構(gòu)打包后構(gòu)建的產(chǎn)物體積會變大随闪,優(yōu)點是不耗費服務(wù)器的性能阳似。
二、使用nginx在線Gzip铐伴,缺點是需要實時壓縮撮奏,會耗費服務(wù)器的性能,但是無需前端預(yù)先生成gz文件当宴。

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

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

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文件青自,當(dāng)同目錄下不存在此文件的時候,會執(zhí)行在線壓縮的命令驱证。所以我們兩個配置都開啟即可

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

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

靜態(tài)加載

image.png

在線壓縮
image.png

實踐

Vite打包生成gz文件

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

首先吻育,為你的項目安裝 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命令即可布疼,構(gòu)建產(chǎn)物中就會出現(xiàn)對應(yīng)的.gz文件摊趾。

Webpack打包生成gz文件

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

首先,安裝插件:

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

接下來砾层,在vue.config.js文件進(jìn)行配置:

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的數(shù)據(jù)壓縮
                deleteOriginalAssets: false, // 是否刪除未壓縮的源文件,謹(jǐn)慎設(shè)置肛炮,如果希望提供非gzip的資源止吐,可不設(shè)置或者設(shè)置為false(比如刪除打包后的gz后還可以加載到原始資源文件)
            }),
        ],
    },
};

執(zhí)行構(gòu)建命令,即可輸出對應(yīng)的.gz文件铸董。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末祟印,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子粟害,更是在濱河造成了極大的恐慌,老刑警劉巖颤芬,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悲幅,死亡現(xiàn)場離奇詭異,居然都是意外死亡站蝠,警方通過查閱死者的電腦和手機(jī)汰具,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來菱魔,“玉大人留荔,你說我怎么就攤上這事±骄耄” “怎么了聚蝶?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長藻治。 經(jīng)常有香客問我碘勉,道長,這世上最難降的妖魔是什么桩卵? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任验靡,我火速辦了婚禮,結(jié)果婚禮上雏节,老公的妹妹穿的比我還像新娘胜嗓。我一直安慰自己,他們只是感情好钩乍,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布辞州。 她就那樣靜靜地躺著,像睡著了一般件蚕。 火紅的嫁衣襯著肌膚如雪孙技。 梳的紋絲不亂的頭發(fā)上产禾,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機(jī)與錄音牵啦,去河邊找鬼亚情。 笑死,一個胖子當(dāng)著我的面吹牛哈雏,可吹牛的內(nèi)容都是我干的楞件。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼裳瘪,長吁一口氣:“原來是場噩夢啊……” “哼土浸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起彭羹,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤黄伊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后派殷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體还最,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年毡惜,在試婚紗的時候發(fā)現(xiàn)自己被綠了拓轻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡经伙,死狀恐怖扶叉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情帕膜,我是刑警寧澤枣氧,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站泳叠,受9級特大地震影響作瞄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜危纫,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一宗挥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧种蝶,春花似錦契耿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春踢械,著一層夾襖步出監(jiān)牢的瞬間酗电,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工内列, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留撵术,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓话瞧,卻偏偏與公主長得像嫩与,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子交排,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容