Pithos vs Effect : des domaines bien distincts
La plupart des projets TypeScript n'ont pas besoin d'un runtime d'effets complet. Si vous cherchez une alternative légère, Pithos pourrait être ce qu'il vous faut. Qu'en-est-t-il de votre projet ?
Pithos et Effect résolvent des problèmes à des échelles différentes : Pithos fournit des utilitaires légers et modulaires pour les cas d'usage courants (80% des projets), tandis qu'Effect est un framework complet pour orchestrer des systèmes complexes (les 20% restants). Si vous vous demandez lequel choisir, Pithos devrait vous suffire dans la plupart des cas !
Effect est un framework de programmation fonctionnelle complet pour TypeScript, souvent comparé à ZIO dans l'écosystème JS. Il fournit un runtime avec injection de dépendances, concurrence structurée, streams, et tout un écosystème de packages plateforme. C'est un engagement architectural puissant, mais qui vient avec une courbe d'apprentissage importante et un poids conceptuel non négligeable.
Pithos est un écosystème modulaire léger. Vous choisissez les modules dont vous avez besoin (utilitaires, validation, gestion d'erreurs) et vous ne livrez que ce que vous utilisez. Pas de runtime, pas de lock-in, pas de paradigme à apprendre. Des APIs familières, zéro configuration, productivité immédiate.
Premier coup d'oeil
| Aspect | Pithos | Effect |
|---|---|---|
| Philosophie | Écosystème modulaire | Runtime FP complet |
| Impact bundle | Imports par fonction | Imports par module (175+ namespaces) |
| Courbe d'apprentissage | Faible : APIs familières (style Lodash, Zod, Neverthrow) | Difficile : nouveau paradigme (effets, layers, fibers) |
| Gestion d'erreurs | Result, Either, Option, CodedError | Effect<A, E, R>, Cause, Defects |
| Validation | Kanon (style Zod, compilation JIT) | Schema (bidirectionnel, basé AST) |
| Concurrence | Helpers async légers (retry, parallel, guard) | Fibers, streams, queues, sémaphores, STM |
| DI | Aucune (hors périmètre) | Système Context + Layer |
| Alternative Lodash | Oui (Arkhe) | Non |
| Migration vers natif | Oui (Taphos) | Non |
| Runtime requis | Non | Oui |
| Dépendances | Zéro | @standard-schema/spec, fast-check |
Objectifs communs (~25% d'Effect)
Les deux partagent certaines briques de base. Le recouvrement représente environ un quart de ce qu'Effect propose.
Either & Option
Les deux fournissent des types union discriminés pour succès/échec et présence/absence. L'API de base est similaire. La différence est dans ce que chaque lib met autour : Effect ajoute l'égalité structurelle, le hashing, la syntaxe gen(), et l'interface Pipeable. Pithos reste sur des objets littéraux simples, sans chaîne de prototypes, sans surcharge conceptuelle.
pipe
Les deux implémentent un pipe typé avec surcharges. Effect fournit en plus dual() pour que chaque fonction supporte data-first et data-last.
Pithos utilise le style data-first : la donnée est toujours le premier argument. C'est la convention la plus naturelle en JavaScript, pas besoin de pipe pour que le code soit lisible.
Utilitaires Array, String, Object
| Catégorie | Pithos | Effect |
|---|---|---|
| Array (chunk, zip, groupBy, partition...) | Large couverture (Arkhe) | Couverture essentielle |
| String (conversion de casse, template, truncate...) | Large couverture (Arkhe) | Couverture limitée |
| Object (pick, omit, mapValues, deepClone...) | Large couverture (Arkhe) | Couverture essentielle (Record) |
| Prédicats & guards | Large couverture | Couverture essentielle |
Pithos a une couverture plus large, plus proche de Lodash. Effect couvre l'essentiel mais ce n'est pas son terrain de jeu principal.
Validation
Les deux fournissent de la validation de schéma avec inférence TypeScript :
- Kanon a une ergonomie style Zod avec compilation JIT.
- Effect Schema a plus de fonctionnalités (transformations bidirectionnelles, introspection AST, génération arbitraire) mais avec plus de complexité, un poids bundle plus imposant, et des performances réduites.
Les deux permettent également de composer validation + error handling. Avec Pithos, ensure() combine Kanon et Zygos pour retourner un Result<T, string>. Avec Effect, Schema.decode() retourne directement un Effect<A, ParseError, R>. Même concept, approches différentes : Pithos reste sur des valeurs sans runtime, Effect intègre ça dans le type Effect avec tracking de dépendances.
Le trade-off est clair : Vous pourriez bien vous contenter de Kanon pour une meilleure DX et UX (taille bundle + performances), et vous orienter vers Effect Schema si vous avez besoin de fonctionnalités avancées.
Performances de validation
Sur des scénarios réels, Kanon V3.0 est systématiquement 2x à 6x plus rapide qu'Effect Schema. L'écart se creuse sur les schémas complexes avec objets imbriqués, tableaux et validation conditionnelle.
| Test | @kanon/V3.0 | @kanon/JIT | Effect |
|---|---|---|---|
| Critique | |||
Login Form Validation CRITICAL | 5 pts | 7.30M ops/s (1.47x) | 10.75M ops/s le plus rapide | 2.69M ops/s (3.99x) |
Payment Form (conditional validation) CRITICAL | 5 pts | 5.54M ops/s (3.54x) | 19.57M ops/s le plus rapide | 861.76K ops/s (22.71x) |
User Registration (with password confirm) CRITICAL | 5 pts | 5.04M ops/s (1.26x) | 6.37M ops/s le plus rapide | 1.04M ops/s (6.1x) |
| Élevé | |||
API Response (discriminated union) HIGH | 3 pts | 8.54M ops/s (3.06x) | 26.14M ops/s le plus rapide | 2.88M ops/s (9.07x) |
Blog Post with Comments HIGH | 3 pts | 2.53M ops/s (2.64x) | 6.70M ops/s le plus rapide | 570.87K ops/s (11.73x) |
E-commerce Product HIGH | 3 pts | 4.93M ops/s (2.92x) | 14.40M ops/s le plus rapide | 803.89K ops/s (17.92x) |
Event Booking HIGH | 3 pts | 1.65M ops/s (5.57x) | 9.16M ops/s le plus rapide | 379.42K ops/s (24.15x) |
Invalid Login (error handling) HIGH | 3 pts | 5.76M ops/s (1.61x) | 9.26M ops/s le plus rapide | 265.91K ops/s (34.81x) |
| Moyen | |||
Search Params (with coercion) MEDIUM | 1 pts | 5.05M ops/s (4.63x) | 23.37M ops/s le plus rapide | 1.36M ops/s (17.23x) |
User Profile Update (optional fields) MEDIUM | 1 pts | 6.02M ops/s (3.08x) | 18.58M ops/s le plus rapide | 2.72M ops/s (6.84x) |
C'est logique : Kanon compile les validateurs en fonctions optimisées, Effect Schema interprète un AST à l'exécution. Effect échange la vitesse brute contre des transformations bidirectionnelles et l'introspection. Si vous en avez besoin, c'est un bon trade-off. Si vous n'en avez pas besoin, c'est du poids mort.
Pour les résultats complets avec toutes les bibliothèques, voir les benchmarks de performance Kanon.
Ce qu'Effect fait et que Pithos ne cherche pas à faire
Ce n'est pas une lacune. C'est un périmètre différent.
Effect fournit un ensemble de capacités qui relèvent du framework, pas de l'écosystème utilitaire :
- Effect<A, E, R> : un type qui encode succès, erreur ET dépendances. Le compilateur suit les prérequis à travers la composition.
- Layer & Context : injection de dépendances typée avec composition de services.
- Fiber & concurrence structurée : threads légers avec annulation, supervision et gestion des ressources.
- Stream & Channel : traitement réactif avec backpressure.
- STM : mémoire transactionnelle logicielle pour l'état concurrent.
- Schedule : politiques déclaratives de retry et de répétition.
- Observabilité : metrics, tracing, logging intégrés.
- Packages plateforme : adaptateurs Node, Bun, navigateur avec système de fichiers typé, HTTP, etc.
- Intégrations first-party : SQL, RPC, CLI, AI.
Si votre projet a besoin de tout ça, Effect est un choix solide. Pithos ne joue pas sur ce terrain, et c'est intentionnel.
Ce que Pithos fait et qu'Effect ne couvre pas
- Alternative à Lodash : Arkhe fournit des utilitaires plus légers et plus performants que lodash. Effect ne joue pas sur ce terrain.
- Migration vers natif : Taphos fournit un chemin de migration progressive depuis Lodash jusqu'au natif.
- Taille du bundle : Chaque fonction Pithos est importable indépendamment. Vous ne payez que ce que vous utilisez, littéralement.
- Compatibilité Neverthrow : Zygos Result est un drop-in 100% compatible avec l'API de Neverthrow. Pas d'équivalent côté Effect.
- Validation compilée JIT : Kanon compile les validateurs à l'exécution pour un débit maximal. Effect Schema interprète un AST.
- Zéro runtime : Pithos, ce sont des fonctions. Pas de runtime à démarrer, pas de framework à apprendre, pas de mental model à acquérir avant d'être productif.
Quand choisir quoi
Règle simple : si vous vous posez la question, commencez par Pithos. Vous saurez très vite si vous avez besoin d'Effect (et ce sera évident - injection de dépendances complexe, concurrence structurée, orchestration de services distribués). Pour tout le reste, Pithos suffit largement.
Choisissez Pithos si :
- Vous voulez remplacer Lodash, Zod ou Neverthrow par des alternatives plus légères et plus rapides
- La taille du bundle compte (apps web, dashboards, edge functions)
- Vous voulez des APIs familières avec une courbe d'apprentissage quasi nulle
- Vous avez besoin d'utilitaires, de validation ou de gestion d'erreurs, pas d'un système d'effets
- Vous construisez une application ou une bibliothèque et vous n'avez pas envie d'un framework pour vos utils
Choisissez Effect si :
- Vous construisez des services backend complexes avec beaucoup de dépendances à orchestrer
- Vous avez besoin de concurrence structurée (fibers, annulation, gestion des ressources)
- Vous voulez de l'injection de dépendances typée au niveau framework
- Vous êtes prêt à investir dans un nouveau paradigme, et votre équipe aussi
- Vous avez besoin de l'écosystème complet (SQL, RPC, OpenTelemetry, etc.)
Les deux :
Pithos n'a pas de runtime et pas d'état global. Rien n'empêche d'utiliser Arkhe pour vos utilitaires et Kanon pour la validation des entrées API, tout en laissant Effect gérer l'orchestration de services. Ils se composent sans friction.
Pour aller plus loin
- Benchmarks de performance Kanon : résultats complets avec toutes les bibliothèques
- Zygos vs Neverthrow : comparaison du remplacement drop-in Result
- Kanon vs Zod : comparaison des bibliothèques de validation
- Arkhe vs Lodash : comparaison des bibliothèques utilitaires
- Vue d'ensemble des comparaisons : quand utiliser chaque module Pithos
- Table d'équivalence : équivalences complètes entre tous les modules