Swiftorial Logo
Home
Swift Lessons
Matchups
CodeSnaps
Tutorials
Career
Resources

Angular Universal

Angular Universal is a technology that allows you to perform server-side rendering (SSR) of your Angular applications. This guide covers the basics of setting up and using Angular Universal to enhance the performance and SEO of your Angular applications.

Setting Up Angular Universal

First, ensure that your Angular application is set up to use Angular Universal by adding the necessary dependencies:

ng add @nguniversal/express-engine

Configuring Angular Universal

After adding Angular Universal, update your application to use the Express engine for SSR:

// server.ts
import 'zone.js/dist/zone-node';
import { ngExpressEngine } from '@nguniversal/express-engine';
import * as express from 'express';
import { join } from 'path';

import { AppServerModule } from './src/main.server';
import { APP_BASE_HREF } from '@angular/common';
import { existsSync } from 'fs';

const app = express();

const distFolder = join(process.cwd(), 'dist/browser');
const indexHtml = existsSync(join(distFolder, 'index.original.html')) ? 'index.original.html' : 'index';

app.engine('html', ngExpressEngine({
  bootstrap: AppServerModule,
}));

app.set('view engine', 'html');
app.set('views', distFolder);

app.get('*.*', express.static(distFolder, {
  maxAge: '1y'
}));

app.get('*', (req, res) => {
  res.render(indexHtml, { req, providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }] });
});

const port = process.env.PORT || 4000;
app.listen(port, () => {
  console.log(`Node Express server listening on http://localhost:${port}`);
});

Updating Angular Configuration

Update the angular.json file to include server and browser configurations:

// angular.json
{
  ...
  "projects": {
    "app": {
      ...
      "architect": {
        "build": {
          ...
        },
        "serve": {
          ...
        },
        "server": {
          "builder": "@angular-devkit/build-angular:server",
          "options": {
            "outputPath": "dist/server",
            "main": "src/main.server.ts",
            "tsConfig": "tsconfig.server.json"
          }
        },
        "prerender": {
          "builder": "@nguniversal/builders:prerender",
          "options": {
            "browserTarget": "app:build:production",
            "serverTarget": "app:server:production",
            "routes": ["/"]
          }
        }
      }
    }
  }
}

Creating Server Module

Create a server module to handle the server-side rendering:

// app.server.module.ts
import { NgModule } from '@angular/core';
import { ServerModule } from '@angular/platform-server';

import { AppModule } from './app.module';
import { AppComponent } from './app.component';

@NgModule({
  imports: [
    AppModule,
    ServerModule,
  ],
  bootstrap: [AppComponent],
})
export class AppServerModule {}

Modifying Main Server Entry Point

Modify the main server entry point to bootstrap the server module:

// main.server.ts
import { enableProdMode } from '@angular/core';
import { environment } from './environments/environment';

if (environment.production) {
  enableProdMode();
}

export { AppServerModule } from './app/app.server.module';

Running the Application

Build and run the Angular Universal application using the following commands:

ng build --prod
ng run app:server
node dist/server

Key Points

  • Angular Universal allows you to perform server-side rendering (SSR) of your Angular applications.
  • Use the @nguniversal/express-engine package to add Angular Universal to your application.
  • Configure the Express engine for SSR in your server.ts file.
  • Update the angular.json file to include server and browser configurations.
  • Create a server module to handle server-side rendering.
  • Modify the main server entry point to bootstrap the server module.
  • Build and run the Angular Universal application using the appropriate commands.

Conclusion

Angular Universal enhances the performance and SEO of your Angular applications by enabling server-side rendering. By setting up Angular Universal, configuring the Express engine, and running your application, you can provide a better user experience and improve search engine visibility. Happy coding!