brotli を使用してネットワーク ペイロードを最小化、圧縮する

Michael DiBlasio
Michael DiBlasio

この Codelab は、ネットワーク ペイロードを最小化して圧縮する Codelab で、圧縮の基本概念を理解していることを前提としています。として この Codelab では、gzip などの他の圧縮アルゴリズムと比較して、 Brotli 圧縮は、圧縮率をさらに下げ、アプリの全体的な 指定します。

アプリのスクリーンショット

測定

最適化の追加に入る前に、まず分析を行ってから、 現在の状態を把握できます。

  1. [Remix to Edit] をクリックして、プロジェクトを編集可能にします。
  2. サイトをプレビューするには、[アプリを表示] を押します。[ 全画面表示 全画面表示

前述のネットワーク ペイロードを最小化して圧縮する Codelab main.js のサイズを 225 KB から 61.6 KB に縮小しました。この Codelab では、 では、Brotli の圧縮によってこのバンドルサイズをさらに小さくする方法を説明します。

Brotli 圧縮

Brotli は、より優れたテキスト圧縮を実現する新しい圧縮アルゴリズムです。 「gzip」よりによると CertSimple で、Brotli のパフォーマンスは次のようになります。

  • JavaScript の場合、gzip よりも 14% 小さくなります
  • HTML の場合、gzip よりも 21% 小さくなります
  • CSS の gzip より 17% 小さい

Brotli を使用するには、サーバーが HTTPS に対応している必要があります。Brotli のサポート言語は ほとんどのブラウザの最新バージョン。ブラウザ Brotli をサポートする場合は、Accept-Encoding ヘッダーに br が含まれます。

Accept-Encoding: gzip, deflate, br

使用する圧縮アルゴリズムは、Content-Encoding で指定できます。 フィールド(Command+Option+I または Ctrl+Alt+I):

ネットワーク パネル

Brotli の有効化

動的圧縮

動的圧縮では、アセットを取得したときにその場で圧縮します。 ブラウザによってリクエストされます。

長所

  • アセットの圧縮バージョンの作成と更新は、 できます。
  • オンザフライでの圧縮は、次のようなウェブページで特に効果的です。 動的に生成されます。

短所

  • ファイルを高いレベルで圧縮して圧縮率を高めるには、 長くなりますアセットがアップロードされるまで待っていると、パフォーマンスが低下する可能性があります。 サーバーに送信される前に圧縮されます。

Node/Express による動的圧縮

server.js ファイルは、ホストするノードサーバーを設定します。 確認します。

var express = require('express');

var app = express();

app.use(express.static('public'));

var listener = app.listen(process.env.PORT, function() {
  console.log('Your app is listening on port ' + listener.address().port);
});

現在、これは express をインポートして express.static を使用するだけです。 ミドルウェアを使用して、すべての静的 HTML、JS、CSS ファイルを public/directory(これらのファイルはビルドのたびに webpack によって作成されます)。

すべてのアセットが brotli を使用して圧縮され、 shrink-ray が返されます。 使用できます。まず、これを devDependency として package.json に追加します。

"devDependencies": {
  //...
  "shrink-ray": "^0.1.3"
},

これをサーバー ファイル server.js にインポートします。

var express = require('express');
var shrinkRay = require('shrink-ray');

express.static がマウントされる前に、これをミドルウェアとして追加します。

//...
var app = express();

// compress all requests
app.use(shrinkRay());

app.use(express.static('public'));

アプリを再読み込みして、[Network] パネルでバンドルサイズを確認します。

動的 Brotli 圧縮によるバンドルサイズ

brotliContent-Encoding ヘッダーの bz から適用されていることがわかります。 main.bundle.js225 KB から 53.1 KB に縮小されました。約 14% 小さい gzip(61.6 KB)との比較です。

静的圧縮

静的圧縮の背後にある考え方は、事前にアセットを圧縮して保存しておくことです。 できます。

長所

  • 高い圧縮レベルによるレイテンシは、もはや問題になりません。なし ファイルを圧縮して ファイルを取得できるため 直接渡されます。

短所

  • アセットはビルドのたびに圧縮する必要があります。ビルド時間が長くなる可能性がある パフォーマンスが大幅に低下します

Node/Express と webpack による静的圧縮

静的圧縮では事前にファイルを圧縮するため、webpack は ビルドステップの一環としてアセットを圧縮するように変更することもできます。「 これには brotli-webpack-plugin を使用できます。

まず、これを devDependency として package.json に追加します。

"devDependencies": {
  //...
 "brotli-webpack-plugin": "^1.1.0"
},

他の Webpack プラグインと同様に、構成ファイルにインポートし、 webpack.config.js:

var path = require("path");

//...
var BrotliPlugin = require('brotli-webpack-plugin');

これを plugins 配列内に含めます。

module.exports = {
  // ...
  plugins: [
    // ...
    new BrotliPlugin({
      asset: '[file].br',
      test: /\.(js)$/
    })
  ]
},

プラグインの配列は次の引数を使用します。

  • asset: ターゲット アセット名。
  • [file] は元のアセット ファイル名に置き換えられます。
  • test: この正規表現に一致するすべてのアセット(つまり、末尾が .js など)が処理されます。

たとえば、main.jsmain.js.br に変更されます。

アプリを再読み込みして再ビルドすると、メインバンドルの圧縮バージョンが 作成されます。Glitch コンソールを開いて、最終版の内容を見てみましょう Node サーバーによって提供される public/ ディレクトリ。

  1. [ツール] ボタンをクリックします。
  2. [Console] ボタンをクリックします。
  3. コンソールで、次のコマンドを実行して public に変更します。 そのディレクトリにあるすべてのファイルを表示します。
cd public
ls -lh
静的な Brotli 圧縮を使用したバンドルサイズ

brotli 圧縮バージョンのバンドル main.bundle.js.br が保存されました サイズが約 76% 小さく(53 KB に対し 225 KB) main.bundle.js

次に、brotli で圧縮されたファイルがダウンロードされるたびに リクエストされています。これを行うには、Terraform で ファイルが express.static で提供される前に、server.js にルーティングされます。

var express = require('express');

var app = express();

app.get('*.js', (req, res, next) => {
  req.url = req.url + '.br';
  res.set('Content-Encoding', 'br');
  res.set('Content-Type', 'application/javascript; charset=UTF-8');
  next();
});

app.use(express.static('public'));

app.get は、次のリクエストの GET リクエストへの応答方法をサーバーに指示します。 アクセスします。次に、コールバック関数を使用して、この呼び出しをどのように処理するかを定義します。 リクエストできます。ルートは次のようになります。

  • 最初の引数として '*.js' を指定すると、 JS ファイルを取得するために起動されます
  • コールバック内で、.br がリクエストの URL にアタッチされ、 Content-Encoding レスポンス ヘッダーが br に設定されます。
  • Content-Type ヘッダーは application/javascript; charset=UTF-8 に設定されます。 MIME タイプを指定します。
  • 最後に、next() は、コールバックが行われるかもしれないすべてのコールバックに対してシーケンスが続行することを保証します。 決定します

一部のブラウザでは brotli 圧縮がサポートされていないため、brotli が brotli で圧縮されたファイルを返す前に、terraform apply の Accept-Encoding リクエスト ヘッダーに br が含まれています。

var express = require('express');

var app = express();

app.get('*.js', (req, res, next) => {
  if (req.header('Accept-Encoding').includes('br')) {
    req.url = req.url + '.br';
    console.log(req.header('Accept-Encoding'));
    res.set('Content-Encoding', 'br');
    res.set('Content-Type', 'application/javascript; charset=UTF-8');
  }
  next();
});

app.use(express.static('public'));

アプリが再読み込みされたら、[Network] パネルをもう一度確認します。

バンドル サイズ: 53.1 KB(225 KB から)

完了しました。Brotli 圧縮を使用してアセットをさらに圧縮しました。

まとめ

この Codelab では、brotli を使用してアプリ全体の 指定します。サポートされている場合、brotligzip