SlideShare a Scribd company logo
1 of 60
Mathieu PARISOT – Développeur Java
                         @matparisot
                       +Parisot Mathieu
2013-02-28               Templating JavaScript - doT.js   1
Pourquoi ce talk ?
test.js :                                                 test.json :
$.ajax({                                                  {
 url: 'test.json',                                          name : 'world'
 success: function(data) {                                }
    var html = 'hello ' + data.name;
    $('#myElem').html(html);
}}):




2013-02-28               Templating JavaScript - doT.js                      2
Dans la vraie vie
{                                                    {
    users: [                                        lastname:'Dupont',
     {                                              firstname:'Jean',
       lastname:'Parisot',                          address:{
       firstname:'Mathieu',                           street:'4 rue machin',
       address:{                                      zipcode:'75000',
         street:'4 rue secrète',                      city:'Paris'
         zipcode:'75000',                           }
         city:'Paris'                             },
       }                                            …
     },                                          ]}
2013-02-28                   Templating JavaScript - doT.js                    3
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);
2013-02-28                        Templating JavaScript - doT.js                   4
Un beau jour…

 Good news everyone !
  Le JSON a changé !




2013-02-28             Templating JavaScript - doT.js   5
En voyant le JavaScript




2013-02-28              Templating JavaScript - doT.js   6
5 minutes plus tard !




2013-02-28              Templating JavaScript - doT.js   7
Et si on passait au templating ?
{{#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}}
2013-02-28              Templating JavaScript - doT.js    8
Qu'en pense notre développeur ?
         Plus maintenable
                                                         J'approuve !
         Plus simple
         Début de MVC




2013-02-28              Templating JavaScript - doT.js                  9
2013-02-28   Templating JavaScript - doT.js   10
Directement dans le JavaScript

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



      Simple                               Pas maintenable
                                           Pas réutilisable
2013-02-28              Templating JavaScript - doT.js        11
Directement dans le html

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

      Simple                              Pas réutilisable
      Maintenable
2013-02-28             Templating JavaScript - doT.js        12
Directement un fichier séparé

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



      Maintenable                      Requête en plus
     Réutilisable                      Asynchrone
2013-02-28              Templating JavaScript - doT.js   13
2013-02-28   Templating JavaScript - doT.js   14
Mustache.js
                http://mustache.github.com/

             Multi-langage                           Lent

             Très répandu                            Syntaxe

             Bien documenté


2013-02-28                   Templating JavaScript - doT.js    15
La syntaxe
{{#users}}
 <div>
   Hello <span>{{lastname}} {{firstname}}</span>
 </div>
 {{#address}}
 <div>You live in :
   <div>{{street}}</div><div>{{zipcode}} {{city}}</div>
 </div>
 {{/address}}
{{/users}}
2013-02-28                Templating JavaScript - doT.js   16
handlebars.js
                 http://handlebarsjs.com/

             Syntaxe

             Assez répandu

             Très bien documenté

             Compatible Mustache
2013-02-28                   Templating JavaScript - doT.js   17
La syntaxe
{{#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}}
2013-02-28                Templating JavaScript - doT.js   18
2013-02-28   Templating JavaScript - doT.js   19
doT.js
                http://olado.github.com/doT/

             Simple                                   Minimaliste

             Concis et léger                          Peu répandu

             Rapide



2013-02-28                     Templating JavaScript - doT.js       20
La syntaxe
{{~ 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>
 {{?}}
{{~}}
2013-02-28                Templating JavaScript - doT.js   21
Un peu de contexte




2013-02-28             Templating JavaScript - doT.js   22
Léger

                     530 lignes de code
                     15ko non minifié

                     2200 lignes de code
                     75ko non minifié

                     120 lignes de code
                     5.3ko non minifié
2013-02-28             Templating JavaScript - doT.js   23
Benchmarkons




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

2013-02-28                Templating JavaScript - doT.js   24
Rapide




2013-02-28            Templating JavaScript - doT.js   25
Rapide
                            doT.js




2013-02-28            Templating JavaScript - doT.js   26
Rapide
                      Concaténation




2013-02-28            Templating JavaScript - doT.js   27
Rapide
                            Array.join




2013-02-28            Templating JavaScript - doT.js   28
Rapide
                            JQuote2




2013-02-28            Templating JavaScript - doT.js   29
Rapide
                        Handlebars




2013-02-28            Templating JavaScript - doT.js   30
Rapide
                            kite.js




2013-02-28            Templating JavaScript - doT.js   31
Rapide
                            Mustache




2013-02-28            Templating JavaScript - doT.js   32
Rapide
                            underscore




2013-02-28            Templating JavaScript - doT.js   33
Rapide sur mobile




2013-02-28             Templating JavaScript - doT.js   34
Pour vérifier par vous même




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




2013-02-28                   Templating JavaScript - doT.js   35
L'intégration




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



  2013-02-28              Templating JavaScript - doT.js   36
Un exemple simple



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

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


                <div>hello world</div>


2013-02-28              Templating JavaScript - doT.js   37
La pré-compilation


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




2013-02-28                   Templating JavaScript - doT.js   38
L'objet it

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

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

                tplCompile({txt:'hello world'});
2013-02-28                   Templating JavaScript - doT.js   39
Objets complexes

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

2013-02-28             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;
}
2013-02-28             Templating JavaScript - doT.js   41
Conditions

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

2013-02-28                Templating JavaScript - doT.js   42
Conditions
function 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;
}
2013-02-28                Templating JavaScript - doT.js   43
Itérations


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



2013-02-28                Templating JavaScript - doT.js   44
Itérations


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



2013-02-28                Templating JavaScript - doT.js   45
Itérations
function 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;
}
2013-02-28                 Templating JavaScript - doT.js   46
Encoder le HTML

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

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

2013-02-28              Templating JavaScript - doT.js   47
Encoder le HTML
function 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;
  };
}
2013-02-28             Templating JavaScript - doT.js    48
Appel de fonctions

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

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

2013-02-28              Templating JavaScript - doT.js   49
Appel de fonctions

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



2013-02-28              Templating JavaScript - doT.js   50
Javascript dans les templates

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




2013-02-28              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;
}

2013-02-28              Templating JavaScript - doT.js   52
LogicLess vs LogicFull
             LogicLess                                    LogicFull
⦿ Templates plus       ⦿ Plus de liberté
  simples              ⦿ Plus complexe
⦿ Meilleurs séparation
  du code
⦿ Moins de risque de
  code brouillon


2013-02-28               Templating JavaScript - doT.js               53
Fragments

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

doT.template(
  template,
  { joke : "<div>{{=it.name}} who?</div>" }
);
2013-02-28               Templating JavaScript - doT.js   54
Fragments

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




2013-02-28               Templating JavaScript - doT.js   55
La configuration

templateSettings: {                                      varname: 'it',
   evaluate: [regexp],                                   strip: true,
   interpolate: [regexp]                                 append: true,
   encode: [regexp],                                     selfcontained: false
   use: [regexp],                           }
   useParams: [regexp],
   define: [regexp],
   defineParams: [regexp],
   conditional: [regexp],
   iterate: [regexp],

2013-02-28              Templating JavaScript - doT.js                          56
Pour allez plus loin

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




2013-02-28               Templating JavaScript - doT.js   57
En conclusion



Le templating c'est bon mangez-en !




 2013-02-28             Templating JavaScript - doT.js   58
Bien choisir son vaisseau




2013-02-28              Templating JavaScript - doT.js   59
Des questions ?

2013-02-28      Templating JavaScript - doT.js   60

More Related Content

More from SOAT

1/3 : introduction to CDI - Antoine Sabot-Durand
1/3 : introduction to CDI - Antoine Sabot-Durand1/3 : introduction to CDI - Antoine Sabot-Durand
1/3 : introduction to CDI - Antoine Sabot-DurandSOAT
 
2/3 : CDI advanced - Antoine Sabot-Durand
2/3 : CDI advanced - Antoine Sabot-Durand2/3 : CDI advanced - Antoine Sabot-Durand
2/3 : CDI advanced - Antoine Sabot-DurandSOAT
 
Angular JS - Paterne Gaye-Guingnido
Angular JS - Paterne Gaye-Guingnido Angular JS - Paterne Gaye-Guingnido
Angular JS - Paterne Gaye-Guingnido SOAT
 
Dans l'enfer du Web Mobile - un retour d'expérience - Mathieu Parisot
Dans l'enfer du Web Mobile - un retour d'expérience - Mathieu ParisotDans l'enfer du Web Mobile - un retour d'expérience - Mathieu Parisot
Dans l'enfer du Web Mobile - un retour d'expérience - Mathieu ParisotSOAT
 
RxJava, Getting Started - David Wursteisen - 16 Octobre 2014
RxJava, Getting Started - David Wursteisen - 16 Octobre 2014RxJava, Getting Started - David Wursteisen - 16 Octobre 2014
RxJava, Getting Started - David Wursteisen - 16 Octobre 2014SOAT
 
L'impact du Responsive Web Design sur vos équipes projet - Mathieu Parisot - ...
L'impact du Responsive Web Design sur vos équipes projet - Mathieu Parisot - ...L'impact du Responsive Web Design sur vos équipes projet - Mathieu Parisot - ...
L'impact du Responsive Web Design sur vos équipes projet - Mathieu Parisot - ...SOAT
 
Nio sur Netty par Mouhcine Moulou - 3 avril 2014
Nio sur Netty par Mouhcine Moulou - 3 avril 2014Nio sur Netty par Mouhcine Moulou - 3 avril 2014
Nio sur Netty par Mouhcine Moulou - 3 avril 2014SOAT
 
20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soatSOAT
 
Développer des applications iOS et Android avec c# grâce à Xamarin par Cyril ...
Développer des applications iOS et Android avec c# grâce à Xamarin par Cyril ...Développer des applications iOS et Android avec c# grâce à Xamarin par Cyril ...
Développer des applications iOS et Android avec c# grâce à Xamarin par Cyril ...SOAT
 
Amazon Web Service par Bertrand Lehurt - 11 mars 2014
Amazon Web Service par Bertrand Lehurt - 11 mars 2014Amazon Web Service par Bertrand Lehurt - 11 mars 2014
Amazon Web Service par Bertrand Lehurt - 11 mars 2014SOAT
 
ASP.Net Web API - Léonard Labat (18 février 2014)
ASP.Net Web API - Léonard Labat (18 février 2014)ASP.Net Web API - Léonard Labat (18 février 2014)
ASP.Net Web API - Léonard Labat (18 février 2014)SOAT
 
Xamarin et le développement natif d’applications Android, iOS et Windows en C#
 Xamarin et le développement natif d’applications Android, iOS et Windows en C# Xamarin et le développement natif d’applications Android, iOS et Windows en C#
Xamarin et le développement natif d’applications Android, iOS et Windows en C#SOAT
 
A la découverte du Responsive Web Design par Mathieu Parisot - Soat
A la découverte du Responsive Web Design par Mathieu Parisot - SoatA la découverte du Responsive Web Design par Mathieu Parisot - Soat
A la découverte du Responsive Web Design par Mathieu Parisot - SoatSOAT
 
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de donnéesMongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de donnéesSOAT
 
Soirée 3T Soat - Asp.net MVC
Soirée 3T Soat - Asp.net MVCSoirée 3T Soat - Asp.net MVC
Soirée 3T Soat - Asp.net MVCSOAT
 
Présentation spring data Matthieu Briend
Présentation spring data  Matthieu BriendPrésentation spring data  Matthieu Briend
Présentation spring data Matthieu BriendSOAT
 
Je suis agile tout seul - Ricardo Minhoto
Je suis agile tout seul - Ricardo MinhotoJe suis agile tout seul - Ricardo Minhoto
Je suis agile tout seul - Ricardo MinhotoSOAT
 
Facilitez vous la vie - Ricardo Minhoto
Facilitez vous la vie - Ricardo MinhotoFacilitez vous la vie - Ricardo Minhoto
Facilitez vous la vie - Ricardo MinhotoSOAT
 
Play : Premiers pas par l'exemple le 120613
Play : Premiers pas par l'exemple le 120613Play : Premiers pas par l'exemple le 120613
Play : Premiers pas par l'exemple le 120613SOAT
 
Transition Agile technique à grande échelle
Transition Agile technique à grande échelleTransition Agile technique à grande échelle
Transition Agile technique à grande échelleSOAT
 

More from SOAT (20)

1/3 : introduction to CDI - Antoine Sabot-Durand
1/3 : introduction to CDI - Antoine Sabot-Durand1/3 : introduction to CDI - Antoine Sabot-Durand
1/3 : introduction to CDI - Antoine Sabot-Durand
 
2/3 : CDI advanced - Antoine Sabot-Durand
2/3 : CDI advanced - Antoine Sabot-Durand2/3 : CDI advanced - Antoine Sabot-Durand
2/3 : CDI advanced - Antoine Sabot-Durand
 
Angular JS - Paterne Gaye-Guingnido
Angular JS - Paterne Gaye-Guingnido Angular JS - Paterne Gaye-Guingnido
Angular JS - Paterne Gaye-Guingnido
 
Dans l'enfer du Web Mobile - un retour d'expérience - Mathieu Parisot
Dans l'enfer du Web Mobile - un retour d'expérience - Mathieu ParisotDans l'enfer du Web Mobile - un retour d'expérience - Mathieu Parisot
Dans l'enfer du Web Mobile - un retour d'expérience - Mathieu Parisot
 
RxJava, Getting Started - David Wursteisen - 16 Octobre 2014
RxJava, Getting Started - David Wursteisen - 16 Octobre 2014RxJava, Getting Started - David Wursteisen - 16 Octobre 2014
RxJava, Getting Started - David Wursteisen - 16 Octobre 2014
 
L'impact du Responsive Web Design sur vos équipes projet - Mathieu Parisot - ...
L'impact du Responsive Web Design sur vos équipes projet - Mathieu Parisot - ...L'impact du Responsive Web Design sur vos équipes projet - Mathieu Parisot - ...
L'impact du Responsive Web Design sur vos équipes projet - Mathieu Parisot - ...
 
Nio sur Netty par Mouhcine Moulou - 3 avril 2014
Nio sur Netty par Mouhcine Moulou - 3 avril 2014Nio sur Netty par Mouhcine Moulou - 3 avril 2014
Nio sur Netty par Mouhcine Moulou - 3 avril 2014
 
20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat
 
Développer des applications iOS et Android avec c# grâce à Xamarin par Cyril ...
Développer des applications iOS et Android avec c# grâce à Xamarin par Cyril ...Développer des applications iOS et Android avec c# grâce à Xamarin par Cyril ...
Développer des applications iOS et Android avec c# grâce à Xamarin par Cyril ...
 
Amazon Web Service par Bertrand Lehurt - 11 mars 2014
Amazon Web Service par Bertrand Lehurt - 11 mars 2014Amazon Web Service par Bertrand Lehurt - 11 mars 2014
Amazon Web Service par Bertrand Lehurt - 11 mars 2014
 
ASP.Net Web API - Léonard Labat (18 février 2014)
ASP.Net Web API - Léonard Labat (18 février 2014)ASP.Net Web API - Léonard Labat (18 février 2014)
ASP.Net Web API - Léonard Labat (18 février 2014)
 
Xamarin et le développement natif d’applications Android, iOS et Windows en C#
 Xamarin et le développement natif d’applications Android, iOS et Windows en C# Xamarin et le développement natif d’applications Android, iOS et Windows en C#
Xamarin et le développement natif d’applications Android, iOS et Windows en C#
 
A la découverte du Responsive Web Design par Mathieu Parisot - Soat
A la découverte du Responsive Web Design par Mathieu Parisot - SoatA la découverte du Responsive Web Design par Mathieu Parisot - Soat
A la découverte du Responsive Web Design par Mathieu Parisot - Soat
 
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de donnéesMongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
 
Soirée 3T Soat - Asp.net MVC
Soirée 3T Soat - Asp.net MVCSoirée 3T Soat - Asp.net MVC
Soirée 3T Soat - Asp.net MVC
 
Présentation spring data Matthieu Briend
Présentation spring data  Matthieu BriendPrésentation spring data  Matthieu Briend
Présentation spring data Matthieu Briend
 
Je suis agile tout seul - Ricardo Minhoto
Je suis agile tout seul - Ricardo MinhotoJe suis agile tout seul - Ricardo Minhoto
Je suis agile tout seul - Ricardo Minhoto
 
Facilitez vous la vie - Ricardo Minhoto
Facilitez vous la vie - Ricardo MinhotoFacilitez vous la vie - Ricardo Minhoto
Facilitez vous la vie - Ricardo Minhoto
 
Play : Premiers pas par l'exemple le 120613
Play : Premiers pas par l'exemple le 120613Play : Premiers pas par l'exemple le 120613
Play : Premiers pas par l'exemple le 120613
 
Transition Agile technique à grande échelle
Transition Agile technique à grande échelleTransition Agile technique à grande échelle
Transition Agile technique à grande échelle
 

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

  • 1. Mathieu PARISOT – Développeur Java @matparisot +Parisot Mathieu 2013-02-28 Templating JavaScript - doT.js 1
  • 2. Pourquoi ce talk ? test.js : test.json : $.ajax({ { url: 'test.json', name : 'world' success: function(data) { } var html = 'hello ' + data.name; $('#myElem').html(html); }}): 2013-02-28 Templating JavaScript - doT.js 2
  • 3. Dans la vraie vie { { users: [ lastname:'Dupont', { firstname:'Jean', lastname:'Parisot', address:{ firstname:'Mathieu', street:'4 rue machin', address:{ zipcode:'75000', street:'4 rue secrète', city:'Paris' zipcode:'75000', } city:'Paris' }, } … }, ]} 2013-02-28 Templating JavaScript - doT.js 3
  • 4. 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); 2013-02-28 Templating JavaScript - doT.js 4
  • 5. Un beau jour… Good news everyone ! Le JSON a changé ! 2013-02-28 Templating JavaScript - doT.js 5
  • 6. En voyant le JavaScript 2013-02-28 Templating JavaScript - doT.js 6
  • 7. 5 minutes plus tard ! 2013-02-28 Templating JavaScript - doT.js 7
  • 8. Et si on passait au templating ? {{#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}} 2013-02-28 Templating JavaScript - doT.js 8
  • 9. Qu'en pense notre développeur ? Plus maintenable J'approuve ! Plus simple Début de MVC 2013-02-28 Templating JavaScript - doT.js 9
  • 10. 2013-02-28 Templating JavaScript - doT.js 10
  • 11. Directement dans le JavaScript var myTemplate = 'Hello {{name}}'; … var result = applyTemplate(myTemplate, data); $('#myElem').html(result); Simple Pas maintenable Pas réutilisable 2013-02-28 Templating JavaScript - doT.js 11
  • 12. Directement dans le html <script type="text/template" id="tpl"> Hello {{name}} </script> var result = applyTemplate($('#tpl').text(), data); $('#myElem').html(result); Simple Pas réutilisable Maintenable 2013-02-28 Templating JavaScript - doT.js 12
  • 13. Directement un fichier séparé $.get('template.html', function(template){ var result = applyTemplate(template, data); $('#myElem').html(result); }); Maintenable Requête en plus Réutilisable Asynchrone 2013-02-28 Templating JavaScript - doT.js 13
  • 14. 2013-02-28 Templating JavaScript - doT.js 14
  • 15. Mustache.js http://mustache.github.com/ Multi-langage Lent Très répandu Syntaxe Bien documenté 2013-02-28 Templating JavaScript - doT.js 15
  • 16. La syntaxe {{#users}} <div> Hello <span>{{lastname}} {{firstname}}</span> </div> {{#address}} <div>You live in : <div>{{street}}</div><div>{{zipcode}} {{city}}</div> </div> {{/address}} {{/users}} 2013-02-28 Templating JavaScript - doT.js 16
  • 17. handlebars.js http://handlebarsjs.com/ Syntaxe Assez répandu Très bien documenté Compatible Mustache 2013-02-28 Templating JavaScript - doT.js 17
  • 18. La syntaxe {{#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}} 2013-02-28 Templating JavaScript - doT.js 18
  • 19. 2013-02-28 Templating JavaScript - doT.js 19
  • 20. doT.js http://olado.github.com/doT/ Simple Minimaliste Concis et léger Peu répandu Rapide 2013-02-28 Templating JavaScript - doT.js 20
  • 21. La syntaxe {{~ 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> {{?}} {{~}} 2013-02-28 Templating JavaScript - doT.js 21
  • 22. Un peu de contexte 2013-02-28 Templating JavaScript - doT.js 22
  • 23. Léger 530 lignes de code 15ko non minifié 2200 lignes de code 75ko non minifié 120 lignes de code 5.3ko non minifié 2013-02-28 Templating JavaScript - doT.js 23
  • 24. Benchmarkons Création d'une liste de 100 éléments 2013-02-28 Templating JavaScript - doT.js 24
  • 25. Rapide 2013-02-28 Templating JavaScript - doT.js 25
  • 26. Rapide doT.js 2013-02-28 Templating JavaScript - doT.js 26
  • 27. Rapide Concaténation 2013-02-28 Templating JavaScript - doT.js 27
  • 28. Rapide Array.join 2013-02-28 Templating JavaScript - doT.js 28
  • 29. Rapide JQuote2 2013-02-28 Templating JavaScript - doT.js 29
  • 30. Rapide Handlebars 2013-02-28 Templating JavaScript - doT.js 30
  • 31. Rapide kite.js 2013-02-28 Templating JavaScript - doT.js 31
  • 32. Rapide Mustache 2013-02-28 Templating JavaScript - doT.js 32
  • 33. Rapide underscore 2013-02-28 Templating JavaScript - doT.js 33
  • 34. Rapide sur mobile 2013-02-28 Templating JavaScript - doT.js 34
  • 35. Pour vérifier par vous même http://jsperf.com/test-perf-templating/7 2013-02-28 Templating JavaScript - doT.js 35
  • 36. L'intégration <script type="text/javascript" src="doT.js"></script> 2013-02-28 Templating JavaScript - doT.js 36
  • 37. Un exemple simple var tplCompile = doT.template('<div>{{=it.txt}}</div>'); var result = tplCompile({txt:'hello world'}); <div>hello world</div> 2013-02-28 Templating JavaScript - doT.js 37
  • 38. La pré-compilation function anonymous(it) { var out = '<div>' + (it.txt) + '</div>'; return out; } 2013-02-28 Templating JavaScript - doT.js 38
  • 39. L'objet it <div>{{=it.txt}}</div> function anonymous(it) { var out = '<div>' + (it.txt) + '</div>'; return out; } tplCompile({txt:'hello world'}); 2013-02-28 Templating JavaScript - doT.js 39
  • 40. Objets complexes <div> Hello <span>{{= it.name}}</span> </div> <div>You live in : <div>{{=it.address.street}}</div> <div>{{=it.address.city}}</div> </div> 2013-02-28 Templating JavaScript - doT.js 40
  • 41. 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; } 2013-02-28 Templating JavaScript - doT.js 41
  • 42. Conditions {{? it.address.country == 'france'}} Cocorico! {{?? it.address.country != ''}} {{=it.address.country}} {{??}} Pays Inconnu {{?}} 2013-02-28 Templating JavaScript - doT.js 42
  • 43. Conditions function 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; } 2013-02-28 Templating JavaScript - doT.js 43
  • 44. Itérations {{~ it.users:user}} <div> Hello {{= user.lastname}} {{= user.firstname}} </div> {{~}} 2013-02-28 Templating JavaScript - doT.js 44
  • 45. Itérations {{~ it.users:user:index}} <div> Hello {{= user.lastname}} {{= user.firstname}} </div> {{~}} 2013-02-28 Templating JavaScript - doT.js 45
  • 46. Itérations function 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; } 2013-02-28 Templating JavaScript - doT.js 46
  • 47. Encoder le HTML <div>{{! it.code}}</div> function anonymous(it) { var out = '<div>' + encodeHTML( it.code ) + '</div>'; return out; } 2013-02-28 Templating JavaScript - doT.js 47
  • 48. Encoder le HTML function 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; }; } 2013-02-28 Templating JavaScript - doT.js 48
  • 49. Appel de fonctions function formatDate (date) { return date.getDay() + '/' + (date.getMonth()+1) + '/' + date.getYear(); } <div>{{= formatDate(it.creationDate) }}</div> 2013-02-28 Templating JavaScript - doT.js 49
  • 50. Appel de fonctions function anonymous(it) { var out = '<div>' + (formatDate(it.creationDate) ) + '</div>'; return out; } 2013-02-28 Templating JavaScript - doT.js 50
  • 51. Javascript dans les templates <div> {{var toto = 'hello';}} {{toto += item.maValeur;}} <span>{{=toto}}</span> </div> 2013-02-28 Templating JavaScript - doT.js 51
  • 52. Javascript dans les templates function anonymous(it) { var out = '<div>'; var toto = 'hello'; toto += it.maValeur; out += '<span>' + (toto) + '</span></div>'; return out; } 2013-02-28 Templating JavaScript - doT.js 52
  • 53. LogicLess vs LogicFull LogicLess LogicFull ⦿ Templates plus ⦿ Plus de liberté simples ⦿ Plus complexe ⦿ Meilleurs séparation du code ⦿ Moins de risque de code brouillon 2013-02-28 Templating JavaScript - doT.js 53
  • 54. Fragments {{##def.snippet: <div>{{=it.name}}</div>{{#def.joke}} #}} {{#def.snippet}} doT.template( template, { joke : "<div>{{=it.name}} who?</div>" } ); 2013-02-28 Templating JavaScript - doT.js 54
  • 55. Fragments function anonymous(it) { var out = '<div>' + (it.name) + '</div><div>' + (it.name) + ' who?</div>'; return out; } 2013-02-28 Templating JavaScript - doT.js 55
  • 56. La configuration templateSettings: { varname: 'it', evaluate: [regexp], strip: true, interpolate: [regexp] append: true, encode: [regexp], selfcontained: false use: [regexp], } useParams: [regexp], define: [regexp], defineParams: [regexp], conditional: [regexp], iterate: [regexp], 2013-02-28 Templating JavaScript - doT.js 56
  • 57. Pour allez plus loin ⦿ http://olado.github.com/doT/index.html ⦿ https://github.com/olado/doT ⦿ Blog So@t : http://goo.gl/COclS 2013-02-28 Templating JavaScript - doT.js 57
  • 58. En conclusion Le templating c'est bon mangez-en ! 2013-02-28 Templating JavaScript - doT.js 58
  • 59. Bien choisir son vaisseau 2013-02-28 Templating JavaScript - doT.js 59
  • 60. Des questions ? 2013-02-28 Templating JavaScript - doT.js 60