Re: "Comparaison des frameworks JS: React, Vue et Hyperapp"

Il s'agit d'un petit article de réponse à la publication «Comparaison des frameworks JS: React, Vue et Hyperapp» . En général, je ne suis pas un grand fan de telles comparaisons. Cependant, puisque nous parlions d'un cadre aussi marginal que Hyperapp, en comparaison avec des mastodontes tels que React et Vue, j'ai pensé, pourquoi ne pas considérer tous les mêmes exemples sur Svelte . Pour ainsi dire, pour compléter le tableau. De plus, cela prend littéralement 5 minutes. C'est parti!

image

Si tout à coup vous n'êtes pas familier avec Svelte et le concept de disparition des frameworks, vous pouvez lire les articles «Magically Disappearing JS Framework» et «Disappearing Framework» .

Pour la commodité des lecteurs, j'ai copié les exemples de l' article original sous les spoilers pour le rendre plus pratique à comparer. Eh bien, commençons.

Exemple n ° 1: contre-application


Réagir
import React from "react"; import ReactDOM from "react-dom"; class Counter extends React.Component { constructor(props) { super(props); this.state = { count: 0}; } down(value) { this.setState(state => ({ count: state.count - value })); } up(value) { this.setState(state => ({ count: state.count + value })); } render() { return ( <div> <h1>{this.state.count}</h1> <button onClick = {() => this.down(1)}>-</button> <button onClick = {() => this.up(1)}>+</button> </div> ); } } ReactDOM.render(<Counter />, document.querySelector("#app")); 


Vue
 import Vue from "vue"; new Vue({ data: { count: 0 }, methods: { down: function(value) { this.count -= value; }, up: function(value) { this.count += value; } }, render: function(h) { return( <div> <h1>{this.count}</h1> <button onClick={() => this.down(1)}>-</button> <button onClick={() => this.up(1)}>+</button> </div> ); }, el: "#app" }); 


Hyperapp
 import { h, app } from "hyperapp"; const state = { count: 0 }; const actions = { down: value => state => ({ count: state.count - value}), up: value => state => ({ count: state.count + value}) }; const view = (state, actions) => ( <div> <h1>{state.count}</h1> <button onclick={() => actions.down(1)}>-</button> <button onclick={() => actions.up(1)}>+</button> </div> ); app(state, actions, view, document.querySelector("#app")); 


▍Svelte


 <div> <h1>{count}</h1> <button on:click="set({count: count - 1})">-</button> <button on:click="set({count: count + 1})">+</button> </div> 

→ Un exemple pratique.

▍Analyse


Svelte composant - un fichier html, qui a un format bien connu unique composant File (SFC), sous une forme ou une autre, sont déjà utilisés dans la Vue , Ractive , Riot et d' autres cadres. En plus du modèle html lui-même, un composant peut avoir le comportement et la logique décrits en javascript, ainsi que des styles étendus du composant.

Aucune partie du composant n'est requise, par conséquent, le composant du compteur ne peut être constitué que du modèle html du compteur lui-même. Pour modifier la valeur de la variable count , le gestionnaire de clics utilise la méthode intégrée du composant set () décrite dans la documentation .

Exemple n ° 2: travailler avec du code asynchrone


Réagir
 import React from "react"; import ReactDOM from "react-dom"; class PostViewer extends React.Component { constructor(props) { super(props); this.state = { posts: [] }; } getData() { fetch(`https://jsonplaceholder.typicode.com/posts`) .then(response => response.json()) .then(json => { this.setState(state => ({ posts: json})); }); } render() { return ( <div> <button onClick={() => this.getData()}>Get posts</button> {this.state.posts.map(post => ( <div key={post.id}> <h2><font color="#3AC1EF">{post.title}</font></h2> <p>{post.body}</p> </div> ))} </div> ); } } ReactDOM.render(<PostViewer />, document.querySelector("#app")); 


Vue
 import Vue from "vue"; new Vue({ data: { posts: [] }, methods: { getData: function(value) { fetch(`https://jsonplaceholder.typicode.com/posts`) .then(response => response.json()) .then(json => { this.posts = json; }); } }, render: function(h) { return ( <div> <button onClick={() => this.getData()}>Get posts</button> {this.posts.map(post => ( <div key={post.id}> <h2><font color="#3AC1EF">{post.title}</font></h2> <p>{post.body}</p> </div> ))} </div> ); }, el: "#app" }); 


Hyperapp
 import { h, app } from "hyperapp"; const state = { posts: [] }; const actions = { getData: () => (state, actions) => { fetch(`https://jsonplaceholder.typicode.com/posts`) .then(response => response.json()) .then(json => { actions.getDataComplete(json); }); }, getDataComplete: data => state => ({ posts: data }) }; const view = (state, actions) => ( <div> <button onclick={() => actions.getData()}>Get posts</button> {state.posts.map(post => ( <div key={post.id}> <h2><font color="#3AC1EF">{post.title}</font></h2> <p>{post.body}</p> </div> ))} </div> ); app(state, actions, view, document.querySelector("#app")); 


▍Svelte


 <div> <button on:click="getData()">Get posts</button> {#each posts as {title, body}} <div> <h2><font color="#3AC1EF">{title}</font></h2> <p>{body}</p> </div> {/each} </div> <script> export default { methods: { getData() { fetch('https://jsonplaceholder.typicode.com/posts') .then(res => res.json()) .then(posts => this.set({ posts })); } } }; </script> 

→ Un exemple pratique.

▍Analyse


Contrairement à JSX, qui, comme une copie conforme, est utilisé dans les 3 cadres de la comparaison d'origine, et étend en fait le code javascript avec une syntaxe de type html, Svelte utilise des fonctionnalités plus familières - incorporant du code js et css en html en utilisant < script> et <style> .

Le script de composant exporte un objet JS simple, divisé en sections. La section des méthodes décrit les méthodes des composants qui peuvent être utilisées via l'instance de composant et dans les gestionnaires d'événements. Ainsi, lorsque vous cliquez sur le bouton, la méthode getData () est appelée , à l'intérieur de laquelle les données sont demandées et à la fin de l'opération, les données sont simplement installées dans l'état du composant et immédiatement dessinées dans le modèle.

Notez l'utilisation de la déstructuration de l'objet de publication (post) à chaque étape de l'itération de la liste de publication:

 {#each posts as {title, body}} 

Cette astuce évite la redondance dans des modèles comme {post.title} et simplifie visuellement les modèles en utilisant une entrée plus courte {title} .

Exemple 3: répertorier le composant d'élément pour une application To-Do


React (style fonctionnel)
 function TodoItem(props) { return ( <li class={props.done ? "done" : ""} onclick={() => props.toggle(props.id)}> {props.value} </li> ); } 


Réagir
 class TodoItem extends React.Component { render () { return ( <li class={this.props.done ? "done" : ""} onclick={() => this.props.toggle(this.props.id)}> {this.props.value} </li> ); } } 


Vue
 var TodoItem = Vue.component("todoitem", { props: ["id", "value", "done", "toggle"], template: '<li v-bind:class="{done : done}" v-on:click="toggle(id)">{{value}}</li>' }); 


Hyperapp
 const TodoItem = ({ id, value, done, toggle }) = ( <li class={done ? "done" : ""} onclick={() => toggle(id)}> {value} </li> ); 


▍Svelte


 <li class="{done ? 'done' : ''}" on:click="set({done: !done})">{value}</li> 

→ Un exemple pratique.

▍Analyse


Tout est assez banal ici. Nous exposons la classe css en fonction de la valeur effectuée et modifions cette valeur à l'opposé lorsque vous cliquez sur un élément de la liste.

Comparaison des méthodes de cycle de vie des composants


Avertissement: A partir de ce moment - , j'ai décidé d'omettre la comparaison avec Hyperapp, car sinon la table va lire tout simplement pas.

Événement
Réagir
Vue
Svelte
Initialisation
constructeur
beforeCreate,
créé
sur place
Montage
componentDidMount
avantMonté, monté
oncreate, onupdate
Mettre à jour
componentDidUpdate
beforeUpdate, mis à jour
onstate, onupdate
Démontage
componentWillUnmount
-ondestroy
Destruction
-avant Détruire, détruit
-

▍Analyse


Svelte est extrêmement minimaliste, y compris en termes de crochets de cycle de vie. Il n'y a que 4 crochets:

  • onstate - appelé avant la création du composant et chaque changement d'état avant la mise à jour du DOM.
  • oncreate - le moment où le composant est créé est appelé.
  • onupdate - appelé immédiatement après le montage dans le DOM et chaque changement d'état après la mise à jour du DOM.
  • ondestroy - appelé lorsque le composant est détruit et supprimé du DOM.


Comparaison des performances du framework


Honnêtement, je ne sais pas quoi commenter. Les repères eux-mêmes et la façon dont ils sont exécutés suscitent toujours beaucoup de controverse, donc je ne pense pas qu'il soit logique de concentrer inutilement l'attention.
Cependant, nous n'avons toujours pas d'autres données.

▍Travailler avec des tables




▍Chargement, lancement, tailles de code




▍Travailler avec la mémoire




▍Analyse


À en juger par les chiffres, Svelte est assez rapide, «mange» peu de mémoire (y compris parce qu'il n'utilise pas VirtualDOM), il démarre rapidement et a une petite taille.

En général, je ne peux pas dire que les résultats des benchmarks de ces 3 frameworks différaient considérablement. Cependant, seul Svelte a une colonne exclusivement «verte», c'est-à-dire il est assez bon à la fois à tous égards, ce qui signifie qu'il est parfaitement équilibré et n'a pas de distorsions évidentes en termes de vitesse ou de consommation de mémoire ou d'autres mesures. En général, avec lui, vous pouvez démarrer en toute sécurité n'importe quel projet, du Web habituel, aux appareils mobiles, Smart TV et systèmes plus exotiques.

image

Résumé


Svelte est un excellent outil pour créer des composants de presque toutes les applications Web. Il est aussi puissant que React, et bien qu'il ait une communauté beaucoup plus petite, il nécessite moins d'efforts à maîtriser. Il est flexible, comme Vue, alors qu'il est beaucoup plus minimaliste et vérifié, car il n'essaie pas de saisir à la fois toutes les idées du développement web moderne.

De plus, il est le seul à utiliser le concept de frameworks menacés . En d'autres termes, il n'a aucun runtime spécifique autre que le navigateur lui-même.

Les applications s'avèrent rapides, ne demandent pas de ressources et sont de petite taille. De plus, Svelte peut être utilisé de manière «transparente» dans des applications écrites dans d'autres frameworks, sur lesquelles j'ai l'intention d'écrire la prochaine fois.

Si vous avez rencontré pour la première fois ce merveilleux cadre, vous pourriez être intéressé à lire d'autres articles à ce sujet:

Cadre JS disparaissant comme par magie
saisie semi-automatique de 1 Ko
SvelteJS: La sortie de la deuxième version

Si vous avez encore des questions sur Svelte , rejoignez la chaîne de télégrammes en langue russe SvelteJS . Là, vous pouvez toujours poser une question et obtenir des conseils, découvrir les dernières nouvelles et simplement profiter de la conversation. Nous serons ravis de vous voir!

Source: https://habr.com/ru/post/fr417747/


All Articles