prerender-node
raw JSON → 3.8.3 verified Sat Apr 25 auth: no javascript
Express middleware for serving prerendered JavaScript-rendered pages to crawlers (Google, Facebook, Twitter, Bing) to improve SEO for Angular, React, Vue, and other JS frameworks. Current stable version: 3.8.3. Released as needed, maintained actively. Key differentiator: integrates with Prerender.io cloud service or self-hosted prerender server, supports whitelist/blacklist, beforeRender/afterRender hooks. Compared to alternatives like puppeteer-based solutions, it offloads rendering to an external service, reducing server load.
Common errors
error Cannot find module 'prerender-node' ↓
cause Package not installed or missing from package.json.
fix
Run 'npm install prerender-node --save' to install the package.
error prerender-node: no token set, using default (free) service ↓
cause You did not set a prerenderToken, so the middleware falls back to the free public service (limited).
fix
Set your token via .set('prerenderToken', 'YOUR_TOKEN') or set the PRERENDER_TOKEN environment variable.
error prerender-node: beforeRender must return a string or a promise that resolves to a string ↓
cause The beforeRender callback returned something other than a string or Promise<string>.
fix
Ensure beforeRender returns a string (e.g., cache key) or a Promise resolving to a string.
Warnings
gotcha Cannot use import (ESM) with prerender-node; it's CommonJS only. ↓
fix Use const prerender = require('prerender-node');
gotcha Whitelist/blacklist methods are named 'whitelisted' and 'blacklisted' (with 'ed'), not 'whitelist'/'blacklist'. ↓
fix Use .whitelisted('/path') and .blacklisted('/path') correctly.
gotcha Local development requires running a local prerender server (https://github.com/prerender/prerender) because the cloud service cannot access localhost. ↓
fix Clone and run the prerender server locally, then set PRERENDER_SERVICE_URL environment variable to point to it.
deprecated The 'set' method with 'prerenderToken' is the only supported way to configure the token; old methods like 'setPrerenderToken' are removed. ↓
fix Use .set('prerenderToken', 'YOUR_TOKEN')
gotcha The default user agent list may not cover all crawlers; custom crawlers can be added via .crawlerUserAgent() method. ↓
fix Use prerender.crawlerUserAgent('MyCrawler') to add custom user agents.
Install
npm install prerender-node yarn add prerender-node pnpm add prerender-node Imports
- default wrong
import prerender from 'prerender-node';correctconst prerender = require('prerender-node'); app.use(prerender); - default with token
app.use(require('prerender-node').set('prerenderToken', 'YOUR_TOKEN')); - whitelisted wrong
app.use(require('prerender-node').whitelist('/search'));correctapp.use(require('prerender-node').whitelisted('/search')); - blacklisted wrong
app.use(require('prerender-node').blacklist('/admin'));correctapp.use(require('prerender-node').blacklisted('/admin'));
Quickstart
const express = require('express');
const prerender = require('prerender-node');
const app = express();
const PORT = process.env.PORT || 3000;
const PRERENDER_TOKEN = process.env.PRERENDER_TOKEN ?? '';
if (PRERENDER_TOKEN) {
app.use(prerender.set('prerenderToken', PRERENDER_TOKEN));
} else {
app.use(prerender);
}
app.get('/', (req, res) => {
res.send(`
<html>
<head><title>Test</title></head>
<body>
<div id="root">Hello World</div>
<script>document.getElementById('root').innerHTML = 'Prerendered';</script>
</body>
</html>
`);
});
app.listen(PORT, () => console.log(`Server running on port ${PORT}`));