- Récapitulatif des problèmes rencontrés après la mise à niveau récente d’une application web vers Svelte 5
- La réactivité profonde et le cycle de vie modifié ont entraîné des comportements inattendus
- J’ai longtemps apprécié Svelte 3/4, mais je ne pense pas choisir Svelte pour de nouveaux projets à l’avenir
La nécessité de la vitesse
- L’équipe Svelte a tenté d’optimiser les performances via la deep reactivity, et a obtenu de meilleures performances
- Auparavant déjà, Svelte offrait de bonnes performances grâce au processus de compilation, ce qui constituait une force distincte par rapport aux autres frameworks
- Cela rendait le framework opaque et le débogage difficile, mais cela semblait être un compromis acceptable du point de vue des performances et de la productivité
La nécessité de la vitesse
- Le principal changement mis en avant par l’équipe Svelte dans Svelte 5 est la « deep reactivity », destinée à améliorer les performances grâce à une réactivité plus fine
- Dans les versions précédentes de Svelte, cet objectif était surtout atteint via le compilateur Svelte
- Le fait de pouvoir réorganiser la logique interne sans obliger les développeurs à apprendre de nouveaux concepts mettait en valeur l’originalité de Svelte
- En même temps, ce processus de compilation rendait le framework opaque, ce qui compliquait le débogage des problèmes complexes
- Des erreurs difficiles à attribuer à leur cause apparaissaient à cause de bugs du compilateur lui-même, et il fallait parfois refactoriser entièrement le composant fautif pour les résoudre
- Malgré cela, cela restait à mes yeux un compromis raisonnable entre vitesse et productivité, au point d’accepter l’inconvénient de devoir réinitialiser périodiquement les projets
Svelte n’est pas du Javascript
- Svelte 5 double ce compromis
- La différence essentielle est que le point d’équilibre entre abstraction et performance a dépassé l’étape de compilation pour pénétrer aussi la partie runtime
- Utilisation de proxies pour prendre en charge la deep reactivity
- État implicite du cycle de vie des composants
- Ces deux changements améliorent les performances et donnent à l’API développeur une apparence plus fluide
- Qu’y a-t-il à ne pas aimer ? Malheureusement, ces deux fonctionnalités sont des exemples typiques de leaky abstraction
- Au final, elles créent un environnement plus complexe à gérer pour les développeurs
Les proxies ne sont pas des objets
- Grâce aux proxies, l’équipe Svelte a pu encore améliorer un peu les performances du framework sans demander de travail supplémentaire aux développeurs
- Dans des frameworks comme React, faire passer l’état à travers plusieurs composants peut facilement provoquer des rerenders inutiles ; Svelte a introduit les proxies pour réduire cela
- Le compilateur Svelte évitait déjà certains problèmes liés à la comparaison du virtual DOM, mais l’équipe semble avoir jugé que les proxies pouvaient encore améliorer les performances
- L’équipe Svelte a également indiqué que les proxies amélioraient l’expérience développeur, avançant l’idée qu’ils permettent de « maximiser à la fois l’efficacité et la facilité d’utilisation »
- Le problème, c’est que Svelte 5 paraît plus simple en apparence, alors qu’il ajoute en réalité davantage d’abstractions
- Par exemple, utiliser un proxy pour détecter les méthodes de tableau évite d’avoir à écrire du code comme
value = value dans Svelte 4
- Dans Svelte 4, les développeurs devaient comprendre jusqu’à un certain point le fonctionnement du compilateur pour déclencher la réactivité. Svelte 5 donne au contraire l’impression qu’on peut « oublier le compilateur », mais ce n’est pas vraiment le cas
- À mesure que l’on gagne en confort grâce à cette nouvelle abstraction, le nombre de règles que les développeurs doivent connaître pour faire fonctionner le compilateur comme prévu augmente aussi
- Après avoir longtemps utilisé Svelte, j’en suis progressivement venu à utiliser davantage les stores Svelte et moins les déclarations réactives
- Les stores Svelte restent fondamentalement plus proches des concepts Javascript, la méthode
update est simple à appeler, et la syntaxe $ n’était qu’un avantage supplémentaire
- Les proxies, comme les déclarations réactives, posent le problème de « sembler être une chose alors qu’ils se comportent différemment au niveau des frontières »
- Lors de ma première utilisation de Svelte 5, tout semblait fonctionner, mais quand j’ai voulu enregistrer un état proxy dans IndexedDB, j’ai obtenu une
DataCloneError
- Pire encore, pour savoir avec certitude si une valeur est un proxy, il faut essayer une structured clone dans un
try/catch, ce qui a un coût en performances
- Au final, il faut se souvenir de ce qui est un proxy et utiliser systématiquement
$state.snapshot dans les contextes externes qui ne reconnaissent pas les proxies
- On se retrouve ainsi dans une situation où, contrairement à l’intention initiale selon laquelle « l’abstraction améliore le confort du développeur », elle impose en pratique davantage de règles et de procédures complexes
Un composant n’est pas une fonction
Conclusion
- Ce qui est facile a clairement de l’attrait, mais comme l’a dit Rich Hickey, facile ne veut pas dire simple
- Comme Joel Spolsky, je n’apprécie pas particulièrement que des comportements inattendus se produisent
- Svelte a jusqu’ici montré beaucoup de « magie », mais dans cette version, il y a désormais trop de choses à mémoriser pour utiliser cette magie, et le coût dépasse le bénéfice
- Le but de ce texte n’est pas de critiquer l’équipe Svelte, et je suis bien conscient que beaucoup de personnes préfèrent Svelte 5 (et les React Hooks)
- L’important est l’équilibre entre offrir de la commodité aux utilisateurs et leur laisser le contrôle
- Un bon logiciel digne de ce nom repose non sur l’« intelligence », mais sur la compréhension
- À mesure que les outils d’IA progressent, il devient important de choisir non pas des outils qui font perdre de vue ce que l’on fait, mais des outils qui exploitent la sagesse déjà accumulée et aident à approfondir la compréhension
- Merci à Rich Harris et à l’équipe pour toutes ces années d’expérience de développement agréable. J’espère que ce texte constituera un retour qui, sans être parfait, ne sera pas pour autant inexact
7 commentaires
Les proxies rendent la vie plus facile à ceux qui les créent, mais ils énervent ceux qui doivent les déboguer, haha.
Pour les side projects, SolidJS est numéro un pour la DX >o< / quel bonheur
Je pense que c’est grâce à des alternatives comme Svelte que React/Next.js ont aussi pu être fortement stimulés.
Fondamentalement, Svelte est un language, donc j’espère qu’il saura aussi bien montrer la direction que doit prendre un langage de description d’UI.
Pour ma part, j’utiliserai React.
Le trop est l’ennemi du bien
S’égarer par excès d’ardeur
Une surcouche sur une surcouche
Je pense qu’il a changé de façon étrange en subissant une influence non négligeable de React, et surtout de Next.
+pageest difficile à comprendre si on le regarde sans connaître Svelte, et les runes comme$stateou$deriveddonnent l’impression de suivre React ; à choisir, l’époque où l’on mettait simplement$:devant une variable me paraît meilleure. Une syntaxe vieillotte comme{#each a in array} {/each}reste supportable, mais elle reste toujours fastidieuse. S’il s’agit d’un gain de performances grâce à une réactivité optionnelle, je pense que SolidJS va dans une bien meilleure direction. Comme il utilise JSX tel quel, il est aussi relativement plus facile d’y migrer depuis React. Il est même étonnant que SolidJS reçoive relativement si peu d’attention.J’ai l’impression que les Signals se dirigent vers le Trough of disillusionment du Gartner hype cycle 🤔 À mesure que les cas d’usage se précisent, je me dis que leur évaluation pourrait progressivement s’améliorer.
Avis Hacker News
Au début, les runes ne m’intéressaient pas vraiment. Mais j’ai changé d’avis quand j’ai vu qu’on peut importer des composants externes réactifs dans des templates
.svelteet encapsuler la réactivité en interne. Cela signifie qu’on peut profiter des avantages de la réactivité tout en écrivant des tests vitest. C’est vraiment puissant et, AFAIK, unique dans le monde du frontendJe développe activement une application SvelteKit déployée commercialement, et je voulais partager quelques réflexions sur l’expérience
+page. On pouvait placer les fichiers Svelte où on voulait, et ils se rendaient naturellement tout en offrant les avantages d’un framework moderneC’est dommage qu’EmberJS ait disparu. Son API est restée assez stable au cours des dix dernières années. Ironiquement, quelqu’un qui a écrit des applis EmberJS pendant ces dix dernières années aura probablement moins souffert des migrations que quelqu’un qui a fait la même chose avec React, Svelte, Vue, etc.
Les deux liens Github listés par l’auteur en haut du billet pointent vers le même problème, et ce problème a une solution (
use $state.raw)Svelte 5 n’est pas du JavaScript de la <i>pire</i> des façons. Il ne résout pas les problèmes de js et propose des abstractions fuyantes pour certains problèmes du frontend. Je pense que Solid va dans une meilleure direction que Svelte, parce que Solid ne dépend pas d’un nouveau langage. Mais comme js n’est pas idéal, il y a un instinct naturel à vouloir créer autre chose que du js. Elm est le prédécesseur de svelte. Mais je pense qu’on peut faire mieux...[0]
J’ai commencé à utiliser Svelte 5 parce que je détestais vraiment les stores dans Svelte 4. J’utilise Sveltekit et Svelte 5 sur un nouveau projet, et je dois dire que... la productivité avec React reste imbattable, même si la stack Sveltekit/Svelte est techniquement meilleure
+page.server.tsou+page.svelte, ou leurs variantes, ce qui rend le code difficile à rechercher facilement. Les outils de Svelte existent séparément detscet d’ESLint, ce qui les rend plus difficiles à intégrer à la CI et à utiliser en développementDire que Svelte n’est pas du JavaScript à cause d’un comportement inattendu quand on passe une closure dans un callback me paraît étrange. Un meilleur titre serait : « Svelte 5 me surprend et je n’aime pas ça »
Si vous cherchez une bibliothèque qui permet de créer des composants et des applis en pur JavaScript, jetez un œil à Lit : Lit
Vous voulez une expérience frontend raisonnable ? Utilisez JavaScript vanilla, les web components, htmx et Blazor