2011-06-16 2 views
36

Экспресс и соединение, похоже, удалили свои функции gzip, потому что они были слишком неэффективными. Есть ли надежные решения для gzip с express-js в настоящее время?Экспресс-статический контент gzip

+0

Использование Nginx-х GZIP – dumitru

+0

В случае, если это по-прежнему актуальна для кого-то: Как я хотел служить, являющегося файлом статические файлы, но не хотел над головой делать это на fly я написал небольшую обертку поверх express.static, которая позволяет обслуживать все готовые файлы gziped. Это было бы полезно, если бы вы интегрировали gzipping html/css/js-файлы в свой процесс сборки. Модуль можно найти на npm: [express-static-gzip] (https://www.npmjs.com/package/express-static-gzip) – Tobi

ответ

31

Connect 2.0 добавлена ​​поддержка compress() промежуточного программного обеспечения на основе new zlib stuff с тем, что только что вышел в Node Core API.

Вы можете использовать это в вашем экспресс-сервере, добавив зависимость для подключения 2.0 в вашем package.json файле:

{ 
    ... 
    dependencies: { 
     "connect" : "2.x", 
     "express" : "2.x", 
     // etc.. 
    } 
} 

А затем применить следующую логику в вашей экспресс конфигурации приложения:

// Create static file server with gzip support 
var app = express.createServer(express.logger()); 
app.use(connect.compress()); 
app.use(express.static(__dirname + '/public')); 
app.listen(80); 

Обратите внимание, что этот материал все еще довольно новый, и хотя я мог заставить его работать локально, мое облачное приложение Heroku жаловалось на зависимость от Compress 2 .x во время предварительной фиксации крючка при развертывании с помощью мерзавца:

-----> Heroku receiving push 
-----> Node.js app detected 
-----> Resolving engine versions 
     Using Node.js version: 0.4.7 
     Using npm version: 1.0.106 
-----> Fetching Node.js binaries 
-----> Vendoring node into slug 
-----> Installing dependencies with npm 
     npm ERR! Error: No compatible version found: [email protected]'>=2.0.0- <3.0.0-' 

Как вы можете видеть, что они все еще используют старую версию узла (0.4.7).


UPDATE:

На самом деле, я мог бы получить Heroku для развертывания путем добавления соответствующего engines раздел в package.json:

{ 
    ... 
    "engines": { 
     "node": ">= 0.6.0 < 0.7.0" 
    } 
} 

И эти результаты при использовании HTTP тестер сжатия:

enter image description here

UPDATE июня 2014

хия, если вы читаете это сейчас. Не забывайте, что вышеизложенное относится только к Express 2.0.

Экспресс 3.0 и 4.0 используют другой синтаксис для включения сжатия HTTP, см. Сообщение на бензине чуть ниже.

+0

Я не смог заставить его работать с Express 2.5.1. –

+2

@AndreyLushnikov: Вы должны 'use()' 'compress' ** перед **' static'. 'compress' [заменяет] (https://github.com/senchalabs/connect/blob/2.3.9/lib/middleware/compress.js#L77-91)' res.write' и 'res.end', так что он может передавать данные через zlib. Если 'static' перед' compress', он обрабатывает весь запрос до того, как промежуточное программное обеспечение 'compress' имеет возможность запускать и исправлять методы' res'. Стивен, я обновил ваш ответ, чтобы поменять вызовы 'use()'. – josh3736

+3

@ gasolin утверждает, что Express 3.0 теперь поддерживает 'compress()'. Если вы читаете это, не могли бы вы обновить свой ответ? – HyderA

1

Если вы искали номер npm, возможно, вы встретили node-compress.

Не должно быть слишком сложно вводить его в качестве промежуточного программного обеспечения в экспресс.

+0

Существует множество доступных библиотек для сжатия, но я хочу знать, есть ли люди успешно используя их в производстве. – HyderA

+0

@gAMBOOKa Я использую это лично, но не для производства только для разработки. – Raynos

5

Я также искал НПМ и найти, например:

  • https://github.com/tomgallacher/gzippo

    gzippo произносятся gzippo является GZIP промежуточного слоя для Connect с помощью Сжать для лучшей производительности.

Gzippo недавно был разработан (2 дня назад), который я думаю, что это хорошая вещь. Я не могу рассказать вам об использовании продукции. Вы должны сами проверить/сравнить его. Я также, вероятно, использовал бы CDN для живого сайта или Nginx для размещения моих статических файлов вместо некоторого модуля nodejs.

+5

Мы используем gzippo в производстве для большой британской газеты. Красота настройки сжатия содержимого на уровне узла заключается в том, что вы можете просто поместить Ларни, Squid или CDN вверх по течению, и он будет подчиняться заголовкам http и хранить кэшированную копию на молнии на прокси/CDN для всех последующих запросов. Это сохраняет конфигурацию кеша с кодом узла и в вашем git/svn и т. Д. – serby

3

Connect будет поддерживать новый ZLIB материал в узле в следующем выпуске

+0

Его добавили сейчас, см. Сообщение ниже. –

77

Express 3.0 теперь имеет сжатие() поддержка:

var app = express(); 
// gzip 
app.use(express.compress()); 
// static 
app.use("/public", express.static(__dirname + '/public')); 
// listen 
app.listen(80); 

РЕДАКТИРОВАТЬ для Express 4.0, сжатие стать отдельным промежуточного программного обеспечения. Таким образом, вы должны установить и импортировать его использовать:

var compress = require('compression'); 
app.use(compress()); 
+8

Express '4.x' удаляет почти все промежуточное ПО, включая' compress'. Теперь вы можете использовать промежуточное программное обеспечение Connect 'compression': https://github.com/expressjs/compression. –

+1

Это требует дополнительных шагов в heroku –

+0

В каких обстоятельствах срабатывает триггер сжатия?Я просто добавил его, но написал 'res.send', и никакого содержимого gzipped не появилось. Требуется ли 'res.end' или какой-либо другой триггер? – CMCDragonkai

Смежные вопросы