2017-06-24 3 views
2

J'utilise webpack-compression-plugin pour compresser tous mes fichiers statiques et fichiers hml avant le format gzip et brotli. Si le navigateur le supporte, j'utilise brotli, sinon gzip et la dernière option est le fichier original. Donc, je voudrais avoir quelque chose comme ça par exemple après le regroupement. Sur le serveur, j'utilise express-static-gzip pour servir les fichiers statiques et tout fonctionne correctement. Tous les actifs statiques de mes clients sont compressés et servis comme ça.Servir la page gzip html dans le noeud

import expressStaticGzip from 'express-static-gzip' 
const app: Express = new Express() 
process.env.PWD = process.cwd() 

app.set('view engine', 'ejs') 
app.set('views', path.join(process.env.PWD + '/src/server/views')) 

app.use(expressStaticGzip(path.join(process.env.PWD + '/src/dist'), {indexFromEmptyFile: false, enableBrotli: true, maxAge: '1y'})) 

app.use((req, res, next) => { 
    res.set('Cache-Control', 'no-cache') 
    return next() 
}) 

/* Use server side rendering for first load */ 
app.use(appRenderer) 

// Routes 
app.get('*', (req, res) => { 
    res.render('index') 
}) 

app.listen(PORT,() => { 
    console.log(` 
    Express server is up on port ${PORT} 
    Production environment 
    `) 
}) 

Le problème que j'ai est avec mon fichier html, root. Bien que j'en ai aussi la version gzip et br, elle n'est pas servie comme ça. Je le fais en regroupant le code côté serveur. Le module de compression Express ne fonctionne pas et je veux également une compression statique. Je n'utilise pas nginx. enter image description here

+0

Avez-vous trouvé la solution? Sinon, j'utilise https://stackoverflow.com/a/15323082/3241111 Cela fonctionne pour moi. Je ne sais pas, comment l'utiliser pour .html juste et pas pour '.js' et' .css' bcoz je ne veux pas que le serveur compresse 'js' et' css' pour SSR sur chaque demande – myDoggyWritesCode

+1

Je didn ' Je trouve une solution facile mais j'en ai trouvé un. J'ai utilisé Nginx. Avec Nginx, je peux utiliser le module gzip_static pour servir des fichiers statiques précompressés et le mode dynamique gzip normal qui compresse juste le fichier html à la volée. –

+0

C'est gentil. Est-ce que vous compressez des images aussi? – myDoggyWritesCode

Répondre

1

Avec l'aide de ce plugin et comme cela a été suggéré here je l'ai eu à travailler

Mon code: Assurez-vous que vous avez .js et .css pré-gzip fichiers

const checkForHTML = req => { 
    const url = req.url.split('.'); 
    const extension = url[url.length -1]; 

    if (['/'].indexOf(extension) > -1) { 
     return true; //compress only .html files sent from server 
    } 

    return false; 
}; 

var compress = require('compression'); 
app.use(compress({filter: checkForHTML})); 

const encodeResToGzip = contentType => (req, res, next) => { 
    req.url = req.url + '.gz'; 
    res.set('Content-Encoding', 'gzip'); 
    res.set('Content-Type', contentType); 

    next(); 
}; 

app.get("*.js", encodeResToGzip('text/javascript')); 
app.get("*.css", encodeResToGzip('text/css')); 

Je voulais que la compression se produise seulement pour .html parce que j'utilise le modèle .ejs, donc j'ai besoin de compresser .html à l'exécution. La compression de fichiers statiques (js/css) en utilisant express compression n'est pas une bonne idée car elle le fera à chaque requête et ce sont des fichiers statiques. Ou bien, mettre en cache vos résultats comme suggéré here

Une autre solution utilisant nginx, comme vous l'avez posté dans vos commentaires semble également agréable.

+2

Je serai sûr d'essayer votre solution aussi la prochaine fois que j'ai une chance. J'oublie aussi de dire qu'il y a un plugin 'brotli-compression-plugin'. Brotli est une nouvelle norme au lieu de gzip. Tout devrait fonctionner de la même manière. Vous avez trois fichiers .js, .js.gz et .js.br et le navigateur l'utilise dans l'ordre du dernier au premier. Vous pouvez également le servir avec Nginx. Je pense que c'est la meilleure façon pour moi. J'ai le modèle de .ejs, le paquet, le fournisseur, les styles ... et chaque fichier statique est généré avec chunkhash et il a l'en-tête de cache mis pour 1 an. CONTINUE => –

+0

Le fichier Html n'a pas d'en-tête de cache, donc le navigateur le contacte sur chaque chargement mais il met en cache tout le reste. S'il y a un changement parmi les fichiers statiques, le navigateur le saura puisqu'il contactera html. De cette façon, il ne téléchargera que le fichier modifié et utilisera tout le reste du cache. Ne pas utiliser gzip precompressed mais à la volée est bénéfique dans ce cas. –

+0

moi aussi en utilisant '.ejs' et ayant 'chunkhash' en cache' css-js' pendant 1 an. Pas de mise en cache index.html .. Je ne sais pas comment fournir un support hors ligne dans ce cas ... Aussi, "Ne pas utiliser gzip précompilé mais à la volée ..." Signification, dans quel cas? J'ai css-js précached qui me donne 200 (à partir du disque mis en cache) et non 304 (non modifié) ce qui signifie, precompressed est bien @ Igor-Vuk – myDoggyWritesCode