Express.js is one of the most popular frameworks for building Node.js applications. Its lightweight nature makes it fast, but as your app grows, performance bottlenecks can creep in. In this blog, I’ll share five practical tips to optimize your Express.js app for speed and scalability.
1. Optimize Middleware Usage
Middleware is the backbone of any Express.js app, but unnecessary or poorly implemented middleware can slow things down.
Only load required middleware: Avoid global middleware for routes that don’t need it.
Example: Apply body-parser only to routes expecting a JSON payload.
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
// Use body-parser only for specific routes
app.post('/api/data', bodyParser.json(), (req, res) => {
res.send('Data received');
});
2. Leverage Caching
Caching reduces the need for repeated database queries or API calls. Tools like redis or HTTP caching headers can dramatically improve response times.
Example with Redis:
const redis = require('redis');
const client = redis.createClient();
const app = require('express')();
app.get('/api/resource', (req, res) => {
const cacheKey = 'resource';
client.get(cacheKey, (err, cachedData) => {
if (cachedData) {
res.send(JSON.parse(cachedData));
} else {
const data = fetchDataFromDatabase(); // Simulated DB call
client.setex(cacheKey, 3600, JSON.stringify(data)); // Cache for 1 hour
res.send(data);
}
});
});
HTTP Caching:
app.use((req, res, next) => {
res.set('Cache-Control', 'public, max-age=3600'); // Cache for 1 hour
next();
});
3. Use Compression
Large payloads can slow down response times. Enabling Gzip compression can reduce payload size and improve speed.
const compression = require('compression');
const express = require('express');
const app = express();
app.use(compression()); // Compress all routes
This simple addition can reduce response sizes by up to 70%!
4. Optimize Database Queries
Slow database queries are often the main culprit behind poor app performance.
Tips:
- Index frequently queried fields in your database.
- Use pagination or limit for large datasets.
- Avoid N+1 query problems by using joins or batch fetches. Example with Mongoose:
const User = require('./models/User');
// Instead of fetching all users
app.get('/users', async (req, res) => {
const users = await User.find().limit(20).skip(0); // Use pagination
res.send(users);
});
5. Enable HTTP/2 and Use a CDN
HTTP/2 allows multiplexing and header compression, reducing latency for static assets. Pairing this with a CDN further speeds up delivery by caching static assets closer to users.
Setup for HTTP/2 with Express:
const http2 = require('http2');
const fs = require('fs');
const express = require('express');
const app = express();
const options = {
key: fs.readFileSync('./ssl/key.pem'),
cert: fs.readFileSync('./ssl/cert.pem'),
};
http2.createSecureServer(options, app).listen(8443, () => {
console.log('HTTP/2 server running on port 8443');
});
By efficiently managing middleware, caching, compressing responses, and optimizing database queries, you can significantly improve performance. Implement these tips and ensure your app is blazing fast!
If you found this blog helpful, hit the ❤️ icon and follow me for more JavaScript tips and tricks!
Top comments (0)