biagiojs

Idratazione adattiva

Il piano di idratazione è il cuore di biagiojs: decide quali isole ricevono JavaScript e quando lo eseguono.

I tre bucket

BucketComportamento
eagerIdrata subito dopo il primo paint
lazyIdrata su requestIdleCallback (max 1,5s) o quando entra nel viewport
staticSolo HTML — zero JS spedito

Le isole lazy vicine al viewport si idratano con IntersectionObserver (rootMargin: 200px). Lo sweep idle parte quando il browser è libero, o al massimo dopo 1,5 secondi (requestIdleCallback({ timeout: 1500 }), oppure setTimeout(1500) come fallback).

Soglie default

eager  ≥ 0.3
lazy   ≥ 0.05
static < 0.05

La priorità è interaction × businessValue. Con CrUX lento (LCP alto), le soglie si alzano automaticamente.

Override esplicito

L'attributo hydrate su <component> vince sempre sullo scheduler:

ValoreEffetto
inlineModulo embedded come data-URI — zero richieste di rete
eagerForza eager
visibleForza lazy (IntersectionObserver)
idleForza lazy (requestIdleCallback)
neverMai idratare

Ordine dei contenuti e accessibilità

La priorità di idratazione qui sopra decide quando le isole si idratano e l'ordine di preload — non l'ordine fisico del DOM. Di default il DOM è emesso in ordine di lettura (contentOrder: 'visual'), così tab order da tastiera e screen reader coincidono col layout visivo (WCAG 2.4.3 / 1.3.2).

Con contentOrder: 'priority' il sorgente HTML viene riordinato per valore business (utile con streaming SSR); l'ordine visivo è ripristinato via flex order CSS. Compromesso: il flex ordernon cambia il tab order né l'ordine per gli screen reader, quindi in questa modalità il focus da tastiera segue l'ordine del sorgente (priorità).

Runtime client

In produzione il piano è compatto:

__CVW_PLAN__ = { e: ["cta"], l: ["nav"] }

Un solo IIFE contiene piano, props, codice isole e hydration runtime. Niente waterfall di <script src>.

Signals condizionali

window.cvw (signal, effect, computed) viene incluso nel bundle solo se almeno un'isola lo usa. Pagine senza reattività → bundle più leggero.

Cosa vede il browser

  • Nodi statici: HTML puro, nessun data-cvw-id
  • Nodi interattivi: data-cvw-id="cta" sul wrapper
  • Dopo idratazione: data-cvw-hydrated=""

Consent gating

Isole con consent="marketing" (o altra categoria) restano in attesa finché l'utente non accetta. Zero JS di terze parti sul critical path. Vedi Consent & cookie.

CrUX feedback

Dati di campo lenti alzano automaticamente le soglie eager/lazy. Vedi Loop di ottimizzazione.

Benchmark

Nella demo prodotto VELOCE, biagiojs idrata 1 isola vs 9 della baseline naive che idrata tutto — −41% di JavaScript spedito, stesso risultato visivo per l'utente medio.