esbuild · SWC · Monorepo · Mac distant · 2026

2026 Pièges de build front sur Mac loué :
esbuild et SWC en monorepo — workers parallèles, cacheDir, NODE_OPTIONS et incrémental

11.04.2026 Front-end & plateforme 7 min de lecture

Public : dépôts pnpm ou npm workspacesVite, Next.js ou des scripts appellent à la fois esbuild (binaire Go) et SWC (Rust). Sur un Mac distant loué, la contention réapparaît vite : CPU sursouscrit, caches éclatés, OOM Node masqués. Ce guide propose un tableau de réglages (GOMAXPROCS, workers, cacheDir, NODE_OPTIONS, incrémental) et une checklist d’acceptation avant merge. Parcourez l’index des articles front-end et DevOps, l’accueil MacWww et la page achat / location : tout est consultable sans création de compte pour comparer les offres.

01 Pourquoi le monorepo « dérape » sur Mac distant

Apple Silicon est rapide, mais deux compilateurs natifs plus l’hôte Node peuvent encore sursouscrire les cœurs, dupliquer le travail et vider des caches chauds lorsque chaque paquet instancie son propre pool de fils d’exécution.

  1. Double parallélisme : esbuild repose sur le runtime Go ; SWC sur des fils Rust (RAYON_NUM_THREADS). Par défaut, les deux s’ouvrent « large » sans se coordonner.
  2. Dérive des chemins de cache : la CI restaure node_modules mais oublie .turbo, .swc ou les métadonnées Vite si vous n’avez pas une règle unique de cacheDir.
  3. Pression sur le tas Node : cartes source, plugins et parfois le programme TypeScript côté Node restent dans V8 ; un NODE_OPTIONS trop bas masque les OOM jusqu’aux pics de charge.

Stabilisez d’abord l’environnement ; sinon vous ne mesurez que du bruit. Croisez avec la checklist monorepo pnpm, Turborepo et miroir npm et la checklist Rspack / esbuild, cache et workers pour aligner orchestrateur et bundlers.

02 Tableau : GOMAXPROCS / workers, cacheDir, NODE_OPTIONS, incrémental

Utilisez ce tableau comme brouillon d’architecture lorsque deux paquets compilent sur un même hôte ; les drapeaux exacts suivent votre wrapper (Vite, Next, tâche maison).

Couche GOMAXPROCS / nombre de workers cacheDir (ou équivalent) NODE_OPTIONS (plafond de tas) Build incrémental (interrupteurs)
esbuild (binaire Go) Fixez GOMAXPROCS proche des cœurs physiques moins un sur Mac partagé ; plafonnez aussi la concurrence du bundler Node pour éviter l’empilement de fils. Le binaire est sans état ; persistance via caches enveloppes : node_modules/.cache/esbuild ou racine .cache/build versionnée par branche. Pas pour le cœur Go ; dimensionnez le tas pour plugins Node uniquement, ex. NODE_OPTIONS=--max-old-space-size=6144 si des hooks lourds entourent esbuild. Pas d’unique drapeau CLI « incrémental » ; l’incrémental passe par l’API ou le cache du bundler (Vite, etc.).
SWC (Rust) Réservez des vCPU : export RAYON_NUM_THREADS=6 (exemple) ; limitez les tâches Next ou Turbo pour ne pas dépasser l’hôte. Conservez .swc et .next/cache sur SSD local APFS ; évitez NFS pour les caches chauds. Ajoutez du tas lorsque TS, plugins ou source maps cohabitent avec SWC, typiquement NODE_OPTIONS=--max-old-space-size=8192 après échantillons RSS. Cache AST disque ; activez l’incrémental framework (Next, etc.) ; ne purgez pas les caches entre deux runs chauds sauf test « froid ».
Orchestrateur (Turbo, Nx, Rush) Alignez --parallel avec GOMAXPROCS + fils SWC ; réservez au moins un cœur pour sshd et l’I/O disque. Pointez TURBO_CACHE_DIR ou NX_CACHE_DIRECTORY vers un chemin unique ; hors des nettoyeurs agressifs. Définissez NODE_OPTIONS une fois en CI pour que les scripts imbriqués partagent le même plafond. Activez le cache distant seulement après preuve d’incrémental local ; les hits ne doivent pas masquer une mauvaise clé de cache.
Bloc d’environnement (exemple Mac 8 P-cores)
export GOMAXPROCS=6
export RAYON_NUM_THREADS=6
export NODE_OPTIONS="--max-old-space-size=8192"
export TURBO_CACHE_DIR="$PWD/.turbo-cache"

03 Cinq réglages avant toute mesure sérieuse

  1. Inventoriez les binaires qui touchent TypeScript ou JSX et marquez esbuild, SWC ou les deux.
  2. Choisissez une racine de cache par runner, exportez-la dans le profil shell, archivez-la dans la définition CI.
  3. Alignez GOMAXPROCS, RAYON_NUM_THREADS et les totaux de l’orchestrateur sur les cœurs réellement réservés.
  4. Sur le Mac distant, capturez un run à froid (caches propres) puis un run chaud répété dans les dix minutes.
  5. Journalisez temps mural, pic RSS, écritures disque ; joignez les courbes à la pull request.

Ajoutez un instantané de sysctl hw.ncpu et de vm_stat pour que le ticket matériel reste lisible six mois plus tard.

04 Valeurs de ticket prêtes à coller

Repères Apple Silicon (runners partagés)
  • Démarrez le tas Node autour de 8 Go pour les gros design systems ; réduisez après profilage réel.
  • Réservez un cœur pour macOS, synchro et antivirus ; soustrayez avant les plafonds de fils.
  • Les runs chauds incrémentaux coupent souvent 30 à 60 % du temps mural par rapport au froid sur NVMe local.

05 Acceptation sur Mac loué (cinq étapes)

  1. Parité SSH : deux shells, env | sort, mêmes GOMAXPROCS, RAYON_NUM_THREADS et NODE_OPTIONS avant de comparer des branches.
  2. Preuve de cache : le run chaud montre de l’activité dans cacheDir et des hits orchestrateur ; échec si tout reste froid.
  3. Contention : lancez des tests pendant le build ; le temps mural doit rester dans le budget publié.
  4. Disque : df -h ; si les caches dépassent vingt pour cent de l’espace libre, purgez les branches mortes ou les artefacts orphelins.
  5. Note de version : collez la ligne du tableau plus les temps froid/chaud pour le prochain intervenant.

Si les pics persistent malgré ces garde-fous, louez un Mac distant dédié avec CPU et NVMe isolés : la file d’attente CI disparaît et les caches restent chauds entre les merges.

06 FAQ

Augmenter GOMAXPROCS accélère-t-il toujours esbuild ?

Non : au-delà des cœurs physiques, vous payez surtout le coût de commutation du scheduler.

SWC et esbuild doivent-ils partager un seul cacheDir ?

Gardez des répertoires internes distincts (.swc vs caches enveloppe esbuild), mais un parent unique sur disque local simplifie sauvegardes et politiques de rétention.

L’incrémental est-il acceptable sur Mac distant partagé ?

Oui si les chemins sont isolés par workspace ou par utilisateur ; invalidez seulement lors des montées de version d’outillage.

Mac distant · Débit de build

Louez un Mac distant pour accélérer esbuild et SWC

Un Apple Silicon dédié réduit la mise en file et garde vos caches au chaud entre deux pipelines. Parcourez les tarifs, passez par achat / location et l’aide : accès sans connexion obligatoire pour comparer. Poursuivez sur l’index du blog ou l’accueil pour choisir une machine adaptée à vos builds monorepo.

Monorepo esbuild SWC
Louer un Mac — sans connexion