How to make an Angular 6 material design cdk & pwa app
Step 1: Get excited about new shiny things
By reading this:
https://blog.angular.io/version-6-of-angular-now-available-cc56b0efa7a4
If you need help setting up an ssl certificate, read our guide How to set-up .app domains with ssl and apache.
This guide goes over how to build & deploy an Angular 6 app using material design and pw.
So, lets build something mildly useful!
This is where we're headed:
1. Make sure you're up to date
Things quickly fall apart if you're not up to date with npm and/or node.
So update npm to the latest version:
npm install -g npm@latest
Now update node to the latest version.
We use node version manager (nvm) so you might want to install nvm first then switch to the latest version of node (which is currently 8.11.2
).
nvm install v8.11.2 #Install & switch to latest node
Now it's much 'safer' to install Angular's command line tool (called ng
):
npm install -g @angular/cli
2. Create your Angular 6 app using ng
Create your new app using ng new <your-app-name>
. We've called ours tnetennba. These steps closley follow Angular's materialgetting started guide (but this has more detail).
Heads up! The ng tool creates your entire project for you, so navigate to the directory where you want your app to be. The
ng
tool will create a project directory for you, using the name of the app you give it.For this reason, you don't need to run
node init
(or yarn init for that matter) like you're used to.ng
is sits above these tools. Welcome to the dizzying stacks of frontend development.
Create a new Angular 6 app in a directory called "tnetennba":
ng new tnetennba
cd tnetennba # Go into your project directory!
Add Angular material & Angular cdk packages:
From your project directory:
npm install --save @angular/material @angular/cdk
Add animations
npm install --save @angular/animations
Now you must import the BrowserAnimationsModule
into your app
If you don't import BrowserAnimationsModule
you'll get the (very helpful) error message: Found the synthetic listener @transform.start. Please include either "BrowserAnimationsModule" or "NoopAnimationsModule" in your application.
To import theBrowserAnimationsModule module, add it to your src/app/app.module.ts
file:
Complete app.module.ts
example with BrowserAnimationsModule
included:
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { MainNavComponent } from './main-nav/main-nav.component';
import { LayoutModule } from '@angular/cdk/layout';
import { MatToolbarModule, MatButtonModule, MatSidenavModule, MatIconModule, MatListModule } from '@angular/material';
@NgModule({
declarations: [
AppComponent,
MainNavComponent
],
imports: [
BrowserModule,
LayoutModule,
MatToolbarModule,
MatButtonModule,
MatSidenavModule,
MatIconModule,
MatListModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
Include a default Material design theme angular
Add the following to your styles.css file:
@import "~@angular/material/prebuilt-themes/indigo-pink.css";
Add gesture support (useing hammerjs)
npm install --save hammerjs
Include font icons
This is why Angular material design hamburger icon is not working on first install of Angular/material design.
To your index.html <head>
section:
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
Add Angular Material Navigation Bar
ng generate @angular/material:material-nav --name=main-nav
Note the additiona of the --name=main-nav
, a lot of docs miss this out. It sets the name if your component. We've called it main-nav
. This creates a new compnent which you can include in your src/app/app.component.html
file.
Remove everything from your src/app/app.component.html
file (it's just demo content), and replace is with just your new navigation menu:
src/app/app.component.html:
<!-- main-nav is your Material navigation bar -->
<main-nav>
</main-nav>
View your app (good luck) by running ng serve -o
:
You'll get somthing that looks exactly like this!
The first thing you'll likley want to do is change Angular's material navigation title. To do this, edit your src/app/main-nav/main-nav.component.html
and edit the menu title. This helps you to get a feel for the structure of angular apps. Every component is usually contained in its own folder (see Angular's official tour of heros tutorial for a complete walkthrough Angular.
Seccondly, by default Angulars material design nav bar won't close (toggle off) when you re-tap the menu item. It does if you hit the right hand side of the menu. For some this is unintuative and annoying. To make the Angular nav bar toggle edit your src/app/main-nav/main-nav.component.html
file and add toggle:
Before:
<mat-toolbar color="primary">Menu</mat-toolbar>
After:
<mat-toolbar color="primary" (click)="drawer.toggle()">Menu</mat-toolbar>
We also added the toggle to the app name span tag for larger desktop screens:
<span (click)="drawer.toggle()">Tnetennba</span>
Add an angular material design table element
Lets make this app midly useful with a table of information.
Add angular's material:material-table package:
ng generate @angular/material:material-table --name="tnetennba-table"
Remember to pass
name="name-of-your-table"
to give your table component a useful name
Now add the new component to your src/app/app.component.html
file. We now have:
src/app/app.component.html
<main-nav></main-nav>
<tnetennba-table></tnetennba-table>
Which looks so:
How to deploy angular 6 and optimise!
Turn your angular 6 app into a progressive web app (pwa) to make it super speedy! Progressove web apps are an awesome way to get faster apps, be more user frieldly and ultimatly more conversions! Be useful, don't be mean.
Add a caching service worker (pwa) to your angular app:
ng add @angular/pw
That's it! The above will (in production builds) add a service worker to your builds, which will cause your app to be loaded from local caches wherever possible. To understand what's going on with progressive web apps, I suggest reading Mozilla's guides on progressive web apps. The reason I sugest Mozilla docs is that it's too easy to think this is a Google 'technology' whereas infact it's simply an application of standards which browser vendors have been collaborating on for many years.
Angular 6 production build with service wroker and pwa
Finally! To build your app with:
ng build --prod --build-optimizer
The --prod --build-optimizer
flags will minify, remove dead code and all sorts of angular deployment build optmisations.
After running ng build
, you'll have a complete copy of your app in the /dist
folder of your project. Copy the contents up to your webserver!
Copy your app up to production!*
scp -r dist/tnetennba username@yourwebsite.app:/var/www/yourwebsite.app/
A midly useful angular 6 app using material design components and the provided pwa: https://tnetennba.app
* You might want to use a git hook to atuomatically trigger a scp copy of your files after every commit. Find out more about git hooks, and more generally, build tools such as Jenkins, deploying on container ecosystems.