Maison > interface Web > js tutoriel > Leçons apprises lors de la migration de React CRA et Jest vers Vite et Vitest

Leçons apprises lors de la migration de React CRA et Jest vers Vite et Vitest

Susan Sarandon
Libérer: 2024-12-27 06:28:10
original
264 Les gens l'ont consulté

Lessons Learned Migrating from React CRA & Jest to Vite & Vitest

Cet article concerne le calendrier de l'Avent EDOCODE 2024, publié le 16 décembre 2024.

L'article précédent a été rédigé par Taiji Yamada, chef de produit chez EDOCODE : Système de messagerie automatisé utilisant les webhooks Notion et l'outil sans code "Make" (l'article est en japonais).

Veuillez également consulter le calendrier de l'Avent Wano de notre société mère !

Présentation

Notre application, Gojiberry, est une application d'enquête Shopify qui aide les commerçants à recueillir de précieux commentaires de leurs clients.

Dès le début, nous avons construit Gojiberry avec un développement piloté par les tests (TDD) pour garantir que notre application est exempte de bogues et que nous pouvons publier de nouvelles fonctionnalités en toute confiance sans casser les fonctionnalités existantes. Cette fondation nous a permis d'apporter des changements à grande échelle, comme la migration de Create React App (CRA) vers Vite, avec un minimum de perturbations.

Lorsque CRA est devenu obsolète et que ses dépendances sont devenues obsolètes, nous avons décidé qu'il était temps de passer à un outil de construction moderne qui prendrait mieux en charge notre application en pleine croissance. La grande taille de notre base de code a ajouté une certaine complexité, mais le passage à Vite en valait la peine.

Notre objectif était de migrer nos deux projets React :

  • ? L'enquête : affichée aux utilisateurs finaux pour recueillir leurs réponses.
  • ? Le tableau de bord d'administration : utilisé par les commerçants pour configurer des enquêtes et afficher des analyses.

Si vous êtes propriétaire d'une boutique Shopify et que vous cherchez à recueillir des commentaires clients exploitables, essayez Gojiberry dès aujourd'hui sur l'App Store de Shopify !

Motivation pour la Migration

CRA nous a bien servi dans le passé, mais il n’est plus maintenu et ses dépendances sont devenues obsolètes. Cela a posé plusieurs défis :

  • ? Bibliothèques obsolètes : Nous n'avons pas pu mettre à jour les bibliothèques critiques telles que les événements utilisateur v14, qui ont introduit des améliorations significatives pour la gestion des tests asynchrones.
  • ? Tests lents : les tests Jest devenaient de plus en plus lents avec le temps, et nous souhaitions les temps de construction et de test plus rapides proposés par Vite et Vitest.
  • ⚖️ Comportement incohérent : sur les deux projets de notre monorepo, tous deux utilisant la même version d'événements utilisateur, l'un nécessitait d'encapsuler chaque action avec act() tandis que l'autre ne le faisait pas. Cette incohérence a créé de la confusion et ralenti le développement.
Changements clés dans les événements utilisateur v14

L'une des plus grandes améliorations de user-events v14 est l'obligation d'utiliser wait pour toutes les méthodes d'interaction. Cela élimine le besoin d'encapsuler les actions dans wait waitFor, ce qui rend le code de test plus propre et plus facile à maintenir.

Avant (événements utilisateur v13) :

import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import MyComponent from './MyComponent';

test('updates state on click', async () => {
  render(<MyComponent />);

  userEvent.click(screen.getByRole('button'));

  await waitFor(() => {
    expect(screen.getByText('Updated state')).toBeInTheDocument();
  });
});
Copier après la connexion
Copier après la connexion

Après (événements utilisateur v14) :

import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import MyComponent from './MyComponent';

test('updates state on click', async () => {
  render(<MyComponent />);

  userEvent.click(screen.getByRole('button'));

  await waitFor(() => {
    expect(screen.getByText('Updated state')).toBeInTheDocument();
  });
});
Copier après la connexion
Copier après la connexion

Ce changement simplifie les tests en supprimant le besoin de gérer explicitement les changements d'état avec waitFor. Les développeurs n'ont plus besoin de réfléchir au moment d'inclure wait waitFor, car la bibliothèque le gère automatiquement.

Les améliorations apportées aux événements utilisateur v14 et à Vitest ont résolu bon nombre de ces problèmes, offrant une expérience de développement plus propre, plus rapide et plus cohérente.

Alternatives envisagées

Avant de choisir Vite, nous avons évalué Next.js et Remix. Bien que les deux soient des frameworks puissants, ils ont nécessité des changements importants dans notre base de code et notre infrastructure :

  • Next.js et Remix :

    • ? Réorganisation de la base de code : les deux frameworks nous ont obligés à restructurer notre base de code pour l'adapter à leurs conventions, ce qui aurait été un processus fastidieux.
    • ?️ Modifications de l'infrastructure : Ces frameworks ne sont pas des frameworks d'application à page unique (SPA), donc leur adoption aurait nécessité des mises à jour de notre infrastructure de déploiement et d'hébergement.
    • ⚖️ Excès pour nos besoins : bien qu'ils offrent d'excellentes fonctionnalités pour le rendu et le routage côté serveur, ces fonctionnalités étaient inutiles pour notre cas d'utilisation.
  • Pourquoi nous avons choisi Vite :

    • ? Modifications minimales du code : Vite n'a nécessité presque aucune modification de notre base de code existante, ce qui rend la transition simple et efficace.
    • ?️ Compatibilité 1-to-1 avec Jest : Vitest étant hautement compatible avec Jest, nous avons pu réutiliser la plupart de notre code de test avec des ajustements minimes.
    • Améliorations des performances : Vite a fourni des temps de construction plus rapides et Vitest a considérablement accéléré l'exécution des tests.

En choisissant Vite, nous avons évité la complexité liée à l'adoption d'un framework à part entière tout en récoltant les avantages d'un outil de construction moderne et léger.

Processus de migration

Nous avons abordé la migration de manière systématique puisque notre monorepo contient deux projets npm distincts. Voici comment nous avons exécuté la migration :

  1. Commencez par le plus petit projet :

    • ?️ La migration du plus petit projet nous a d'abord permis d'identifier les pièges potentiels sans risquer le plus grand projet.
  2. Étapes de migration :

    Le processus pour chaque projet a suivi ces étapes :

    • ? Migrer vers Vite : remplacez CRA par Vite, corrigez les erreurs et assurez-vous que l'application se construit et fonctionne correctement.
    • ? Correction des erreurs TypeScript : Vite a introduit des règles TypeScript plus strictes, exposant des problèmes dans la base de code. Les corriger ont rendu le code plus résilient et réduit les mauvaises pratiques.
    • Migrer vers Vitest : Tests de transition de Jest vers Vitest.
    • ? Corriger les erreurs de test : corrigez les tests défectueux causés par des différences dans la façon dont Jest et Vitest gèrent certains scénarios.
    • ? Mise à niveau vers les événements utilisateur v14 : mettez à jour la bibliothèque de tests et corrigez les tests défectueux. Alors que de nombreux tests nécessitaient des corrections manuelles, la plupart des problèmes provenaient de cas de test incorrects, comme le fait de ne pas attendre les changements d'état de React lorsque cela était nécessaire. Ce fut une opportunité précieuse de repérer et de corriger les erreurs dans nos tests.
  3. Répéter pour le projet plus vaste :

    • ? Après avoir migré avec succès le plus petit projet, nous avons appliqué les mêmes étapes au plus grand projet.

Défis rencontrés

  • ? Tests interrompus : La migration vers Vitest et la mise à niveau vers user-events v14 ont provoqué de nombreux échecs de tests. Cependant, ces échecs ont révélé des problèmes sous-jacents dans nos cas de test, tels que des appels d'attente manquants pour les changements d'état de React. La correction de ces problèmes a amélioré la précision et la fiabilité de nos tests.
  • ?️ Rigueur TypeScript : Les règles TypeScript plus strictes de Vite ont exposé des modèles problématiques dans notre code. Bien que la correction de ces erreurs ait nécessité des efforts supplémentaires, le résultat final était une base de code plus propre et plus résiliente.

Résultat

La migration de CRA vers Vite, ainsi que la transition vers Vitest et user-events v14, ont apporté des améliorations substantielles à notre flux de travail de développement :

  • Temps de construction et de test plus rapides : après la migration, notre suite de tests se termine désormais en 30 % de temps en moins, accélérant considérablement notre pipeline CI.
  • ? Rechargement à chaud instantané : le remplacement à chaud du module (HMR) de Vite pendant le développement est presque instantané, une grande amélioration par rapport au CRA, rendant le développement plus transparent et plus efficace.
  • ? Clarté et fiabilité améliorées des tests : La mise à niveau vers les événements utilisateur v14 et Vitest a abouti à des tests plus propres et plus cohérents. De nombreux tests incorrects ont été corrigés lors de la migration, ce qui nous a aidé à détecter les bogues cachés et à améliorer la qualité globale du code.
  • ?️ Base de code résiliente : les règles TypeScript plus strictes de Vite ont exposé plusieurs domaines d'amélioration de notre code, rendant l'application plus robuste et réduisant le risque de mauvaises pratiques.

La migration a changé la donne, nous permettant d'itérer plus rapidement tout en conservant la confiance dans notre base de code.

Leçons apprises

Voici quelques points à retenir de notre expérience :

  • ? Commencez petit : Commencez par des projets plus petits pour réduire les risques et affiner le processus.
  • Planifiez les tests défectueux : attendez-vous à ce que certains cas de test échouent et allouez du temps pour les réparer. Ces échecs révèlent souvent des problèmes plus profonds qui méritent d’être résolus.
  • ?️ Adoptez des règles plus strictes : bien que des règles TypeScript plus strictes et des différences de framework puissent au départ ressembler à des obstacles, elles conduisent finalement à une meilleure base de code.
  • ? Évaluez soigneusement les frameworks : choisissez des outils qui correspondent à votre architecture et à vos objectifs existants.

Conclusion

La migration de CRA vers Vite et Vitest a apporté des améliorations significatives à notre flux de travail. Nous bénéficions désormais de builds plus rapides, d'un code de test plus propre avec les événements utilisateur v14 et d'une base de code plus résiliente grâce à des règles TypeScript plus strictes.

L'un des facteurs clés qui ont rendu cette transition plus fluide a été notre investissement initial dans le développement piloté par les tests (TDD). Grâce à une suite complète de tests en place, nous avons pu apporter des modifications massives en toute confiance sans interrompre les fonctionnalités existantes.

Si vous envisagez une migration similaire, nous espérons que notre expérience vous fournira des informations précieuses pour guider votre voyage.


Demain, 17 décembre 2024, l'article sera Passer du B2C au B2B : la confession d'un marketeur par Amee Xu, responsable marketing produit chez Gojiberry.

Chez Wano Group, nous recrutons ! Si vous êtes intéressé, veuillez consulter nos postes ouverts en utilisant le lien ci-dessous :

EMPLOIS | Groupe Wano

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal