Pre-renders your web app into static HTML based on your specified routes enabling SEO for single page applications.
NOTE:
prep
is now based on Chromeless. We'll shortly release an updated version.
Features
- 🔎 Makes your single page app SEO friendly
- 🚀 Improves loading speed up to 400x
- ✨ Incredibly flexible and easy to use
- 📦 Works out-of-the-box with any framework (React, Angular, Backbone...). No code-changes needed.
Install
npm install -g prep
Usage
Just run prep
in your terminal or add it to the scripts
as part of your build step in your package.json
. If you don't provide a target-dir
the contents of the source-dir
will be overwritten.
Usage: prep [options] <source-dir> [target-dir] Options: -h, --help output usage information -c, --config [path] Config file -p, --port [port] Phantom server port
In order to configure the routes which you'd like to pre-render you need to specifiy them in a Javascript config file with the following schema. If you don't provide a config file, prep
will just pre-render the /
route.
const defaultConfig = routes: '/' timeout: 1000 dimensions: width: 1440 height: 900 https: false hostname: 'http://localhost' useragent: 'Prep' minify: false concurrency: 4 additionalSitemapUrls:
routes
specifies the list of routes that the renderer should pass. (Default:['/']
)timeout
is the timeout for how long the renderer should wait for network requests. (Default:1000
)dimensions
the page dimensions in pixels that the renderer should use to render the site. (Default:1440
x900
)https
prep uses https if true otherwise httphostname
is used to show the correct urls in the generated sitemap that is stored in[target-dir]/sitemap.xml
useragent
is set anavigator.userAgent
minify
is a boolean or a html-minifier configuration object.concurrency
controls how many routes are pre-rendered in parallel. (Default:4
)additionalSitemapUrls
is a list of URLs to include as well to the generatedsitemap.xml
. (Default:[]
)
prep.js
Example There are three different ways to configure prep
. Which one you pick depends on your use case.
1. Javascript Object
The probably easiest way is to export a simple Javascript object.
exportsdefault = routes: '/' '/world'
2. Synchronous Function
You can also return a function that returns the config for prep
.
exports { return routes: '/' '/world' }
3. Asynchronous Function (Promise)
Furthermore you can also return a Promise
or use ES7 features such as async
& await
(Babel pre-compile step needed).
{ const routes = await return routes }
How it works
The concept behind prep
is very simple. prep
starts a temporary local webserver and opens your provided routes via PhantomJS. Each route will be exported as a static HTML file. The resulting folder structure is the same as the structure of your routes.
Known Issues
- If you want to use
Object.assign()
in your code, please add a polyfill like phantomjs-polyfill-object-assign, because prep uses PhantomJS, which doesn't supportObject.assign()
yet.
Join our Slack community if you run into issues or have questions. We love talking to you!