Skip to content

Serve static content

Static content served from a Node.js environment can have faster uncached response times compared to static content served by a WordPress environment (e.g. serving an ads.txt file) and requires less custom code. Static content that is is served using the example method below will be served from the same domain as the Node.js environment.

A code example demonstrating a method for serving static files from a Node.js environment is included for reference in the vip-go-node-skeleton repository. This code example uses Express, a web framework for Node.js. The Express built-in static middleware makes it possible to serve the static content and satisfies the requirements of the VIP platform

Importing the Express middleware

Express must be imported and the middleware created. To do this, define the app constant to reference an instance of Express, and identify the port to use (this defaults to 3000 in local development).

Location of this code snippet in the example repository.

const express = require( 'express' );
const path = require( 'path' );

const app = express();

const PORT = process.env.PORT || 3000;
const BASEURL = process.env.BASEURL || 'http://localhost';

Handling the cache healthcheck endpoint

All Node.js applications must implement the cache health check endpoint using application code.

Location of this code snippet in the example repository.

app.get( '/cache-healthcheck', function (req, res) {
	res.status( 200 ).send( 'Ok' );

A Node.js environment can handle a mixture of static content and dynamic routes. Each URL is processed in the order defined in the code, so the example code above will respond to /cache-healthcheck? with an “Ok” even if there’s a matching file in the public directory, which is essential to ensure that the cache healthcheck functionality is always working.

Serving the static content

The directory from which to serve static assets must be specified. For this example, static assets should be placed in the public directory, and they will be accessed with a URL relative to a root path.

Location of this code snippet in the example repository.

app.use( '/', express.static( path.join( __dirname, 'public') ) );

The app.use statement can be wrapped with a conditional. For example, a conditional that enables a switch between two different sets of static content based on the time and date, that “lifts the curtain” on a microsite on demand.

Express should serve a 404 for any invalid static URLs. This behavior, and others, can be customized.

For more information about static assets directories, refer to the Express project website.

Defining the port

app.listen is a standard requirement for the app to handle all incoming requests by listening on the defined PORT.

Location of this code snippet in the example repository.

app.listen( PORT, () => {
	console.log( `Static example listening on ${BASEURL}:${PORT}` );

Defining build and start

Including the build and start commands in the package.json file are a requirement for a Node.js app to run on VIP’s infrastructure.

Location of this code snippet in the example repository.

"scripts": {
    "test": "npx @automattic/vip-go-preflight-checks --verbose --wait=2000",
    "build": "echo 'No build script step configured, skipping build. For further information, refer to our documentation at'",
    "start": "node ./src/index.js"

Last updated: February 29, 2024

Relevant to

  • Node.js