3. 3
Client légers :
● HTML/CSS/Js ne gèrent pas les widgets, la page est la brique
de base
Petite histoire
4. 4
GWT utilise le paradigme de développement du client lourd
● Widgets, propriétés, événements
Petite histoire
5. 5
On est en 2016, on fait des Single Page App
C’est plus riche mais les faire sans widgets, c’est risqué!
● GWT
● React
● AngularJS 1 et 2
● Backbone
● Meteor
● ...
Petite histoire
6. 6
Rappel sur la forge Javascript
Javascript Java
Gestion de dépendance
Construction / packaging
Scaffolding
7. 7
Imaginons le bouton Google +
Les Web Components
<!-- Place this tag where you want the +1 button to render. -->
<div class="g-plusone" data-annotation="inline" data-width="300"></div>
<!-- Place this tag after the last +1 button tag. -->
<script type="text/javascript">
(function() {
var po = document.createElement('script');
po.type = 'text/javascript';
po.async = true;
po.src = 'https://apis.google.com/js/plusone.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(po, s);
})();
</script>
8. 8
Ce serai plus sympa de taper :
<g:plusone></g:plusone>
Les Web Components
9. 9
en fait c’est déjà possible :
<script type="text/javascript" src="https://apis.google.com/js/plusone.js"
></script>
<g:plusone></g:plusone>
Google a créé une “directive” avec javascript pour émuler un
composant
● Approche du type AngularJS
● Respecte l’esprit des futurs standards
● Marche avec les navigateurs actuels … non standards
Les Web Components
10. 10
Avec la plupart des frameworks JS d’aujourd’hui, on peut déjà
créer ces composants
Le W3C essayer de standardiser cette approche
● support natif dans les navigateurs
● permettant la ré-utilisabilité
● mettra des années (décennies) à accoucher (cf HTML5)
Les Web Components
11. 11
Les 3 principes du Web Component :
● Template
● canevas de mise en page
● aujourd’hui on utilise des balises non interprétées
● Shadow DOM
● le navigateur masque le sous-arbre du DOM
● déjà utilisé aujourd’hui par les navigateurs pour leurs besoins
internes
● Custom elements
● widget réutilisable associant template et comportement
● balise HTML custom et héritage
● Imports : <link rel="import" href="goodies.html">
Les Web Components
14. 14
J’ai lu dans 01Informatique
ou Marie-Claire, je ne sais plus,
que le HTML6 serait du
Web Component.
Super, mais comment qu’on fait du
Web Component aujourd’hui avant
tout le monde?
Polymer
15. 15
Un projet Google
● Présenté au Google I/O de 2013
● Nouveau framework Web
● bon hein, comme toutes les semaines il y en a un autre…
● Construit dans l’esprit Web Component
Polymer
17. 17
Principes
● Tout est composant
● Pragmatisme extrême
● Boilerplate c’est le mal
● Tout ce qui est dupliqué doit être refactoré sous forme de
composant
– soit géré par Polymer
– soit ajouté au navigateur
● Modulaire
● On ne charge que ce qu’on a besoin :
– tu veux du plolyfill ? importe polymer-all/platform/platform.js
– tu veux faire de l’Ajax? importe PolymerElements/iron-ajax
– tu veux faire du material-design, importe
PolymerElements/paper-elements
Polymer
18. 18
●
Bon, ok, AngularJS 1.x c’est super cool
●
Transpilable de ES6 -> ES5
●
Angular2 apporte TypeScript -> Transpilation !
●
on peut toujours faire du JS
<!doctype html>
<html>
<head>
<title>Directive Test</title>
<script type="text/javascript" src="jquery.min.js"
></script>
<script type="text/javascript"
src="angular.min.js"></script>
<script type="text/javascript"
src="mydirectives.js"></script>
</head>
<body ng-app>
<div test-elem></div>
</body>
</html>
Et AngularJS ?
19. 19
● Librairies JS lourdes
● Dépendance JQuery
● quoique ce n’est pas tout
à fait vrai ;)
● Assez verbeux
● Angular 1 en fin de vie
● TypeScript : un langage
fortement typé traduit en
javascript?
● pas sur que la
communauté l’adopte
Et AngularJS ?
import {Component} from 'angular2/core';
import {Todo} from './todo';
import {TodoList} from './todo_list';
import {TodoForm} from './todo_form';
@Component({
selector: 'todo-app',
template: `
<h2>Todo</h2>
<span>{{remaining}} of {{todos.length}} remaining</span>
[ <a (click)="archive()">archive</a> ]
<todo-list [todos]="todos"></todo-list>
<todo-form (newTask)="addTask($event)"></todo-form>`,
styles:['a { cursor: pointer; cursor: hand; }'],
directives: [TodoList, TodoForm]
})
import {Component} from 'angular2/core';
import {Todo} from './todo';
import {TodoList} from './todo_list';
import {TodoForm} from './todo_form';
@Component({
selector: 'todo-app',
template: `
<h2>Todo</h2>
<span>{{remaining}} of {{todos.length}} remaining</span>
[ <a (click)="archive()">archive</a> ]
<todo-list [todos]="todos"></todo-list>
<todo-form (newTask)="addTask($event)"></todo-form>`,
styles:['a { cursor: pointer; cursor: hand; }'],
directives: [TodoList, TodoForm]
})
26. 26
Feature Polymer Angular
Templates x x
Web Components x
Material Components x
Data Binding x x
Filters x x
Animations x x
Events Handling x x
Touch and Gestures x
Routing librairie tierce x
AJAX / REST x x
Comparaison avec Angular
37. 37
1 ligne 2 ligne 3 ligne 4 ligne
0
2
4
6
8
10
12
1 colonne
2 colonne
3 colonne
« Si vous avez compris ce que je viens
de vous dire, c’est que je me suis
probablement mal exprimé »
A. Greenspan