Dieses Codelab ist eine Erweiterung des Codelabs zum Minifizieren und Komprimieren von Netzwerknutzlasten. Es wird davon ausgegangen, dass Sie mit den grundlegenden Komprimierungskonzepten vertraut sind. In diesem Codelab erfahren Sie, wie sich mit der Brotli-Komprimierung (br
) im Vergleich zu anderen Komprimierungsalgorithmen wie gzip
die Komprimierungsraten und die Gesamtgröße Ihrer App weiter reduzieren lassen.
Messen
Bevor Sie mit der Optimierung beginnen, sollten Sie den aktuellen Zustand der Anwendung analysieren.
- Klicke auf Remix zum Bearbeiten, um das Projekt bearbeitbar zu machen.
- Wenn Sie sich eine Vorschau der Website ansehen möchten, drücken Sie App ansehen und dann Vollbild .
Im vorherigen Codelab zum Minimieren und Komprimieren von Netzwerknutzlasten haben wir die Größe von main.js
von 225 KB auf 61,6 KB reduziert. In diesem Codelab erfahren Sie, wie Sie diese Bundle-Größe mit der Brotli-Komprimierung noch weiter reduzieren können.
Brotli-Komprimierung
Brotli ist ein neuerer Komprimierungsalgorithmus, der noch bessere Ergebnisse bei der Textkomprimierung als gzip
liefern kann. Laut CertSimple ist die Leistung von Brotli:
- 14 % kleiner als
gzip
für JavaScript - 21% kleiner als
gzip
für HTML - 17 % kleiner als
gzip
für Preisvergleichsportale
Damit Brotli verwendet werden kann, muss Ihr Server HTTPS unterstützen. Brotli wird in allen modernen Browsern unterstützt. Browser, die Brotli unterstützen, enthalten br
in Accept-Encoding
-Headern:
Accept-Encoding: gzip, deflate, br
Auf dem Tab „Netzwerk“ der Chrome-Entwicklertools (Command+Option+I
oder Ctrl+Alt+I
) können Sie im Feld Content-Encoding
festlegen, welcher Komprimierungsalgorithmus verwendet wird:
Brotli aktivieren
Wie Sie einen Webserver zum Senden von Brotli-codierten Ressourcen einrichten, hängt davon ab, wie Sie sie codieren möchten. Sie haben die Möglichkeit, Ressourcen bei der Anfrage dynamisch mit Brotli zu komprimieren (dynamisch) oder sie im Voraus zu codieren, damit sie bereits komprimiert sind, wenn der Nutzer sie anfordert (statisch).
Dynamische Komprimierung
Bei der dynamischen Komprimierung werden Assets direkt komprimiert, wenn sie vom Browser angefordert werden.
Vorteile
- Es ist nicht erforderlich, gespeicherte komprimierte Versionen von Assets zu erstellen und zu aktualisieren.
- Die On-the-fly-Komprimierung eignet sich besonders gut für Webseiten, die dynamisch generiert werden.
Nachteile
- Das Komprimieren von Dateien auf höheren Ebenen für bessere Komprimierungsverhältnisse dauert länger. Das kann zu Leistungseinbußen führen, da der Nutzer warten muss, bis die Assets komprimiert wurden, bevor sie vom Server gesendet werden.
Dynamische Komprimierung mit Node und Express
Die Datei server.js
ist für die Einrichtung des Node-Servers verantwortlich, auf dem die Anwendung gehostet wird.
const express = require('express');
const app = express();
app.use(express.static('public'));
const listener = app.listen(process.env.PORT, function() {
console.log(`Your app is listening on port ${listener.address().port}`);
});
Importieren Sie einfach express
und verwenden Sie die Middleware express.static
, um alle statischen HTML-, JS- und CSS-Dateien in public/directory
zu laden. Diese Dateien werden mit jedem Build von Webpack erstellt.
Damit alle Assets bei jeder Anfrage mit Brotli komprimiert werden, kann das shrink-ray
-Modul verwendet werden. Fügen Sie es zuerst als devDependency
in package.json
hinzu:
"devDependencies": {
// ...
"shrink-ray": "^0.1.3"
},
Importieren Sie es in die Serverdatei server.js
:
const express = require('express');
const shrinkRay = require('shrink-ray');
Fügen Sie es als Middleware hinzu, bevor express.static
bereitgestellt wird:
// ...
const app = express();
// Compress all requests
app.use(shrinkRay());
app.use(express.static('public'));
Laden Sie die App jetzt neu und sehen Sie sich die Bundle-Größe im Bereich „Netzwerk“ an:
In der Kopfzeile von Content-Encoding
sehen Sie jetzt, dass brotli
von bz
angewendet wird.
main.bundle.js
wurde von 225 KB auf 53,1 KB reduziert! Dieser Wert ist im Vergleich zu gzip
(61,6 KB) etwa 14% kleiner.
Statische Komprimierung
Bei der statischen Komprimierung werden Assets vorab komprimiert und gespeichert.
Vorteile
- Latenzen aufgrund hoher Komprimierungsstufen sind kein Problem mehr. Dateien müssen nicht spontan komprimiert werden, da sie jetzt direkt abgerufen werden können.
Nachteile
- Assets müssen bei jedem Build komprimiert werden. Die Build-Zeiten können sich erheblich verlängern, wenn hohe Komprimierungsstufen verwendet werden.
Statische Komprimierung mit Node und Express mit webpack
Da bei der statischen Komprimierung Dateien im Voraus komprimiert werden, können die Webpack-Einstellungen im Rahmen des Build-Schritts so geändert werden, dass Assets komprimiert werden. Dazu kann brotli-webpack-plugin
verwendet werden.
Fügen Sie es zuerst als devDependency
in package.json
hinzu:
"devDependencies": {
// ...
"brotli-webpack-plugin": "^1.1.0"
},
Importieren Sie es wie jedes andere Webpack-Plug-in in die Konfigurationsdatei webpack.config.js
:
var path = require("path");
//...
var BrotliPlugin = require('brotli-webpack-plugin');
Fügen Sie es in das Plug-in-Array ein:
module.exports = {
// ...
plugins: [
// ...
new BrotliPlugin({
asset: '[file].br',
test: /\.(js)$/
})
]
},
Das Plug-in-Array verwendet die folgenden Argumente:
asset
: Der Name des Ziel-Assets.[file]
wird durch den ursprünglichen Namen der Asset-Datei ersetzt.test
: Alle Assets, die mit diesem regulären Ausdruck übereinstimmen (d. h. JavaScript-Assets, die auf.js
enden), werden verarbeitet.
main.js
wird beispielsweise in main.js.br
umbenannt.
Wenn die App neu geladen und neu erstellt wird, wird jetzt eine komprimierte Version des Haupt-Bundles erstellt. Öffnen Sie die Glitch Console, um sich anzusehen, was sich im endgültigen public/
-Verzeichnis befindet, das vom Node-Server bereitgestellt wird.
- Klicken Sie auf die Schaltfläche Tools.
- Klicken Sie auf die Schaltfläche Console.
- Führen Sie in der Console die folgenden Befehle aus, um zum Verzeichnis
public
zu wechseln und alle zugehörigen Dateien anzusehen:
cd public
ls -lh
Die mit Brotli komprimierte Version des Bundles, main.bundle.js.br
, wird jetzt auch hier gespeichert. Sie ist etwa 76 % kleiner (225 KB gegenüber 53 KB) als main.bundle.js
.
Weisen Sie den Server als Nächstes an, diese mit Brotli komprimierten Dateien zu senden, wenn die ursprünglichen JS-Versionen angefordert werden. Dazu definieren Sie eine neue Route in server.js
, bevor die Dateien mit express.static
ausgeliefert werden.
const express = require('express');
const 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'));
Mit app.get
wird dem Server mitgeteilt, wie er auf eine GET
-Anfrage für einen bestimmten Endpunkt reagieren soll. Mit einer Callback-Funktion wird dann festgelegt, wie diese Anfrage verarbeitet werden soll. Die Route funktioniert so:
- Wenn Sie
'*.js'
als erstes Argument angeben, funktioniert dies für jeden Endpunkt, der ausgelöst wird, um eine JS-Datei abzurufen. - Im Callback wird
.br
an die URL der Anfrage angehängt und derContent-Encoding
-Antwortheader aufbr
gesetzt. - Der Header
Content-Type
ist aufapplication/javascript; charset=UTF-8
gesetzt, um den MIME-Typ anzugeben. - Schließlich sorgt
next()
dafür, dass die Sequenz mit dem nächsten möglichen Rückruf fortgesetzt wird.
Da einige Browser die Brotli-Komprimierung möglicherweise nicht unterstützen, solltest du vor dem Zurückgeben der mit Brotli komprimierten Datei prüfen, ob Brotli unterstützt wird. Dazu musst du prüfen, ob der Accept-Encoding
-Anfrageheader br
enthält:
const express = require('express');
const 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'));
Sehen Sie sich nach dem Neuladen der App noch einmal das Netzwerkfeld an.
Fertig! Sie haben Ihre Assets mit der Brotli-Komprimierung weiter komprimiert.
Fazit
In diesem Codelab haben Sie gesehen, wie Sie mit brotli
die Gesamtgröße Ihrer App weiter reduzieren können. Wenn unterstützt, ist brotli
ein leistungsstärkerer Komprimierungsalgorithmus als gzip
.