Cet atelier de programmation est une extension de l'atelier de programmation sur la minification et la compression des charges utiles réseau et part du principe que vous connaissez les concepts de base de la compression. Par rapport à d'autres algorithmes de compression tels que gzip
, cet atelier de programmation explique comment la compression Brotli (br
) peut réduire davantage les ratios de compression et la taille globale de votre application.
Mesurer
Avant de vous lancer dans l'ajout d'optimisations, il est toujours judicieux d'analyser d'abord l'état actuel de l'application.
- Cliquez sur Remixer pour modifier pour rendre le projet modifiable.
- Pour prévisualiser le site, appuyez sur Afficher l'application, puis sur Plein écran .
Dans l'atelier de programmation précédent Réduire et compresser les charges utiles réseau, nous avons réduit la taille de main.js
, passant de 225 Ko à 61,6 Ko. Dans cet atelier de programmation, vous allez découvrir comment la compression Brotli peut réduire encore plus cette taille de bundle.
Compression brotli
Brotli est un algorithme de compression plus récent qui peut fournir des résultats de compression de texte encore meilleurs que gzip
. Selon CertSimple, les performances de Brotli sont les suivantes :
- 14 % plus petite que
gzip
pour JavaScript - 21 % plus petit que
gzip
pour le code HTML - 17 % plus petite que
gzip
pour CSS
Pour utiliser Brotli, votre serveur doit être compatible avec HTTPS. Brotli est compatible avec tous les navigateurs récents. Les navigateurs compatibles avec Brotli incluront br
dans les en-têtes Accept-Encoding
:
Accept-Encoding: gzip, deflate, br
Vous pouvez déterminer l'algorithme de compression utilisé à l'aide du champ Content-Encoding
de l'onglet "Réseau" des outils pour les développeurs Chrome (Command+Option+I
ou Ctrl+Alt+I
):
Activer Brotli
La manière dont vous configurez un serveur Web pour envoyer des ressources encodées Brotli dépend de la manière dont vous prévoyez de les encoder. Vous pouvez compresser de manière dynamique les ressources avec Brotli au moment de la requête (dynamique) ou les encoder à l'avance afin qu'elles soient déjà compressées au moment où l'utilisateur les demande (statique).
Compression dynamique
La compression dynamique consiste à compresser les éléments à la volée lorsqu'ils sont demandés par le navigateur.
Avantages
- Il n'est pas nécessaire de créer et de mettre à jour des versions compressées enregistrées des composants.
- La compression instantanée fonctionne particulièrement bien pour les pages Web générées dynamiquement.
Inconvénients
- La compression de fichiers à des niveaux plus élevés pour obtenir de meilleurs ratios de compression prend plus de temps. Cela peut entraîner une perte de performances, car l'utilisateur attend que les éléments soient compressés avant qu'ils ne soient envoyés par le serveur.
Compression dynamique avec Node et Express
Le fichier server.js
est chargé de configurer le serveur Node qui héberge l'application.
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}`);
});
Tout cela consiste à importer express
et à utiliser le middleware express.static
pour charger tous les fichiers HTML, JS et CSS statiques dans public/directory
(ces fichiers sont créés par webpack à chaque compilation).
Pour vous assurer que tous les composants sont compressés à l'aide de brotli chaque fois qu'ils sont demandés, vous pouvez utiliser le module shrink-ray
. Commencez par l'ajouter en tant que devDependency
dans package.json
:
"devDependencies": {
// ...
"shrink-ray": "^0.1.3"
},
Importez-le dans le fichier du serveur, server.js
:
const express = require('express');
const shrinkRay = require('shrink-ray');
Ajoutez-le en tant qu'intergiciel avant le montage de express.static
:
// ...
const app = express();
// Compress all requests
app.use(shrinkRay());
app.use(express.static('public'));
Actualisez maintenant l'application et examinez la taille du bundle dans le panneau "Network" (Réseau) :
Vous pouvez voir que brotli
est appliqué à partir de bz
dans l'en-tête Content-Encoding
.
main.bundle.js
est réduit de 225 Ko à 53,1 Ko. Elle est environ 14% plus petite que gzip
(61,6 Ko).
Compression statique
L'idée de la compression statique est de compresser et d'enregistrer les éléments à l'avance.
Avantages
- La latence due à des niveaux de compression élevés n'est plus un problème. Rien ne doit se produire à la volée pour compresser les fichiers, car ils peuvent désormais être récupérés directement.
Inconvénients
- Les éléments doivent être compressés à chaque compilation. Les durées de compilation peuvent augmenter considérablement si des niveaux de compression élevés sont utilisés.
Compression statique avec Node et Express avec webpack
Étant donné que la compression statique implique la compression de fichiers à l'avance, les paramètres Webpack peuvent être modifiés pour compresser les éléments dans le cadre de l'étape de compilation. Vous pouvez utiliser brotli-webpack-plugin
à cette fin.
Commencez par l'ajouter en tant que devDependency
dans package.json
:
"devDependencies": {
// ...
"brotli-webpack-plugin": "^1.1.0"
},
Comme tout autre plug-in webpack, importez-le dans le fichier de configuration, webpack.config.js
:
var path = require("path");
//...
var BrotliPlugin = require('brotli-webpack-plugin');
et l'inclure dans le tableau des plug-ins :
module.exports = {
// ...
plugins: [
// ...
new BrotliPlugin({
asset: '[file].br',
test: /\.(js)$/
})
]
},
Le tableau du plug-in utilise les arguments suivants :
asset
: nom de l'élément cible.[file]
est remplacé par le nom de fichier d'origine de l'élément.test
: tous les éléments correspondant à cette expression régulière (c'est-à-dire les éléments JavaScript se terminant par.js
) sont traités.
Par exemple, main.js
sera renommé main.js.br
.
Lorsque l'application est actualisée et recréée, une version compressée du bundle principal est créée. Ouvrez la console Glitch pour voir ce qui se trouve dans le répertoire public/
final qui est servi par le serveur Node.
- Cliquez sur le bouton Outils.
- Cliquez sur le bouton Console.
- Dans la console, exécutez les commandes suivantes pour accéder au répertoire
public
et afficher tous ses fichiers :
cd public
ls -lh
La version compressée brotli du bundle, main.bundle.js.br
, est désormais également enregistrée ici et est environ 76 % plus petite (225 Ko contre 53 Ko) que main.bundle.js
.
Indiquez ensuite au serveur d'envoyer ces fichiers compressés en mode Brotli chaque fois que leurs versions JS d'origine sont demandées. Pour ce faire, définissez un nouveau parcours dans server.js
avant que les fichiers ne soient diffusés avec express.static
.
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'));
app.get
permet d'indiquer au serveur comment répondre à une requête GET
pour un point de terminaison spécifique. Une fonction de rappel est ensuite utilisée pour définir la manière de gérer cette requête. L'itinéraire fonctionne de la manière suivante:
- Si vous spécifiez
'*.js'
comme premier argument, cela signifie que cela fonctionne pour chaque point de terminaison déclenché pour récupérer un fichier JS. - Dans le rappel,
.br
est associé à l'URL de la requête et l'en-tête de réponseContent-Encoding
est défini surbr
. - L'en-tête
Content-Type
est défini surapplication/javascript; charset=UTF-8
pour spécifier le type MIME. - Enfin,
next()
s'assure que la séquence continue vers tout rappel qui peut être le suivant.
Étant donné que certains navigateurs peuvent ne pas être compatibles avec la compression Brotli, vérifiez que l'en-tête de requête Accept-Encoding
inclut br
avant de renvoyer le fichier compressé par brotli:
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'));
Une fois l'application actualisée, examinez à nouveau le panneau "Network" (Réseau).
Opération réussie. Vous avez utilisé la compression Brotli pour compresser davantage vos composants.
Conclusion
Cet atelier de programmation a montré comment brotli
peut réduire davantage la taille globale de votre application. Lorsque compatible, brotli
est un algorithme de compression plus puissant que gzip
.