⚡ Système de Publication Multi-Couches¶
Le pipeline de publication d'Instatic (server/publish/publicRouter.ts) résout le compromis historique entre la vitesse absolue du contenu statique et la flexibilité du contenu dynamique à travers 3 couches coordonnées.
🧱 Les Trois Couches de Publication¶
Visitor HTTP Request
│
▼
publicRouter.ts:renderPublicResolution
│
├── 1. Layer A : Static Bake (Symlink Swap Atomique)
│ Fichiers HTML pré-compilés dans uploads/published/current/*.html
│ → Temps de réponse < 5ms (Lecture fichier direct)
│
├── 2. Layer B : In-Memory LRU Cache
│ Routes de secours pré-calculées avec invalidation paresseuse
│ → Mise en cache par clé (urlPath, canonicalQuery, publishVersion)
│
└── 3. Layer C : Dynamic Holes (<instatic-hole>)
Injection automatique pour les composants à données temps réel
→ Runtime IntersectionObserver ultra-légère (~1.1 KB)
🔁 Layer A : Le Swap Atomique par Lien Symbolique¶
Lorsqu'un administrateur ou un agent IA déclenche la commande site_publish :
1. Le moteur génère l'ensemble des pages HTML et des bundles CSS hachés dans un répertoire slot temporaire (ex. uploads/published/slot_b/).
2. Un lien symbolique current pointe instantanément vers le nouveau slot (ln -sfn slot_b current).
3. Les requêtes des visiteurs ne subissent aucune interruption de service ni page partiellement écrite (atomicité POSIX garantie).
🕳️ Layer C : Détection Automatique des Dynamic Holes¶
Les auteurs n'ont pas besoin de configurer manuellement le mode dynamique. Le compilateur analyse l'arbre de nœuds (src/core/publisher/dynamicDetection.ts) :
- Tout module marqué dynamic: true ou lié à une source de données dépendante de la session visiteur est compilé sous la forme :
<instatic-hole data-hole-id="node_xyz123" data-version="42">
<!-- Skeleton / fallback optimisé -->
</instatic-hole>
/_instatic/hole/node_xyz123 et remplace le contenu sans ré-exécuter le reste de la page.