Bird
Raised Fist0
Node.jsframework~8 mins

Serving static files in Node.js - Performance & Optimization

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Performance: Serving static files
HIGH IMPACT
This affects how quickly static assets like images, CSS, and JavaScript files load, impacting page load speed and user experience.
Serving static files in a Node.js web server
Node.js
import express from 'express';
const app = express();

app.use(express.static('public'));

app.listen(3000);
Uses built-in static middleware that caches file metadata and streams efficiently, reducing unnecessary disk reads.
📈 Performance GainEfficiently streams files and supports browser caching via ETags/Cache-Control, reducing server load and improving LCP.
Serving static files in a Node.js web server
Node.js
const http = require('http');
const fs = require('fs');

http.createServer((req, res) => {
  if (req.url === '/style.css') {
    fs.readFile('./style.css', (err, data) => {
      if (err) {
        res.writeHead(404);
        res.end('Not found');
        return;
      }
      res.writeHead(200, {'Content-Type': 'text/css'});
      res.end(data);
    });
  } else {
    res.writeHead(404);
    res.end('Not found');
  }
}).listen(3000);
Reads the file from disk on every request, causing slow response and high CPU usage.
📉 Performance CostPerforms disk I/O on every request using the limited libuv thread pool, causing contention, slow responses, and delayed LCP.
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
Reading files on every requestN/AN/ADelays paint due to slow resource load[X] Bad
Using express.static middlewareN/AN/AFast paint due to quick resource delivery[OK] Good
Rendering Pipeline
Serving static files efficiently reduces the time the browser waits for resources, speeding up style and script application and image display.
Network Request
Resource Loading
Style Calculation
Paint
⚠️ BottleneckNetwork Request and Resource Loading due to slow file reads or lack of caching
Core Web Vital Affected
LCP
This affects how quickly static assets like images, CSS, and JavaScript files load, impacting page load speed and user experience.
Optimization Tips
1Avoid reading static files from disk on every request.
2Use built-in static file middleware with caching and compression.
3Check network timings in DevTools to ensure fast static asset delivery.
Performance Quiz - 3 Questions
Test your performance knowledge
What is a common performance problem when serving static files by reading from disk on every request?
AHigh CPU usage and slow response times
BToo many DOM nodes created
CExcessive CSS selector complexity
DLarge JavaScript bundle size
DevTools: Network
How to check: Open DevTools, go to Network tab, reload page, and check the timing for static files like CSS and JS.
What to look for: Look for long 'Waiting (TTFB)' or 'Content Download' times indicating slow static file serving.

Practice

(1/5)
1. What is the main purpose of using express.static in a Node.js server?
easy
A. To manage user authentication
B. To handle database connections
C. To create dynamic HTML pages
D. To serve static files like images, CSS, and JavaScript to users

Solution

  1. Step 1: Understand the role of express.static

    This middleware is designed to serve files such as images, CSS, and JavaScript directly to the browser.
  2. Step 2: Compare with other server tasks

    Database connections, dynamic page creation, and authentication are handled by other parts of the server, not express.static.
  3. Final Answer:

    To serve static files like images, CSS, and JavaScript to users -> Option D
  4. Quick Check:

    Serving static files = A [OK]
Hint: Remember: static files are served by express.static middleware [OK]
Common Mistakes:
  • Confusing static file serving with database handling
  • Thinking express.static creates dynamic content
  • Assuming express.static manages user login
2. Which of the following is the correct syntax to serve static files from a folder named public using Express?
easy
A. app.static('public')
B. app.use(express.static('public'))
C. express.use.static('public')
D. app.getStatic('public')

Solution

  1. Step 1: Recall Express static middleware syntax

    The correct way is to call app.use(express.static('folderName')) to serve static files.
  2. Step 2: Check each option

    Only app.use(express.static('public')) uses the correct method and syntax. Others are invalid or do not exist in Express.
  3. Final Answer:

    app.use(express.static('public')) -> Option B
  4. Quick Check:

    Correct static serving syntax = B [OK]
Hint: Use app.use with express.static and folder name [OK]
Common Mistakes:
  • Using app.static instead of app.use(express.static)
  • Calling express.use.static which is invalid
  • Trying app.getStatic which does not exist
3. Given this Express code snippet:
const express = require('express');
const app = express();
app.use(express.static('assets'));
app.listen(3000);

What URL path would serve the file assets/logo.png?
medium
A. http://localhost:3000/assets/logo.png
B. http://localhost:3000/public/logo.png
C. http://localhost:3000/logo.png
D. http://localhost:3000/static/logo.png

Solution

  1. Step 1: Understand express.static path mapping

    When serving static files from folder 'assets', the files are accessible at the root URL path, so 'logo.png' is at '/logo.png'.
  2. Step 2: Analyze each URL option

    http://localhost:3000/logo.png matches the correct URL path. Options A, B, and C incorrectly add folder names to the URL path.
  3. Final Answer:

    http://localhost:3000/logo.png -> Option C
  4. Quick Check:

    Static folder files appear at root URL path = D [OK]
Hint: Static folder files appear at root URL unless a prefix is set [OK]
Common Mistakes:
  • Adding folder name to URL path incorrectly
  • Assuming static files need /static or /public prefix
  • Confusing folder name with URL path
4. Identify the error in this code snippet that tries to serve static files from the static folder:
const express = require('express');
const app = express();
app.use(express.static.static('static'));
app.listen(3000);
medium
A. Incorrect use of express.static.static instead of express.static
B. Missing app.listen call
C. Folder name should be absolute path
D. Static files folder must be named 'public'

Solution

  1. Step 1: Check the express.static usage

    The code incorrectly calls express.static.static. The correct call is express.static.
  2. Step 2: Verify other parts

    App.listen is present, folder name can be relative, and folder name does not have to be 'public'.
  3. Final Answer:

    Incorrect use of express.static.static instead of express.static -> Option A
  4. Quick Check:

    Use express.static, not express.static.static [OK]
Hint: Use express.static, not express.static.static [OK]
Common Mistakes:
  • Adding extra .static after express.static
  • Thinking folder must be named 'public'
  • Believing folder path must be absolute
5. You want to serve static files from the public folder but under the URL path prefix /static. Which code correctly achieves this?
hard
A. app.use('/static', express.static('public'))
B. app.use(express.static('/static/public'))
C. app.use('/public', express.static('static'))
D. app.get('/static', express.static('public'))

Solution

  1. Step 1: Understand URL prefix with express.static

    To serve static files under a URL prefix, pass the prefix as the first argument to app.use, then the static middleware.
  2. Step 2: Evaluate each option

    app.use('/static', express.static('public')) correctly uses app.use('/static', express.static('public')). Others either misuse paths or methods.
  3. Final Answer:

    app.use('/static', express.static('public')) -> Option A
  4. Quick Check:

    URL prefix with app.use('/prefix', express.static(folder)) = A [OK]
Hint: Use app.use('/prefix', express.static('folder')) for URL prefix [OK]
Common Mistakes:
  • Putting URL prefix inside express.static argument
  • Using app.get instead of app.use for static files
  • Mixing folder and URL prefix names