Pre-rendering a Single Page Application does not only give the user performance benefits but also allows search engines to successfully crawl your site. This is pretty important for clients who take SEO seriously! Currently, Angular Universal gives you two options, pre-rendering and re-rendering. It has been my experience that using anything but CSS causes issues with Angular Universal. So I’ve had to come up with other solutions. One such solution is to eject the Angular CLI and add a pre-render plugin to your webpack config.

Eject!

You can eject your project by running ng-eject and 🎉 you have an ejected project with a Webpack configuration file at your disposal. It’s really as simple as that! The Angular CLI takes care of changing the npm scripts, but if you have custom npm scripts, you might have to do some editing.

Install the Pre-Render Plugin

You’ll now need to install the pre-render spa Webpack plugin.

yarn add prerender-spa-plugin

Update the Webpack Config

Open up the webpack.config.js and add the following:

const Prerender = require('prerender-spa-plugin');

.
.
.
"plugins": [
  .
  .
  new Prerender(
    path.resolve(__dirname, 'dist'),
    ['/', '/about', '/contact']
  )
]

Now you can run yarn build or webpack and your dist directory will contain the pre-rendered version of your site. Once the application bootstraps, it will run like an SPA. You can test this by starting up a local server http-server dist and viewing the URL with your JavaScript turned off. You should see your app, at least most of it, depending on how much JavaScript you require to display your page.

One of the downsides, apart from ejecting your project, is that you don’t have a way to record user events while the app is loading. This solution is more for apps that have some static pages. I wouldn’t use this approach for login screens or dashboards, obviously.