Une micro-bibliothèque d'interface utilisateur ressemblant à React
Tags personnalisés • Syntaxe plaisante • DOM virtuel • Très léger
Pourquoi avons-nous besoin d’une autre bibliothèque UI ?
La scène front-end est en effet bondée, mais nous pensons honnêtement que la vraie solution se trouve encore “quelque-part”. Nous pensons que Riot offre le bon équilibre pour résoudre ce grand puzzle. React semble y parvenir mais a de sérieux points faibles que Riot viendra corriger.
Donc - voici pourquoi nous en avons besoin:
1. Tags personnalisés
Riot amène les tags personnalisés à tous les navigateurs.
<todo>
<!-- layout -->
<h3>{ opts.title }</h3>
<ul>
<li each={ item, i in items }>{ item }</li>
</ul>
<form onsubmit={ add }>
<input>
<button>Ajouter #{ items.length + 1 }</button>
</form>
<!-- style -->
<style scoped>
h3 {
font-size: 14px;
}
</style>
<!-- logic -->
<script>
this.items = []
add(e) {
var input = e.target[0]
this.items.push(input.value)
input.value = ''
}
</script>
</todo>
Un tag personnalisé colle ensemble le HTML correspondant et le JavaScript pour former un composant réutilisable. Considérez ça comme React + Polymer mais avec une syntaxe plaisante et un temps d’apprentissage très faible.
Lisible par les humains
Les tags personnalisés permettent de concevoir des vues complexes avec HTML. Votre application ressemblera peut-être à quelque chose comme ça:
<body>
<h1>Communauté Acme</h1>
<forum-header/>
<forum-content>
<forum-threads/>
<forum-sidebar/>
</forum-content>
<forum-footer/>
<script>riot.mount('*', { api: forum_api })</script>
</body>
La syntaxe HTML est le langage de facto du Web et a été conçu pour faire des interfaces utilisateur. La syntaxe est explicite, l’imbrication des éléments est inhérente au langage, et les attributs offrent un moyen propre pour fournir des options aux tags personnalisés.
Les tags Riot sont compilés en JavaScript pur avant que les navigateurs puissent les exécuter.
DOM virtuel
- Absolument la plus petite quantité possible de mises à jour et réinterprétation du DOM
- Un flux de données mono-directionnel: les mises à jour et démontages sont propagés vers le bas de parent à enfant
- Des expressions pré-compilées et mises en cache pour une haute performance
- Des évènements sur le cycle de vie pour plus de contrôle
- Un rendu côté serveur des tags personnalisés pour des applications universelles (isomorphiques)
Proche des standards
- Pas de système d’évènements propriétaire
- Le DOM généré peut être manipulé librement par d’autres outils
- Pas d’éléments HTML en racine ou d’attributs
data-
rajoutés - S’accorde bien avec jQuery
Prêt pour l’outillage
- Créez des tags en ES6, TypeScript, CoffeeScript, Jade, LiveScript ou n’importe quel préprocesseur de votre choix
- Integrez avec NPM, CommonJS, AMD, Bower ou Component
- Développez avec des plugins Gulp, Grunt ou Browserify
2. Simple et minimaliste
Le minimalisme de Riot le distingue des autres:
1. Syntaxe plaisante
Un des objectifs de conception était d’introduire une syntaxe de tag puissante avec le minimum possible de code de préparation:
- Raccourcis puissants:
class={ enabled: is_enabled, hidden: hasErrors() }
- Pas de considérations inutiles comme
render
,state
,constructor
orshouldComponentUpdate
- Interpolation:
Ajouter #{ items.length + 1 }
ouclass="item { selected: flag }"
- La balise
<script>
entourant la logique est optionnelle - Syntaxe ES6 compacte pour les méthodes
2. Faible courbe d’apprentissage
Riot a entre 10 et 100 fois moins de méthodes dans son API que les autres bibliothèques UI.
- Moins à apprendre. Moins de livres et tutoriaux à consulter
- Moins de choses propriétaires et plus de standard
3. Taille très légère
react.min.js – 33.27KB (gzip)
polymer.html – 49.38KB (gzip)
riot.min.js – 10.85Ko (gzip)
- Moins de bugs
- Plus rapide à interpréter et moins coûteux à télécharger
- Exportable. La bibliothèque doit être plus petite que l’application.
- Moins à maintenir. Nous n’avons pas besoin d’une grosse équipe pour maintenir Riot
4. Petit, mais complet
Riot a tous les blocs de construction essentiels pour des applications modernes côté client:
- Vues “réactives” pour concevoir des interfaces utilisateur
- Bibliothèque d’évènements pour faire des API avec des modules isolés
- Un routeur pour s’occuper de l’URL et du bouton précédent
Riot est une “pile ouverte”. Il est conçu pour les développeurs qui veulent éviter les idiomes spécifiques d’un framework. Les outils génériques vous permettent de mélanger et assortir les modèles de conception. Des systèmes comme Facebook Flux peuvent être faits soi-même.
J’ai regardé un exemple riot.js, et ça m’a paru tellement clair que c’en est effrayant. @paulbjensen
J’ai bricolé avec #RiotJS pendant une heure. Je l’ai installé avec Gulp, Browserify et Babel en un rien de temps. Je l’aime beaucoup jusqu’ici! @AndrewDelPrete
Aujourd’hui, j’ai utilisé #riotjs 2.0 pour la première fois et je peux admettre que ce sera une relation à long terme #js hautement recommandé. @gianlucaguarini
J’ai aimé l’idée de #reactjs avec #flux mais j’aime #riotjs avec #riotcontrol encore plus! @tscok
En train de regarder RiotJS https://muut.com/riotjs/ — sidéré par sa simplicité. @defeated
J’ai joué avec riot.js et je l’aime tellement plus que React. Minimaliste, rapide et avec une API compréhensible. @juriansluiman
Conclusion
Riot, c’est les Web Components pour tout le monde. Considérez ça comme React + Polymer mais sans le superflu. C’est intuitif à l’usage et ça ne pèse presque rien. Et ça marche dès aujourd’hui. On ne réinvente pas la roue, mais on récupère plutôt les meilleures parties de ce qui existe autour pour en faire l’outil le plus simple possible.
Nous devrions nous concentrer sur les composants réutilisables plutôt que les templates. D’après les développeurs de React:
“Les templates séparent les technologies, pas les problèmes.”
En ayant la mise en page et la logique liées ensemble sous le même composant, l’ensemble du système devient plus clair. Nous respectons React pour cette importante perspicacité.
L’article de blog initial
From React to Riot 2.0 (anglais)