#DevoxxFR
Getting Started with
Matt Raible • @mraible
Blogger on raibledesigns.com
Java Champion and Web Developer
Father, Skier, Mountain
Biker, Whitewater Rafter
Open Source Connoisseur
Who is Matt Raible?
Bus Lover
Okta Developer Advocate
#DevoxxFR
Authentication Standards
My Angular Journey
#DevoxxFR
Jobs on LinkedIn (US)
April 2017
0
2,000
4,000
6,000
8,000
Backbone AngularJS Ember Knockout React Vue
#DevoxxFR
Jobs on LinkedIn (US)
April 2017
0
3,500
7,000
10,500
14,000
Backbone Angular Ember Knockout React Vue
#DevoxxFR
Stack Overflow Tags
April 2017
0
75,000
150,000
225,000
300,000
Backbone Angular Knockout Ember React
#DevoxxFR
People with ember.js on LinkedIn - huh?
#DevoxxFR
Google Trends - Angular
#DevoxxFR
Google Trends - Angular 2
#DevoxxFR
Google Trends - Angular 4
Who wants to learn ?
#DevoxxFR
Hello World with AngularJS
<!doctype html>
<html ng-app>
<head>
<title>Hello World</title>
</head>
<body>
<div>
<label>Name:</label>
<input type="text" ng-model="name" placeholder="Enter a name here">
<hr>
<h1>Hello {{name}}!</h1>
</div>
<script src="http://code.angularjs.org/1.5.8/angular.min.js"></script>
</body>
</html>
#DevoxxFR
Hello World with Angular
<!DOCTYPE html>
<html>
<head>
<title>Angular QuickStart</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="styles.css">
<!-- Polyfill(s) for older browsers -->
<script src="node_modules/core-js/client/shim.min.js"></script>
<script src="node_modules/zone.js/dist/zone.js"></script>
<script src="node_modules/systemjs/dist/system.src.js"></script>
<script src="systemjs.config.js"></script>
<script>
System.import('app').catch(function(err){ console.error(err); });
</script>
</head>
<body>
<my-app>Loading AppComponent content here ...</my-app>
</body>
</html>
#DevoxxFR
app/main.ts
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';
platformBrowserDynamic().bootstrapModule(AppModule);
#DevoxxFR
app/app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
@NgModule({
imports: [ BrowserModule ],
declarations: [ AppComponent ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
#DevoxxFR
app/app.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
template: `<h1>Hello {{name}}</h1>`,
})
export class AppComponent { name = 'Angular'; }
#DevoxxFR
Angular 2+ Choices
Choose a language

JavaScript (ES6 or ES5)

TypeScript

Dart

Anything that transpiles to JS

Setup dev environment

Install Node

Choose Package Manager

Choose Module Loader

Choose Transpiler

Choose Build Tool
#DevoxxFR
ES6, ES7 and TypeScript
TSES7ES6ES5
ES5: es5.github.io 

ES6: git.io/es6features 

ES7: DRAFT

TS: www.typescriptlang.org
#DevoxxFR
TypeScript
$ npm install -g typescript

function greeter(person: string) {

return "Hello, " + person;

}



var user = "Jane User";



document.body.innerHTML = greeter(user);
$ tsc greeter.ts

https://www.typescriptlang.org/docs/tutorial.html
#DevoxxFR
bus.ts
#DevoxxFR
Easiest ways to get started
Angular QuickStart

https://github.com/angular/quickstart 

Angular Seed

https://github.com/mgechev/angular-seed 

Angular CLI

https://github.com/angular/angular-cli
#DevoxxFR
Angular Demo!
Start with angular-cli

Build Search Feature

Data via HTTP

Form Validation

CSS Frameworks
#DevoxxFR
Built-in Components
<div *ngIf="str == 'yes'"></div>
<div [ngSwitch]="myVar">
<div *ngSwitchWhen="'A'"></div>
</div>
<div [ngStyle]="{color: colorinput.value}"></div>
<div [ngClass]="{bordered: true}"></div>
<div *ngFor="let item of items;
let num = index"></div>
#DevoxxFR
The asterisk (*) effect
https://angular.io/docs/ts/latest/guide/structural-directives.html#!#asteris
<div *ngIf="hero">{{hero}}</div>
<div *ngFor="let hero of heroes">{{hero}}</div>
#DevoxxFR
The asterisk (*) effect
<!-- Examples (A) and (B) are the same -->
<!-- (A) *ngIf paragraph -->
<p *ngIf="condition">
Our heroes are true!
</p>
<!-- (B) [ngIf] with template -->
<template [ngIf]="condition">
<p>
Our heroes are true!
</p>
</template>
#DevoxxFR
Angular Forms
Template-Driven

import { FormsModule } from '@angular/forms';
Reactive Forms

import { ReactiveFormsModule } from '@angular/forms';
#DevoxxFR
Template-Driven Validation
<label for="name">Name</label>
<input type="text" class="form-control" id="name"
required
[(ngModel)]="model.name" name="name"
#name="ngModel" >
<div [hidden]="name.valid || name.pristine"
class="alert alert-danger">
Name is required
</div>
#DevoxxFR
Reactive Forms Validation
<form [formGroup]="heroForm" *ngIf="active" (ngSubmit)="onSubmit()">
<label for="name">Name</label>
<input type="text" id="name" class="form-control"
formControlName="name" required >
<div *ngIf="formErrors.name" class="alert alert-danger">
{{ formErrors.name }}
</div>
</form>
#DevoxxFR
Data Architectures
MVW / Two-way binding

Flux

Observables
#DevoxxFR
Observables and RxJS
Promises emit a single value whereas streams emit many values

Imperative code “pulls” data whereas reactive streams “push” data

RxJS is functional
Streams are composable
#DevoxxFR
Style Guides
John Papa’s Angular Style Guide

https://github.com/johnpapa/angular-styleguide 

Official Angular Style Guide

https://angular.io/styleguide
#DevoxxFR
Upgrading from AngularJS to Angular
Big Bang

Incremental

ngUpgrade import {UpgradeAdapter} from ‘@angular/upgrade';
var adapter = new UpgradeAdapter();
var app = angular.module('myApp', []);
adapter.bootstrap(document.body, ['myApp']);
#DevoxxFR
Cool Projects
Web Workers and Service Workers

Electron

ng-bootstrap

Angular Material

JHipster, baby!
#DevoxxFR
Lab: Create an Angular Project
Create a project

Run the application

Add a search feature

Add an edit feature

Add validation

http://bit.ly/ng-create
Testing Applications
#DevoxxFR
Quality
“A person who knows how to fix motorcycles—with Quality—is less
likely to run short of friends than one who doesn't. And they aren't
going to see him as some kind of object either. Quality destroys
objectivity every time.”

— Zen and the Art of Motorcycle Maintenance
#DevoxxFR
Software Testing
With motorcycles, you drive to test them.

With software, you can test it without driving it.

Or rather, you can automate the driving.

If you don’t automate tests, you’re still testing!
#DevoxxFR
Types of Tests
Unit Tests

End-to-End Tests
#DevoxxFR
Unit Test Example
#DevoxxFR
bus.spec.ts
#DevoxxFR
Live Coding!
Unit Tests

Integration Tests

Continuous Integration

Deployment

Continuous Deployment
#DevoxxFR
What you learned
How to…

Build an Angular application with modern tools

Unit test Angular services, mocking Http provider

Unit test Angular components, mocking service

Integration test an Angular application

Continuously test and deploy with a CI server
#DevoxxFR
Don’t be afraid of testing!
#DevoxxFR
Don’t be afraid of testing!
#DevoxxFR
Don’t be afraid of testing!
#DevoxxFR
Lab: Test an Angular Project
Unit testing

Integration testing

Continous Integration

Deploy to the ☁!
http://bit.ly/ng-test
#DevoxxFR
ng-book 2
A comprehensive guide to developing with
Angular 2

Sample apps: Reddit clone, Chat with RxJS
Observables, YouTube search-as-you-type,
Spotify Search

How to write components, use forms and APIs

Over 5,500+ lines of code!
#DevoxxFR
ng-book 2
A comprehensive guide to developing with
Angular 4

Worth all your hard earned $$$

https://www.ng-book.com/2

“Thank you for the awesome book, it's the bible
for Angular.” — Vijay Ganta
#DevoxxFR
Testing Angular Applications Book
Unit testing directives, pipes, services, and routes

End-to-end testing with elements and forms

5 of 10 chapters available

Estimated publication: Fall 2017

www.manning.com/books/testing-angular-applications
#DevoxxFR
Testing JavaScript Applications
#DevoxxFR
Who’s using Angular?
Made with AngularJS

https://www.madewithangular.com

Angular Expo

http://angularexpo.com

Awesome Angular

https://github.com/AngularClass/awesome-angular
#DevoxxFR
Angular Performance Checklist
Network performance

Bundling

Minification and Dead code
elimination

Ahead-of-Time (AoT) Compilation

Compression

Pre-fetching Resources

Lazy-Loading of Resources

Caching
https://github.com/mgechev/angular-performance-checklist
#DevoxxFR
Lab: Authentication with OpenID Connect
http://developer.okta.com

http://bit.ly/ng-okta 

youtube.com/watch?v=Kb56GzQ2pSk
#DevoxxFR
https://github.com/mraible/ng-demo

https://youtu.be/Jq3szz2KOOs
(Building)

https://youtu.be/TksyjxipM4M
(Testing)
Angular and Angular CLI Demos
#DevoxxFR
Shortcut to becoming an Angular Expert
JUST DO IT.
#DevoxxFR
Shortcut to becoming an Angular Expert
YOU DID IT!
#DevoxxFR
The JHipster Mini-Book
2.0 Release on Dec 5, 2016

jhipster-book.com

21-points.com 

@jhipster_book

Write your own InfoQ mini-book! github.com/mraible/infoq-mini-book
#DevoxxFR
Keep in touch!

raibledesigns.com

@mraible

Presentations

speakerdeck.com/mraible

Code

github.com/mraible
Questions?

The Ultimate Getting Started with Angular Workshop - Devoxx France 2017