{"id":18683,"library":"prerender-node","title":"prerender-node","description":"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.","status":"active","version":"3.8.3","language":"javascript","source_language":"en","source_url":"git://github.com/prerender/prerender-node","tags":["javascript","angular","backbone","emberjs","seo"],"install":[{"cmd":"npm install prerender-node","lang":"bash","label":"npm"},{"cmd":"yarn add prerender-node","lang":"bash","label":"yarn"},{"cmd":"pnpm add prerender-node","lang":"bash","label":"pnpm"}],"dependencies":[{"reason":"The middleware makes requests to the Prerender service (self-hosted or cloud) to fetch prerendered HTML.","package":"prerender","optional":true}],"imports":[{"note":"This package is CommonJS only; does not support ESM imports. Use require().","wrong":"import prerender from 'prerender-node';","symbol":"default","correct":"const prerender = require('prerender-node'); app.use(prerender);"},{"note":"To use the Prerender.io cloud service, you must set the 'prerenderToken' via .set(). Not needed if self-hosting.","wrong":"","symbol":"default with token","correct":"app.use(require('prerender-node').set('prerenderToken', 'YOUR_TOKEN'));"},{"note":"Method is 'whitelisted' not 'whitelist'. Accepts string or array of paths (regex-compatible).","wrong":"app.use(require('prerender-node').whitelist('/search'));","symbol":"whitelisted","correct":"app.use(require('prerender-node').whitelisted('/search'));"},{"note":"Method is 'blacklisted' not 'blacklist'. Accepts string or array of paths.","wrong":"app.use(require('prerender-node').blacklist('/admin'));","symbol":"blacklisted","correct":"app.use(require('prerender-node').blacklisted('/admin'));"}],"quickstart":{"code":"const express = require('express');\nconst prerender = require('prerender-node');\n\nconst app = express();\nconst PORT = process.env.PORT || 3000;\nconst PRERENDER_TOKEN = process.env.PRERENDER_TOKEN ?? '';\n\nif (PRERENDER_TOKEN) {\n  app.use(prerender.set('prerenderToken', PRERENDER_TOKEN));\n} else {\n  app.use(prerender);\n}\n\napp.get('/', (req, res) => {\n  res.send(`\n    <html>\n      <head><title>Test</title></head>\n      <body>\n        <div id=\"root\">Hello World</div>\n        <script>document.getElementById('root').innerHTML = 'Prerendered';</script>\n      </body>\n    </html>\n  `);\n});\n\napp.listen(PORT, () => console.log(`Server running on port ${PORT}`));","lang":"javascript","description":"Sets up Express middleware for prerendering: uses token from env or runs without, then serves a simple HTML page."},"warnings":[{"fix":"Use const prerender = require('prerender-node');","message":"Cannot use import (ESM) with prerender-node; it's CommonJS only.","severity":"gotcha","affected_versions":">=3.0.0"},{"fix":"Use .whitelisted('/path') and .blacklisted('/path') correctly.","message":"Whitelist/blacklist methods are named 'whitelisted' and 'blacklisted' (with 'ed'), not 'whitelist'/'blacklist'.","severity":"gotcha","affected_versions":">=3.0.0"},{"fix":"Clone and run the prerender server locally, then set PRERENDER_SERVICE_URL environment variable to point to it.","message":"Local development requires running a local prerender server (https://github.com/prerender/prerender) because the cloud service cannot access localhost.","severity":"gotcha","affected_versions":">=3.0.0"},{"fix":"Use .set('prerenderToken', 'YOUR_TOKEN')","message":"The 'set' method with 'prerenderToken' is the only supported way to configure the token; old methods like 'setPrerenderToken' are removed.","severity":"deprecated","affected_versions":">=3.0.0 <4.0.0"},{"fix":"Use prerender.crawlerUserAgent('MyCrawler') to add custom user agents.","message":"The default user agent list may not cover all crawlers; custom crawlers can be added via .crawlerUserAgent() method.","severity":"gotcha","affected_versions":">=3.0.0"}],"env_vars":null,"last_verified":"2026-04-25T00:00:00.000Z","next_check":"2026-07-24T00:00:00.000Z","problems":[{"fix":"Run 'npm install prerender-node --save' to install the package.","cause":"Package not installed or missing from package.json.","error":"Cannot find module 'prerender-node'"},{"fix":"Set your token via .set('prerenderToken', 'YOUR_TOKEN') or set the PRERENDER_TOKEN environment variable.","cause":"You did not set a prerenderToken, so the middleware falls back to the free public service (limited).","error":"prerender-node: no token set, using default (free) service"},{"fix":"Ensure beforeRender returns a string (e.g., cache key) or a Promise resolving to a string.","cause":"The beforeRender callback returned something other than a string or Promise<string>.","error":"prerender-node: beforeRender must return a string or a promise that resolves to a string"}],"ecosystem":"npm","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}