在Express上使用新一代的資料壓縮演算法 - Brotli

Brotli是Google發布的一套壓縮演算法,目前主要運用在資料傳輸壓縮,由前實習生 Anamaria Cotîrlea,在短短幾個月內做的專案,它就為 Google Play 帶來極大效益,每天能減少大約 1.5PB(即 150 萬 GB)數據量,讓用戶下載及更新應用程式變得更順暢、更節省數據傳輸量。

Brotli最初發布於2015年,用於網路字型的離線壓縮。Google軟體工程師在2015年9月發布了包含通用無失真資料壓縮的Brotli增強版本,特別側重於HTTP壓縮。其中的編碼器被部分覆寫以提高壓縮比,編碼器和解碼器都提高了速度,串流API已被改進,增加更多壓縮品質級別。新版本還展現了跨平台的效能改進,以及減少解碼所需的記憶體。

與常見的通用壓縮演算法不同,Brotli使用一個預定義的120千位元組字典。該字典包含超過13000個常用單詞、短語和其他子字串,這些來自一個文字和HTML文件的大型語料庫。預定義的演算法可以提升較小檔案的壓縮密度。

使用brotli取代deflate來對文字檔案壓縮通常可以增加20%的壓縮密度,而壓縮與解壓縮速度則大致不變。

實作實驗

以下實際測試比較

採用 node brotli

壓縮3130K的jpg檔

quality brotli time brotli size
11 20.67s 1892K
10 8.97s 1896K
9 1.79s 1914K
8 1.03s 1946K
7 0.98s 1946K
6 0.84s 1947K
5 0.68s 1951K

Express的中間插件

Brotli目前瀏覽器支援度

brotli.png

在這之前,你可能採用compression,幫你的資料傳輸做gzip壓縮,如果你想採用Brotli壓縮,你可以改用以下中間件

shrink-ray

Windows上,這個包依賴於node-gyp

shrink-ray支援以下規格

  • deflate
  • gzip
  • brotli
  • zopfli (for asynchronous compression of static assets)

shrink-ray 會幫你選擇適當的數據壓縮方式

1
2
3
4
5
6
7
var path = require('path');
var express = require('express');
var shrinkRay = require('shrink-ray')
var app = express();
app.use(shrinkRay({}))
app.use(express.static(path.join(__dirname, 'web'))); //靜態頁面
app.listen(80);

參考資料

Google開源公告

原始代碼

數據壓縮規格

瀏覽器相容性

效能比較

Brotli与zip压缩率对比

比較Brotli與各種壓縮算法比較

效能比較與Express使用