Présentez le monolithe à Devin
Vous connaissez ce fichier : un seul routeur Express qui a grossi pendant dix-huit mois. Tous les endpoints pour tous les domaines se trouvent dans Dites à Devin exactement à quoi doit ressembler la structure cible.
src/routes/index.ts : l’inscription utilisateur à côté des webhooks de paiement, à côté de la recherche de produits. Les vérifications d’authentification en ligne sont copiées-collées dans 40 gestionnaires. Personne ne veut y toucher, car une modification de la logique des commandes pourrait casser les endpoints utilisateur trois cents lignes plus haut dans le fichier.Voici à quoi ressemble généralement le haut du fichier :src/routes/index.ts (before — 2,000 lines)
Guidez Devin à l’aide de conventions
Devin lit votre base de code pour en déduire des patterns, mais c’est lors de la refactorisation que les entrées Knowledge sont les plus utiles. Ajoutez des entrées pour les conventions que Devin doit suivre :
- Patterns de routeur — “Chaque routeur de domaine utilise
Router()et est monté avecapp.use('/domain', domainRouter)à la racine” - Middleware — “Le middleware d’authentification se trouve dans
src/middleware/et est toujours importé, jamais défini inline” - Gestion des erreurs — “Tous les gestionnaires de route utilisent notre wrapper
asyncHandlerdepuissrc/lib/asyncHandler.ts— jamais de try/catch direct”
src/routes/admin.ts, qui est déjà clairement séparé” à votre prompt.Vous pouvez également demander à Devin de générer des entrées Knowledge pour vous — décrivez simplement vos conventions et il créera des entrées bien structurées que vous pourrez relire et enregistrer.Examiner la PR de Devin
Devin cartographie tous les endpoints, suit le graphe d’import, extrait la logique partagée, crée les fichiers de domaine, rebranche le routeur racine et exécute votre suite de tests. Voici à quoi ressemble généralement la PR :Voici à quoi ressemble le routeur racine simplifié après la séparation :Et un fichier de routes de domaine où le middleware partagé est correctement importé :Chaque chemin d’URL reste identique —
src/routes/index.ts (after — 15 lines)
src/routes/orders.ts (after — excerpt)
/orders est désormais géré par ordersRouter, monté sur /orders, de sorte que les clients et les tests existants continuent de fonctionner sans modification.(Facultatif) Basculez sur la branche et testez en local
Pour une refactorisation structurelle de ce type, il est préférable de récupérer la branche et de vérifier en local avant de fusionner. Ouvrez le projet dans Windsurf ou dans votre IDE préféré, lancez l’application et appelez quelques endpoints pour confirmer que le routage, le middleware et la gestion des erreurs se comportent comme auparavant.Si quelque chose vous semble incorrect, laissez un commentaire sur la PR — Devin en tiendra compte et poussera un correctif.
