Si vous avez travaillé avec React 18+ et Next.js, vous connaissez les directives"use client" et"use server". Ces annotations magiques au début d'un fichier déclenchent des comportements spécifiques au moment du build.
Mais que se passerait-il si vous pouviez créer vos propres directives ? C'est exactement ce que propose use-nemo, un plugin Vite créé par Adem Kouki qui ouvre un monde de possibilités pour automatiser et standardiser des patterns récurrents dans vos projets React.
1. Le Concept : Des Directives Personnalisées au Build Time
🎯 L'Idée Géniale
use-nemo intercepte votre code source pendant le build Vite et recherche des patterns de type "use xxx". Quand il en trouve un, il exécute un handler personnalisé qui peut :
- →Injecter du code automatiquement (logs, analytics, tracking)
- →Ajouter des imports nécessaires
- →Transformer le code selon vos règles métier
- →Documenter avec des commentaires automatiques
Exemple : Une directive "use analytics"
// src/components/CheckoutPage.tsx
"use analytics";
export function CheckoutPage() {
return <div>Checkout...</div>;
}
// 🔮 Au build, use-nemo injecte automatiquement :
// - Le tracking de page view
// - Les événements e-commerce
// - Le monitoring de performance2. Installation et Configuration
Prérequis
- • Projet Vite + React (TypeScript recommandé)
- • Node.js 18+
- • Vite 5.x ou supérieur
Installation
npm install use-nemo # ou avec pnpm pnpm add use-nemo
Configuration vite.config.ts
// vite.config.ts
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import customDirectives from 'use-nemo';
export default defineConfig({
plugins: [
customDirectives(), // ← Ajouter AVANT react()
react()
],
});3. Créer Votre Première Directive
Créons une directive "use debug"qui injecte automatiquement des logs de développement dans vos composants.
src/directives/useDebug.ts
import { directiveRegistry, injectCode } from 'use-nemo';
import type { DirectiveHandler } from 'use-nemo';
const useDebugDirective: DirectiveHandler = {
name: 'debug', // → "use debug"
handler({ code, id }) {
console.log(`[useDebug] Processing: ${id}`);
return injectCode(code, () => {
console.log('🐛 [DEBUG] Component mounted:',
window.location.pathname);
console.log('🐛 [DEBUG] Timestamp:',
new Date().toISOString());
});
},
};
directiveRegistry.register(useDebugDirective);Utilisation dans un composant
// src/components/Dashboard.tsx
"use debug";
export function Dashboard() {
return (
<div>
<h1>Dashboard</h1>
{/* Le code de debug est injecté automatiquement */}
</div>
);
}💡 Insight VOID
L'injection se fait au build time, pas au runtime. Cela signifie que vous pouvez conditionner l'injection selon process.env.NODE_ENV pour n'inclure le code de debug qu'en développement.
4. Cas d'Usage Avancés pour l'Entreprise
Au-delà des exemples ludiques, use-nemo ouvre des possibilités intéressantes pour standardiser des patterns dans des projets d'entreprise.
"use analytics"
Injectez automatiquement le tracking Google Analytics, Mixpanel ou Segment dans vos pages clés sans polluer votre code métier.
- • Page views automatiques
- • Événements e-commerce
- • User properties
"use feature-flag"
Conditionnez l'inclusion de code selon des feature flags définis au build time (LaunchDarkly, Unleash, etc.).
- • A/B testing
- • Rollout progressif
- • Code mort automatiquement supprimé
"use auth-guard"
Injectez automatiquement les vérifications d'authentification et les redirections pour les pages protégées.
- • Vérification de session
- • Redirection automatique
- • Logging des accès
"use performance"
Injectez le monitoring de performance (Web Vitals, Sentry, Datadog) dans vos composants critiques.
- • LCP, FID, CLS tracking
- • Error boundaries
- • Render profiling
5. API et Helpers Disponibles
| Helper | Description | Usage |
|---|---|---|
| injectCode() | Injecte du code exécutable | Logs, tracking, side effects |
| injectImport() | Ajoute un import en haut du fichier | Dépendances automatiques |
| injectComment() | Ajoute un commentaire | Documentation, warnings |
Interface DirectiveHandler
interface DirectiveHandler {
name: string; // Sans le préfixe "use"
handler(context: DirectiveContext): string | null;
}
interface DirectiveContext {
code: string; // Code source du fichier
id: string; // Chemin du fichier
directiveName: string; // Nom de la directive
}6. Limites et Considérations
✓ Points Forts
- • API simple et intuitive
- • Injection au build time (pas de runtime overhead)
- • TypeScript natif
- • Extensible à l'infini
- • Parfait pour standardiser des patterns
⚠ Limites Actuelles
- • Vite uniquement (pas de support Webpack/Turbopack)
- • Projet récent (79 stars GitHub)
- • Documentation minimale
- • Pas de support Next.js natif
- • Debugging des transformations complexe
🎯 Recommandation VOID
use-nemo est idéal pour des projets Vite internes où vous contrôlez la stack et souhaitez standardiser des patterns cross-cutting (analytics, logging, feature flags). Pour des projets Next.js, les Server Actions et les conventions natives restent plus appropriées.
7. Conclusion : Un Outil de Niche Mais Puissant
use-nemo illustre parfaitement la philosophie de l'écosystème JavaScript : si un pattern vous manque, créez-le. Né d'un mème (le fameux "use nemo" 🐟), cette bibliothèque offre une solution élégante pour étendre le système de directives de React.
Pour les équipes qui travaillent sur des projets Vite avec des besoins récurrents d'injection de code (analytics, monitoring, feature flags), use-nemo peut significativement réduire le boilerplate et améliorer la cohérence du codebase.
Questions Fréquentes
- use-nemo fonctionne-t-il avec Next.js ?
- Non directement. use-nemo est un plugin Vite, et Next.js utilise Webpack ou Turbopack. Pour Next.js, utilisez les directives natives ("use client", "use server") ou créez des Higher-Order Components.
- Peut-on utiliser plusieurs directives dans un même fichier ?
- Oui. Chaque directive est traitée indépendamment. Vous pouvez combiner
"use debug"et"use analytics"dans le même composant. - Le code injecté impacte-t-il les performances ?
- Cela dépend de ce que vous injectez. L'injection elle-même se fait au build time (0 overhead). Mais le code injecté s'exécute au runtime, donc évitez les opérations lourdes.
- Comment débugger les transformations ?
- Ajoutez des
console.logdans votre handler pour voir les transformations pendant le build. Vous pouvez aussi inspecter les fichiers générés dans le dossier.viteoudist.