dot.js le templating à la vitesse de la lumière

60
doT.js le templating à la vitesse de la lumière 2022-07-03 Templating JavaScript - doT.js 1 Mathieu PARISOT – Développeur Java @matparisot +Parisot Mathieu

Upload: soat

Post on 31-May-2015

1.621 views

Category:

Technology


3 download

DESCRIPTION

Et si on passait au templating en javascript ? Mathieu Parisot vous livre ses recettes avec les meilleurs frameworks disponibles. Conférence réalisée au ParisJS le 27/02/2013

TRANSCRIPT

Page 1: doT.js le templating à la vitesse de la lumière

doT.js le templating à la

vitesse de la lumière

2023-04-12 Templating JavaScript - doT.js 1

Mathieu PARISOT – Développeur Java

@matparisot

+Parisot Mathieu

Page 2: doT.js le templating à la vitesse de la lumière

Pourquoi ce talk ?test.js :$.ajax({ url: 'test.json', success: function(data) {

}}):

2023-04-12 Templating JavaScript - doT.js 2

test.json :{ name : 'world'}

var html = 'hello ' + data.name;$('#myElem').html(html);

Page 3: doT.js le templating à la vitesse de la lumière

Dans la vraie vie{ users: [ { lastname:'Parisot', firstname:'Mathieu', address:{ street:'4 rue secrète', zipcode:'75000', city:'Paris' } },2023-04-12 Templating JavaScript - doT.js 3

{ lastname:'Dupont', firstname:'Jean', address:{ street:'4 rue machin', zipcode:'75000', city:'Paris' } }, … ]}

Page 4: doT.js le templating à la vitesse de la lumière

Et donc on obtient…var html = '';for(var i=0;i<data.users.length;i++) { var user = data.users[i]; html += '<div>Hello <span>'; html += user.lastname + ' ' + user.firstname; html += '</span></div>'; if(user.address) { html + '<div>You live in :'; html += '<div>' + user.address.street + '</div>'; html += '<div>' + user.address.zipcode + ' ' + user.address.city + '</div>'; html + '</div>'; }}$('#myElem').insert(html);

2023-04-12 Templating JavaScript - doT.js 4

Page 5: doT.js le templating à la vitesse de la lumière

Un beau jour…

2023-04-12 Templating JavaScript - doT.js 5

Good news everyone !Le JSON a changé !

Page 6: doT.js le templating à la vitesse de la lumière

En voyant le JavaScript

2023-04-12 Templating JavaScript - doT.js 6

Page 7: doT.js le templating à la vitesse de la lumière

5 minutes plus tard !

2023-04-12 Templating JavaScript - doT.js 7

Page 8: doT.js le templating à la vitesse de la lumière

Et si on passait au templating ?

2023-04-12 Templating JavaScript - doT.js 8

{{#each users}} <div> Hello <span>{{lastname}} {{firstname}}</span> </div> {{#if address}} <div>You live in : <div>{{street}}</div><div>{{zipcode}} {{city}}</div> </div> {{/if}}{{/each}}

Page 9: doT.js le templating à la vitesse de la lumière

Qu'en pense notre développeur ?

2023-04-12 Templating JavaScript - doT.js 9

Plus maintenable

Plus simple

Début de MVC

J'approuve !

Page 10: doT.js le templating à la vitesse de la lumière

Où mettre ses templates ?

2023-04-12 Templating JavaScript - doT.js 10

Page 11: doT.js le templating à la vitesse de la lumière

Directement dans le JavaScript

var myTemplate = 'Hello {{name}}';…var result = applyTemplate(myTemplate, data);$('#myElem').html(result);

2023-04-12 Templating JavaScript - doT.js 11

Simple Pas maintenablePas réutilisable

Page 12: doT.js le templating à la vitesse de la lumière

Directement dans le html

<script type="text/template" id="tpl"> Hello {{name}}</script>var result = applyTemplate($('#tpl').text(), data);$('#myElem').html(result);

2023-04-12 Templating JavaScript - doT.js 12

Simple Pas réutilisable

Maintenable

Page 13: doT.js le templating à la vitesse de la lumière

Directement un fichier séparé

$.get('template.html', function(template){ var result = applyTemplate(template, data); $('#myElem').html(result);});

2023-04-12 Templating JavaScript - doT.js 13

Réutilisable

Maintenable Requête en plus

Asynchrone

Page 14: doT.js le templating à la vitesse de la lumière

Les librairies

Mustache vs Handlebars vs doT vs the world

2023-04-12 Templating JavaScript - doT.js 14

Page 15: doT.js le templating à la vitesse de la lumière

Mustache.js

2023-04-12 Templating JavaScript - doT.js 15

http://mustache.github.com/

Multi-langage

Très répandu

Bien documenté

Lent

Syntaxe

Page 16: doT.js le templating à la vitesse de la lumière

La syntaxe

2023-04-12 Templating JavaScript - doT.js 16

{{#users}} <div> Hello <span>{{lastname}} {{firstname}}</span> </div> {{#address}} <div>You live in : <div>{{street}}</div><div>{{zipcode}} {{city}}</div> </div> {{/address}}{{/users}}

Page 17: doT.js le templating à la vitesse de la lumière

handlebars.js

2023-04-12 Templating JavaScript - doT.js 17

http://handlebarsjs.com/

Syntaxe

Assez répandu

Très bien documenté

Compatible Mustache

Page 18: doT.js le templating à la vitesse de la lumière

La syntaxe

2023-04-12 Templating JavaScript - doT.js 18

{{#each users}} <div> Hello <span>{{lastname}} {{firstname}}</span> </div> {{#if address}} <div>You live in : <div>{{street}}</div><div>{{zipcode}} {{city}}</div> </div> {{/if}}{{/each}}

Page 19: doT.js le templating à la vitesse de la lumière

2023-04-12 Templating JavaScript - doT.js 19

Page 20: doT.js le templating à la vitesse de la lumière

doT.js

2023-04-12 Templating JavaScript - doT.js 20

http://olado.github.com/doT/

Simple

Peu répandu

Minimaliste

Concis et léger

Rapide

Page 21: doT.js le templating à la vitesse de la lumière

La syntaxe

2023-04-12 Templating JavaScript - doT.js 21

{{~ it.users:u}} <div> Hello <span>{{= u.lastname}} {{= u.firstname}}</span> </div> {{? address}} <div>You live in : <div>{{=street}}</div><div>{{=zipcode}} {{=city}}</div> </div> {{?}}{{~}}

Page 22: doT.js le templating à la vitesse de la lumière

Un peu de contexte

2023-04-12 Templating JavaScript - doT.js 22

Page 23: doT.js le templating à la vitesse de la lumière

Léger

530 lignes de code15ko non minifié

2023-04-12 Templating JavaScript - doT.js 23

2200 lignes de code75ko non minifié

120 lignes de code5.3ko non minifié

Page 24: doT.js le templating à la vitesse de la lumière

Benchmarkons

Création d'une liste de 100 éléments

2023-04-12 Templating JavaScript - doT.js 24

Page 25: doT.js le templating à la vitesse de la lumière

Rapide

2023-04-12 Templating JavaScript - doT.js 25

Page 26: doT.js le templating à la vitesse de la lumière

Rapide

2023-04-12 Templating JavaScript - doT.js 26

doT.js

Page 27: doT.js le templating à la vitesse de la lumière

Rapide

2023-04-12 Templating JavaScript - doT.js 27

Concaténation

Page 28: doT.js le templating à la vitesse de la lumière

Rapide

2023-04-12 Templating JavaScript - doT.js 28

Array.join

Page 29: doT.js le templating à la vitesse de la lumière

Rapide

2023-04-12 Templating JavaScript - doT.js 29

JQuote2

Page 30: doT.js le templating à la vitesse de la lumière

Rapide

2023-04-12 Templating JavaScript - doT.js 30

Handlebars

Page 31: doT.js le templating à la vitesse de la lumière

Rapide

2023-04-12 Templating JavaScript - doT.js 31

kite.js

Page 32: doT.js le templating à la vitesse de la lumière

Rapide

2023-04-12 Templating JavaScript - doT.js 32

Mustache

Page 33: doT.js le templating à la vitesse de la lumière

Rapide

2023-04-12 Templating JavaScript - doT.js 33

underscore

Page 34: doT.js le templating à la vitesse de la lumière

Rapide sur mobile

2023-04-12 Templating JavaScript - doT.js 34

Page 35: doT.js le templating à la vitesse de la lumière

Pour vérifier par vous même

http://jsperf.com/test-perf-templating/7

2023-04-12 Templating JavaScript - doT.js 35

Page 36: doT.js le templating à la vitesse de la lumière

L'intégration

2023-04-12 Templating JavaScript - doT.js 36

<script type="text/javascript" src="doT.js"></script>

Page 37: doT.js le templating à la vitesse de la lumière

Un exemple simple

var tplCompile = doT.template('<div>{{=it.txt}}</div>');

var result = tplCompile({txt:'hello world'});

<div>hello world</div>

2023-04-12 Templating JavaScript - doT.js 37

Page 38: doT.js le templating à la vitesse de la lumière

La pré-compilation

function anonymous(it) { var out = '<div>' + (it.txt) + '</div>'; return out; }

2023-04-12 Templating JavaScript - doT.js 38

Page 39: doT.js le templating à la vitesse de la lumière

L'objet it

function anonymous(it) { var out = '<div>' + (it.txt) + '</div>'; return out; }

tplCompile({txt:'hello world'});

2023-04-12 Templating JavaScript - doT.js 39

<div>{{=it.txt}}</div>

Page 40: doT.js le templating à la vitesse de la lumière

Objets complexes

<div> Hello <span>{{= it.name}}</span></div><div>You live in : <div>{{=it.address.street}}</div> <div>{{=it.address.city}}</div></div>

2023-04-12 Templating JavaScript - doT.js 40

Page 41: doT.js le templating à la vitesse de la lumière

Objets complexes

function anonymous(it) { var out = '<div>Hello <span>' + (it.name) + '</span></div><div>You live in : <div>' + (it.address.street) + '</div><div>' + (it.address.city) + '</div></div>'; return out; } 2023-04-12 Templating JavaScript - doT.js 41

Page 42: doT.js le templating à la vitesse de la lumière

Conditions

2023-04-12 Templating JavaScript - doT.js 42

{{? it.address.country == 'france'}} Cocorico! {{?? it.address.country != ''}} {{=it.address.country}} {{??}} Pays Inconnu {{?}}

Page 43: doT.js le templating à la vitesse de la lumière

Conditionsfunction anonymous(it) {

var out = '';

if(it.address.country == 'france') { out += 'Cocorico!'; } else if(it.address.country != ''){ out += (it.address.country); } else { out += 'Pays Inconnu'; } return out; } 2023-04-12 Templating JavaScript - doT.js 43

Page 44: doT.js le templating à la vitesse de la lumière

Itérations

{{~ it.users:user}} <div> Hello {{= user.lastname}} {{= user.firstname}} </div>{{~}}

2023-04-12 Templating JavaScript - doT.js 44

Page 45: doT.js le templating à la vitesse de la lumière

Itérations

{{~ it.users:user:index}} <div> Hello {{= user.lastname}} {{= user.firstname}} </div>{{~}}

2023-04-12 Templating JavaScript - doT.js 45

Page 46: doT.js le templating à la vitesse de la lumière

Itérationsfunction anonymous(it) { var out = ''; var arr1 = it.users; if (arr1) { var user, i1=-1, l1=arr1.length-1; while (i1<l1) { user = arr1[i1+=1]; out += '<div>Hello <span>' + (user.lastname) + ' ' + (user.firstname) + '</span></div>'; } } return out; } 2023-04-12 Templating JavaScript - doT.js 46

Page 47: doT.js le templating à la vitesse de la lumière

Encoder le HTML

<div>{{! it.code}}</div>

function anonymous(it) { var out = '<div>' + encodeHTML( it.code ) + '</div>'; return out; } 2023-04-12 Templating JavaScript - doT.js 47

Page 48: doT.js le templating à la vitesse de la lumière

Encoder le HTMLfunction encodeHTML() { var encodeHTMLRules = { "&": "&#38;", "<": "&#60;", ">": "&#62;", '"': '&#34;', "'": '&#39;', "/": '&#47;' }, matchHTML = /&(?!#?\w+;)|<|>|"|'|\//g; return function() { return this ? this.replace(matchHTML, function(m) { return encodeHTMLRules[m] || m; }) : this; };}2023-04-12 Templating JavaScript - doT.js 48

Page 49: doT.js le templating à la vitesse de la lumière

Appel de fonctions

function formatDate (date) { return date.getDay() + '/' + (date.getMonth()+1) + '/' + date.getYear();}

<div>{{= formatDate(it.creationDate) }}</div>

2023-04-12 Templating JavaScript - doT.js 49

Page 50: doT.js le templating à la vitesse de la lumière

Appel de fonctions

function anonymous(it) { var out = '<div>' + (formatDate(it.creationDate) ) + '</div>'; return out;}

2023-04-12 Templating JavaScript - doT.js 50

Page 51: doT.js le templating à la vitesse de la lumière

Javascript dans les templates

<div> {{var toto = 'hello';}} {{toto += item.maValeur;}} <span>{{=toto}}</span></div>

2023-04-12 Templating JavaScript - doT.js 51

Page 52: doT.js le templating à la vitesse de la lumière

Javascript dans les templates

function anonymous(it) { var out = '<div>'; var toto = 'hello'; toto += it.maValeur; out += '<span>' + (toto) + '</span></div>'; return out; }

2023-04-12 Templating JavaScript - doT.js 52

Page 53: doT.js le templating à la vitesse de la lumière

LogicLess vs LogicFull

⦿Templates plus simples

⦿Meilleurs séparation du code

⦿Moins de risque de code brouillon

2023-04-12 Templating JavaScript - doT.js 53

⦿Plus de liberté⦿Plus complexe

LogicLess LogicFull

Page 54: doT.js le templating à la vitesse de la lumière

Fragments

{{##def.snippet: <div>{{=it.name}}</div>{{#def.joke}}#}}{{#def.snippet}}

doT.template( template, { joke : "<div>{{=it.name}} who?</div>" });2023-04-12 Templating JavaScript - doT.js 54

Page 55: doT.js le templating à la vitesse de la lumière

Fragments

function anonymous(it) { var out = '<div>' + (it.name) + '</div><div>' + (it.name) + ' who?</div>'; return out; }

2023-04-12 Templating JavaScript - doT.js 55

Page 56: doT.js le templating à la vitesse de la lumière

La configuration

templateSettings: {evaluate: [regexp],interpolate: [regexp]encode: [regexp],use: [regexp],useParams: [regexp],define: [regexp],defineParams: [regexp],conditional: [regexp],iterate: [regexp],

2023-04-12 Templating JavaScript - doT.js 56

varname: 'it',strip: true,append: true,selfcontained: false

}

Page 57: doT.js le templating à la vitesse de la lumière

Pour allez plus loin

⦿http://olado.github.com/doT/index.html⦿https://github.com/olado/doT⦿Blog So@t : http://goo.gl/COclS

2023-04-12 Templating JavaScript - doT.js 57

Page 58: doT.js le templating à la vitesse de la lumière

En conclusion

2023-04-12 Templating JavaScript - doT.js 58

Le templating c'est bon mangez-en !

Page 59: doT.js le templating à la vitesse de la lumière

Bien choisir son vaisseau

2023-04-12 Templating JavaScript - doT.js 59

Page 60: doT.js le templating à la vitesse de la lumière

Merci

Des questions ?

2023-04-12 Templating JavaScript - doT.js 60