Angular 2:
un framework pour les gouverner tous

Dev front-end @ Holimetrix
21 et 22 Avril 2016
Petite intro et rappels
Angular 1: rappel
-
Framework (M)VC
-
Html amélioré & data binding
-
Composants réutilisables attachant un comportement au DOM (directives)
-
Injection de dépendances (DI)
-
Testable
- Firefox 3.0.15, Chrome 4, IE8
- iPhone 4 & Android 2.0
- 1ière installation de fibre optique en France
- jQuery 1.4
En 2010

08/12/2011
07/03/2013
13/10/2010
20/10/2010


- Très rapide
- Moins compliqué
- Encore plus complet
- Extrêmement modulaire: extensible
- Web components
- Multi-plateformes
Ambitions pour Angular 2
Angular 2: multi platformes

Web
Mobile web
Mobile natif
Android
iOS
Windows
Desktop
Windows Mac Linux
Une seule code base pour tous !
ES5
ES2015
Typescript
- classes
- modules
- types
- annotations
Typescript
- JS++ (le JS est compatible Typescript)
- Types
- Annotations
- Approche objet complète: Interfaces, classes abstraites, namespaces...
- Outils
Angular 2: Un effort communautaire








Un nouveau framework ...
- Même équipe de développement
- Mêmes buts & philosophie:
- faire avancer le web
- simplifier la vie des développeurs
- Upgrade Angular 1 vers 2 possible
... dans la continuité

CLI
Intellisense
Debug
Mobile
Components
Prerender
Change
Render
Compile
Zones
Dependency Injection
Animate
Router
i18n
ngUpgrade
ngForward
Angular 2
Angular 2: performance
Rerender
Permanent
Render
Ultrafast
change
detection
View
pool
Code
generation
2.5x
+ rapide que ng1
4.2x
+ rapide que ng1
5x
+ rapide que ng1
Web workers
2x plus rapide & non bloquant pour l'ui
Approche modulaire
Un module est un block de code cohérent dédié à un but spécifique.
Un module exporte du code utilisable par un autre module, généralement une classe.
Approche modulaire
export class AppComponent { }
import {AppComponent} from './app.component';
4 types de modules
- Services = simples classes
-
Directives = modification d'un élément du DOM
- Components = directive + template
- Pipes = transformateurs de données
export class MyService {
constructor(service: OtherService) {
// configuration
}
someFct() {
// ...
}
}
Services
En gros, c'est une fonction
Components
import {Component} from 'angular2/core';
@Component({
// configuration
})
export class Application {
/* ... */
}
Components
import {Component} from 'angular2/core';
import {Header} from './components/header/header';
import {Api} from './services/api';
@Component({
selector: 'mix-it'
template: `<header></header>`,
directives: [ Header ],
providers: [ Api ],
styles: `:host{ text-align: center; }`
})
export class MixIt {
constructor(api: Api) { /* ... */ }
}
<!-- index.html -->
<mix-it>
Your application is loading...
</mix-it>
<!-- index.html -->
<mix-it>
<header></header>
</mix-it>
Templates: syntaxe
<!-- properties binding -->
<input [value]="firstName">
<div [class.extraSparkle]="isDelightful">
<div [style.width]="mySize">
<label [attr.for]="someName"></label>
<!-- event binding -->
<button (click)="readRainbow($event)">
<!-- two way binding -->
<my-cmp [(title)]="name">
<!-- template directives -->
<section *ngIf="showSection">
<li *ngFor="#item of list">
Pipes
@Pipe({
name: 'lowercase'
})
export class Lowercase {
transform(v: string, args: any[]) {
return v.toLowerCase();
}
}
Injection de dépendances
C'est un pattern de développement dans lequel une classe reçoit ses dépendances de sources externes au lieu de les créer elle même
Injection de dépendances
- Instanciation automatique ou manuelle
-
bootstrap & providers
-
bootstrap & providers
- Configuration
- Testabilité
Zone.js
Détection des changements
- Monkey-patch des fonctions asynchrones
- Exécute du code avant et après
- Testing
- Timing
- Gestion des erreurs
- En passe de devenir un standard (Ecma TC39)
Performance
Détection des changements
- Très rapide (code optimisé pour VM): 10x plus rapide qu'angular 1
- Possible d'exécuter du code en dehors des zones
- Optimisable avec
- du code immutable
- différentes stratégies de détection (ex: OnPush)
Programmation réactive
- Utilisation asynchrone de flux de données
- Observables & Subjects de RxJS (EventEmitter)
- Meilleur ami de l'immutabilité
- Tout est stream
Renderers
- L'un des plus importants ajouts d'Angular 2
- Remplaçable selon l'environnement
- Précompilation (taille de l'app + temps de bootstrap)
- De multiples possibilités:
- web workers: réactivité de l'interface
- server rendering: vitesse de chargement initial
- native & desktop apps (electron, react native, nativescript, ...)
Et les mauvais côtés ?!
Inconvénients
- Setup de projet fastidieux
- Encore en bêta
- Framework complet
- Coupure assez franche avec Angular 1
Angular 1
Vers
Angular 2
Migration
- 3 questions à se poser:
- Ai-je besoin de migrer ?
- Vaut-il mieux réécrire de 0 ou migrer le code?
- Si nouvelle application: quelle est la durée de maintenance?
-
Angular 2 est une réécriture complète
- Quelques possibilités pour faciliter la migration
Préparation
- Suivre le style guide d'Angular
- Adopter une approche composants
- Utiliser TypeScript
- Utiliser un module loader
- Utiliser un adapteur:
- ngForward
- ngUpgrade
ngForward
- Ecrire du code en Angular 2 qui tourne sous Angular 1
- Migration petit à petit
- Permet d'attendre une version stable d'Angular 2 tout en limitant la dette technique
- Taille raisonnable (~100ko)
ngUpgrade
- Faire coexister une app Angular 1 et une app Angular 2
- Migration petit à petit
- Permet de bénéficier du gain de performance d'Angular 2 sur certaines parties du code
- Nécessite de charger Angular 1 et 2 à la fois
- Aucun dette technique
- Officiellement supporté
Et la date de release alors ?
Quelques Liens
-
Awesome Angular 2 - Angular Class
-
Angular 2 style guide - Minko Gechev
-
The introduction to Reactive Programming you've been missing - André Staltz
-
Getting started with Angular 2 @ Devfest - Wassim Chegham
-
Change detection explained @ NG-NL - Pascal Precht
-
Creating Cross-Platform Apps with Angular 2 @ Microsoft Build - Brad Green
-
Angular 2 and the future of HTML5 apps @ Fluent conf - Brad Green
MERCI !

Angular 2: un framework pour les gouverner tous
By Olivier Combe
Angular 2: un framework pour les gouverner tous
Après une longue période de développement, Angular 2 s'apprête enfin à faire son entrée dans la cour des grands. Découvrez le framework qui vous fera oublier React et vous donnera envie d'écrire des classes. Venez découvrir pourquoi Angular 2 sera le gros challenger de 2016.
- 4,588