Aller au contenu

⚡ 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>
- Dès que le placeholder entre dans le viewport de l'utilisateur, le micro-runtime (~1.1 KB) effectue un fetch asynchrone sur /_instatic/hole/node_xyz123 et remplace le contenu sans ré-exécuter le reste de la page.