Riot, un nouveau framework js pour IHM

AprĂšs Backbone, Ember, Angular, des frameworks Ă  tout faire (dits MV*), enfin presque car Backone est plus une librairie qu’un framework, sont apparus des frameworks se concentrant sur une seule chose : la “vue” (ou view) comme React, Polymer, Vue.js etc
 Certains d’entre eux s’appuient sur le concept de Web component et se trimballent une tripotĂ©e de polyfills pour arriver Ă  fonctionner sous un maximum de navigateurs (mais dĂšs fois il faudra faire votre deuil de certaines version d’IE). Les concepts sont gĂ©niaux, quelquefois l’outillage un peu lourd et il vaut mieux avoir un navigateur de derniĂšre gĂ©nĂ©ration.

Hier soir, je suis tombĂ© complĂštement par hasard (en lisant Prismatic) sur Riot, qui est d’une simplicitĂ© dĂ©concertante et extrĂȘmement lĂ©ger: 5.7kb.

Riot est un framework développé par Muut une solution de forumet de commentaires pour sites web.

Mais laissez moi vous prĂ©senter (rapidement pour aujourd’hui) la bĂȘte (la bĂ©bĂȘte).

Les “tags”

Le concept de base de Riot, c’est les tags. Un tag riot, cela ressemble à ceci:

/* hello.js */

riot.tag('hello','<h1>hello from {who}</h1>', function(opts) {
  this.who = "Bob Morane";
})

et cela s’utilise comme ceci:

<!DOCTYPE html>
<html>
<body>

    <hello></hello> <!-- déclaration de mon tag -->

    <script src="js/vendors/riot-2.0.1.js"></script>
    <script src="js/tags/hello.js"></script>
<script>
    riot.mount("hello", null); /* le 1er paramĂštre est le nom du tag */
</script>
</body>
</html>

Donc, on dĂ©finit un tag <hello>, on le “raccroche” au DOM avec riot.mount(). Cela ressemble beaucoup Ă  React dans l’esprit.

Si vous ouvrez votre page dans un navigateur, vous obtiendrez un “joli” “hello from Bob Morane”.

Il est aussi possible de passer des données au tag au moment du mount. Par exemple définissons un nouveau tag <hi>:

/* hi.js */

riot.tag(
  'hi',
  '<h2>Hi {title}!</h2><ul> <li each="{humans}">{name}</li></ul>', 
  function(opts) {
    this.title = opts.title;
    this.humans = opts.humans;
})

Et nous l’utiliserons comme ceci:

<!DOCTYPE html>
<html>
<body>

    <hi></hi> <!-- déclaration de mon tag -->

    <script src="js/vendors/riot-2.0.1.js"></script>
    <script src="js/tags/hi.js"></script>
<script>
    riot.mount("hi", {
        title: "all",
        humans: [
            {name: "John Doe"},
            {name: "Jane Doe"},
            {name: "Doctor Who"}
        ]
    })
</script>
</body>
</html>

Et on obtiendra une liste (avec un titre) dans notre page html.

Remarque importante: dans la dĂ©finition du tag, nous passons opts en paramĂštre, vous pouvez appeler ce paramĂštre autrement, mais nous allons voir plus loin qu’il est mieux de garder opts qui est en fait un mot clĂ© pour Riot.

Des tags sans string

Si vous devez bosser avec des intĂ©grateurs, ou que vous avez des tags complexes, mettre votre code html dans une string, ça peut vite ĂȘtre fastidieux. Muut a pensez Ă  vous. Il est possible de dĂ©finir nos tags dans des fichiers .tag dans lesquels on Ă©crit directement notre code html.

Riot propose un utilitaire qui “transpile” les fichiers .tag en fichiers .js.

Pour l’installer, tapez la commande suivante:

npm install riot -g

Remarque: n’oubliez pas le sudo pour ceux qui sont sous osx.

Ensuite tapez la commande suivante:

riot -w js/tags.src js/tags

A partir de maintenant Riot va surveiller votre rĂ©pertoire js/tags.src et Ă  chaque changement va “transpiler” vos fichiers .tag en fichiers .js dans le rĂ©pertoire js/tags. (AprĂšs vous appelez vos rĂ©pertoires comme vous le souhaitez)

Nos tags vont devenir ceci:

Dans un fichier hello.tag:

<hello>
    <h1>hello from {who}</h1>

    this.who = "Bob Morane";
</hello>

Dans un fichier hi.tag:

<hi>
    <h2>Hi {title}!</h2>
    <hr>
    <ul>
        <li each="{humans}">{name}</li>
    </ul>

    this.title = opts.title;
    this.humans = opts.humans;
</hi>

Remarque importante: c’est ici que l’on voit l’importance d’utiliser le mot-clĂ© opts et pas autre chose, car sinon Riot ne fera pas le lien avec vos donnĂ©es, car il va gĂ©nĂ©rer un corp de fonction comme ceci:

function(opts) {
    this.title = opts.title;
    this.humans = opts.humans;
}

Conclusion

VoilĂ , c’est tout pour aujourd’hui. Je vais tenter de creuser un peu plus avec des exemples plus complexes, mais je trouve l’utilisation de Riot particuliĂšrement simple. Il va bien sĂ»r plus loin qu’un simple affichage de donnĂ©es, puisque vous avez entre autres choses:

Next steps: les données, backbone, 


blog comments powered by Disqus

Related posts