Gzip Compression
Gzip Compression
Reduce file sizes for faster transfer.
How Gzip Works
- Finds duplicate strings in text
- Replaces duplicates with references
- Typically 60-80% reduction for text
Server Configuration
// Express.js
const compression = require('compression');
app.use(compression());
// With options
app.use(compression({
level: 6, // 1-9, default 6
threshold: 1024, // Only compress > 1KB
filter: (req, res) => {
if (req.headers['x-no-compression']) return false;
return compression.filter(req, res);
},
}));
# Nginx
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript image/svg+xml;
gzip_min_length 256;
gzip_vary on;
Webpack Compression
// webpack.config.js
const CompressionPlugin = require('compression-webpack-plugin');
module.exports = {
plugins: [
new CompressionPlugin({
algorithm: 'gzip',
test: /\\.(js|css|html|svg)$/,
threshold: 1024,
minRatio: 0.8,
}),
],
};
When Gzip Helps
| Content Type | Compression |
|---|---|
| HTML | Excellent (80%+) |
| CSS | Excellent (70%+) |
| JavaScript | Excellent (70%+) |
| JSON | Excellent (70%+) |
| SVG | Excellent (70%+) |
| Images | Already compressed |
| Video | Already compressed |
Brotli Compression
Brotli Compression
Better compression than Gzip for web content.
Brotli vs Gzip
| Feature | Gzip | Brotli |
|---|---|---|
| Compression Ratio | 60-80% | 70-90% |
| Speed | Faster | Slower |
| Browser Support | 100% | 97%+ |
| Static Content | Good | Excellent |
Server Configuration
# Nginx with Brotli
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript image/svg+xml;
// Express.js with Brotli
const zlib = require('zlib');
app.use((req, res, next) => {
if (req.headers['accept-encoding']?.includes('br')) {
res.setHeader('Content-Encoding', 'br');
const brotli = zlib.createBrotliCompress({
params: {
[zlib.constants.BROTLI_PARAM_QUALITY]: 6,
},
});
const originalEnd = res.end;
res.end = function(chunk, encoding) {
if (chunk) {
chunk = brotli.compress(chunk);
}
return originalEnd.call(this, chunk, encoding);
};
}
next();
});
Webpack Brotli
// webpack.config.js
const CompressionPlugin = require('compression-webpack-plugin');
module.exports = {
plugins: [
new CompressionPlugin({
algorithm: 'brotliCompress',
test: /\\.(js|css|html|svg)$/,
threshold: 1024,
minRatio: 0.8,
}),
],
};
CDN Support
Most CDNs support Brotli:
- Cloudflare: Automatic
- CloudFront: Configurable
- Fastly: Supported
# Response headers
Content-Encoding: br
Vary: Accept-Encoding
When to Compress
When to Compress
Compression Guidelines
// Check if content should be compressed
function shouldCompress(contentType, size) {
// Don't compress already compressed formats
const compressedTypes = [
'image/jpeg', 'image/png', 'image/gif', 'image/webp',
'video/mp4', 'video/webm',
'audio/mp3', 'audio/ogg',
'application/zip', 'application/gzip',
'font/woff', 'font/woff2',
];
if (compressedTypes.includes(contentType)) return false;
if (size < 1024) return false; // Don't compress < 1KB
return true;
}
Pre-compression
// Build-time compression
const TerserPlugin = require('terser-webpack-plugin');
const CompressionPlugin = require('compression-webpack-plugin');
module.exports = {
optimization: {
minimizer: [new TerserPlugin()],
},
plugins: [
new CompressionPlugin({
test: /\\.(js|css)$/,
algorithm: 'brotliCompress',
}),
],
};
Runtime Compression
// Dynamic compression based on content
async function compressResponse(res, data, contentType) {
if (shouldCompress(contentType, data.length)) {
const accepted = req.headers['accept-encoding'];
if (accepted.includes('br')) {
res.setHeader('Content-Encoding', 'br');
return await brotliCompress(data);
} else if (accepted.includes('gzip')) {
res.setHeader('Content-Encoding', 'gzip');
return await gzip(data);
}
}
return data;
}
Compression Checklist
- Enable Brotli for text-based assets
- Enable Gzip as fallback
- Don't compress already compressed formats
- Set proper Content-Encoding headers
- Use Vary: Accept-Encoding
- Pre-compress static assets at build time
- Monitor compression ratios
Best Practices
- Use Brotli for better compression
- Pre-compress static assets
- Don't compress images/videos (already compressed)
- Set minimum size threshold (1KB)
- Use Vary header for proper caching
Practice Problems
Create a reusable React component implementing Compression. Include proper state management and accessibility.
Solution
// Production-ready component with:
// - Proper TypeScript types
// - Accessibility (ARIA)
// - Error boundaries
// - Loading states
// - Memoization where neededWrite unit and integration tests for Compression using React Testing Library.
Solution
// Test coverage:
// 1. Rendering tests
// 2. Interaction tests
// 3. Edge case tests
// 4. Accessibility testsOptimize Compression for performance. Consider memoization, code splitting, and bundle size.
Solution
// Optimization techniques:
// 1. React.memo / useMemo / useCallback
// 2. Code splitting with lazy()
// 3. Virtual scrolling for lists
// 4. Image lazy loading
// 5. Bundle analysisQuiz
1. What is the typical compression ratio for Gzip on JavaScript?
2. What is the benefit of Brotli over Gzip?
3. What is the primary purpose of Compression?
4. What is a common mistake when implementing Compression?
Flashcards
Question
What is Gzip?
Click to reveal answer
Answer
A compression algorithm that reduces file sizes by 60-80% for text-based content.
Question
What is Brotli?
Click to reveal answer
Answer
A newer compression algorithm that achieves 70-90% compression, better than Gzip.
Question
Why use Vary: Accept-Encoding?
Click to reveal answer
Answer
To ensure caches serve the correct compressed version based on client support.
Question
Should you compress images?
Click to reveal answer
Answer
No, images are already compressed. Compression only helps text-based content.
Question
What is Compression?
Click to reveal answer
Answer
Compression is a key concept in frontend development.
Revision Notes
Key Takeaways
- 1.Brotli provides better compression than Gzip (70-90% vs 60-80%)
- 2.Don't compress already compressed formats like images
- 3.Use Vary: Accept-Encoding for proper caching
- 4.Pre-compress static assets at build time
- 5.Set minimum size threshold (1KB) for compression
Interview Tips
- •Explain the difference between Gzip and Brotli
- •Discuss when compression helps vs doesn't help
- •Know how to configure compression on servers
Cheat Sheet
Compression Cheat Sheet
Gzip
- 60-80% compression
- Fast compression/decompression
- Universal support
Brotli
- 70-90% compression
- Slower compression
- Better ratio
When to Compress
- HTML, CSS, JS: Yes
- JSON, SVG: Yes
- Images, Video: No (already compressed)
- Fonts: No
Headers
- Content-Encoding: br/gzip
- Vary: Accept-Encoding