dot.js le templating à la vitesse de la lumière
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/2013TRANSCRIPT
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
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);
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' } }, … ]}
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
Un beau jour…
2023-04-12 Templating JavaScript - doT.js 5
Good news everyone !Le JSON a changé !
En voyant le JavaScript
2023-04-12 Templating JavaScript - doT.js 6
5 minutes plus tard !
2023-04-12 Templating JavaScript - doT.js 7
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}}
Qu'en pense notre développeur ?
2023-04-12 Templating JavaScript - doT.js 9
Plus maintenable
Plus simple
Début de MVC
J'approuve !
Où mettre ses templates ?
2023-04-12 Templating JavaScript - doT.js 10
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
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
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
Les librairies
Mustache vs Handlebars vs doT vs the world
2023-04-12 Templating JavaScript - doT.js 14
Mustache.js
2023-04-12 Templating JavaScript - doT.js 15
http://mustache.github.com/
Multi-langage
Très répandu
Bien documenté
Lent
Syntaxe
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}}
handlebars.js
2023-04-12 Templating JavaScript - doT.js 17
http://handlebarsjs.com/
Syntaxe
Assez répandu
Très bien documenté
Compatible Mustache
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}}
2023-04-12 Templating JavaScript - doT.js 19
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
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> {{?}}{{~}}
Un peu de contexte
2023-04-12 Templating JavaScript - doT.js 22
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é
Benchmarkons
Création d'une liste de 100 éléments
2023-04-12 Templating JavaScript - doT.js 24
Rapide
2023-04-12 Templating JavaScript - doT.js 25
Rapide
2023-04-12 Templating JavaScript - doT.js 26
doT.js
Rapide
2023-04-12 Templating JavaScript - doT.js 27
Concaténation
Rapide
2023-04-12 Templating JavaScript - doT.js 28
Array.join
Rapide
2023-04-12 Templating JavaScript - doT.js 29
JQuote2
Rapide
2023-04-12 Templating JavaScript - doT.js 30
Handlebars
Rapide
2023-04-12 Templating JavaScript - doT.js 31
kite.js
Rapide
2023-04-12 Templating JavaScript - doT.js 32
Mustache
Rapide
2023-04-12 Templating JavaScript - doT.js 33
underscore
Rapide sur mobile
2023-04-12 Templating JavaScript - doT.js 34
Pour vérifier par vous même
http://jsperf.com/test-perf-templating/7
2023-04-12 Templating JavaScript - doT.js 35
L'intégration
2023-04-12 Templating JavaScript - doT.js 36
<script type="text/javascript" src="doT.js"></script>
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
La pré-compilation
function anonymous(it) { var out = '<div>' + (it.txt) + '</div>'; return out; }
2023-04-12 Templating JavaScript - doT.js 38
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>
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
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
Conditions
2023-04-12 Templating JavaScript - doT.js 42
{{? it.address.country == 'france'}} Cocorico! {{?? it.address.country != ''}} {{=it.address.country}} {{??}} Pays Inconnu {{?}}
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
Itérations
{{~ it.users:user}} <div> Hello {{= user.lastname}} {{= user.firstname}} </div>{{~}}
2023-04-12 Templating JavaScript - doT.js 44
Itérations
{{~ it.users:user:index}} <div> Hello {{= user.lastname}} {{= user.firstname}} </div>{{~}}
2023-04-12 Templating JavaScript - doT.js 45
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
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
Encoder le HTMLfunction encodeHTML() { var encodeHTMLRules = { "&": "&", "<": "<", ">": ">", '"': '"', "'": ''', "/": '/' }, 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
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
Appel de fonctions
function anonymous(it) { var out = '<div>' + (formatDate(it.creationDate) ) + '</div>'; return out;}
2023-04-12 Templating JavaScript - doT.js 50
Javascript dans les templates
<div> {{var toto = 'hello';}} {{toto += item.maValeur;}} <span>{{=toto}}</span></div>
2023-04-12 Templating JavaScript - doT.js 51
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
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
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
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
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
}
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
En conclusion
2023-04-12 Templating JavaScript - doT.js 58
Le templating c'est bon mangez-en !
Bien choisir son vaisseau
2023-04-12 Templating JavaScript - doT.js 59
Merci
Des questions ?
2023-04-12 Templating JavaScript - doT.js 60