2011-06-16 47 views
36

Express và kết nối dường như đã xóa chức năng gzip của chúng vì chúng quá kém hiệu quả. Có giải pháp đáng tin cậy nào để gzip với express-js hiện tại không?Nội dung tĩnh gzip nhanh

+0

Sử dụng nginx của gzip – dumitru

+0

Trong trường hợp này vẫn còn thích hợp cho ai đó: Như tôi đã muốn để phục vụ các tập tin tĩnh gziped nhưng không muốn chi phí để làm điều này trên bay tôi đã viết một wrapper nhỏ trên đầu trang của express.static, cho phép phục vụ allready gziped tập tin. Điều này sẽ hữu ích nếu bạn tích hợp các tệp html/css/js gzipping vào quá trình xây dựng của mình. Mô-đun có thể được tìm thấy trên npm: [express-static-gzip] (https://www.npmjs.com/package/express-static-gzip) – Tobi

Trả lời

31

Connect 2.0 đã thêm hỗ trợ cho compress() middleware dựa trên new zlib stuff với điều đó vừa đi ra trong Node Lõi API.

Bạn có thể tận dụng điều này trong máy chủ rõ ràng của bạn bằng cách thêm một phụ thuộc vào kết nối 2,0 trong package.json tập tin của bạn:

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

Và sau đó áp dụng logic sau vào cấu hình ứng dụng rõ ràng của bạn:

// 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); 

Xin lưu ý rằng công cụ này vẫn còn khá mới và trong khi tôi có thể làm cho nó hoạt động cục bộ, ứng dụng đám mây Heroku của tôi đã phàn nàn về sự phụ thuộc vào Nén 2.x trong móc trước khi triển khai thông qua git:

-----> 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-' 

Như bạn có thể thấy, họ vẫn đang sử dụng phiên bản cũ của nút (0.4.7).


UPDATE:

Thực ra, tôi có thể nhận được Heroku để triển khai này bằng cách thêm các engines phần tương ứng trong package.json:

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

Và đây là kết quả khi sử dụng một http trình kiểm tra nén:

enter image description here

CẬP NHẬT Tháng Sáu 2014

Hiya, nếu bạn đang đọc này ngay bây giờ. Đừng quên rằng những thứ trên chỉ liên quan đến Express 2.0.

Express 3.0 và 4.0 sử dụng cú pháp khác nhau để bật tính năng nén http, xem bài đăng của gasolin ngay bên dưới.

+0

Tôi không thể làm cho nó hoạt động trên Express 2.5.1. –

+2

@AndreyLushnikov: Bạn phải 'use()' 'compress' ** trước **' static'. 'compress' [thay thế] (https://github.com/senchalabs/connect/blob/2.3.9/lib/middleware/compress.js#L77-91)' res.write' và 'res.end' để nó có thể proxy dữ liệu thông qua zlib. Nếu 'static' là trước' compress', nó xử lý toàn bộ yêu cầu trước khi phần mềm trung gian 'compress' có cơ hội chạy và vá các phương thức' res'. Steven, tôi đã cập nhật câu trả lời của bạn để hoán đổi các cuộc gọi 'use()'. Các trạng thái – josh3736

+3

@gasolin bên dưới Express 3.0 hiện có hỗ trợ 'compress()'. Nếu bạn đang đọc, bạn có thể vui lòng cập nhật câu trả lời của mình không? – HyderA

1

Nếu bạn đã tìm kiếm npm, bạn có thể đã gặp phải node-compress.

Không nên quá khó để chèn nó làm phần mềm trung gian vào thể hiện.

+0

Có rất nhiều thư viện nén sẵn có, nhưng tôi muốn biết liệu mọi người có sử dụng chúng trong sản xuất thành công. – HyderA

+0

@ gAMBOOKa Tôi đang sử dụng cá nhân đó chứ không phải để sản xuất chỉ để phát triển. – Raynos

5

Tôi cũng đã tìm kiếm NPM và thấy ví dụ:

Gzippo gần đây đã được phát triển (2 ngày trước) mà tôi nghĩ là một điều tốt. Tôi không thể nói cho bạn biết về cách sử dụng sản xuất. Bạn nên tự mình kiểm tra/đo điểm chuẩn. Tôi cũng có thể sử dụng một CDN cho một trang web trực tiếp hoặc Nginx để lưu trữ các tệp tĩnh của tôi thay vì một số mô-đun nodejs.

+5

Chúng tôi đang sử dụng gzippo trong sản xuất cho một tờ báo lớn của Vương quốc Anh. Vẻ đẹp của cấu hình nén nội dung trong lớp nút là bạn có thể chỉ cần đặt Varnish, Squid hoặc CDN upstream và nó sẽ tuân theo tiêu đề http và giữ một bản sao nén được lưu trữ trên proxy/CDN cho tất cả các yêu cầu tiếp theo. Điều này sẽ giúp cấu hình bộ nhớ cache với mã nút của bạn và trong git/svn của bạn, v.v. – serby

3

Connect sẽ hỗ trợ các công cụ zlib mới trong Node trong phiên bản tiếp theo

+0

Nó được thêm vào bây giờ, xem bài đăng bên dưới .. –

77

Express 3.0 bây giờ đã nén() hỗ trợ:

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

EDIT cho Express 4.0, nén trở thành trung gian riêng biệt. Vì vậy, bạn phải cài đặt và nhập khẩu để sử dụng nó:

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

Express '4.x' đã xóa gần như tất cả phần mềm trung gian, bao gồm' compress'. Bạn có thể sử dụng phần mềm trung gian 'compression' của Connect ngay bây giờ: https://github.com/expressjs/compression. –

+1

hiện nó yêu cầu các bước bổ sung trong heroku –

+0

Trong trường hợp nào kích hoạt nén?Tôi chỉ cần thêm nó nhưng đã viết 'res.send' và không có nội dung gzipped xuất hiện. Liệu nó có cần 'res.end' hoặc một số trigger khác? – CMCDragonkai

Các vấn đề liên quan