Skip to content
🎁
tuvix.js
tuvix.js (pacchetto ombrello)
Un pacchetto, un percorso di import. Riesporta l'orchestratore di @tuvix.js/core e le API pubbliche di @tuvix.js/router, @tuvix.js/event-bus, @tuvix.js/loader e @tuvix.js/sandbox.

Installazione ​

bash
npm install tuvix.js
# or pnpm add tuvix.js

Installare tuvix.js installa @tuvix.js/core, @tuvix.js/router, @tuvix.js/event-bus, @tuvix.js/loader e @tuvix.js/sandbox. Tutti e sei i pacchetti includono build ES module e CommonJS e dichiarano "sideEffects": false.

Quando usarlo ​

Installa tuvix.js in un'applicazione shell che usa l'orchestratore insieme al router, all'event bus o alla sandbox. Hai una sola dipendenza da versionare e un solo percorso di import, e il bundler scarta gli export che non importi mai.

Installa invece i pacchetti con scope quando:

  • Una micro app parla solo con la shell. @tuvix.js/event-bus da solo le fornisce getGlobalBus(), senza portare l'orchestratore nei suoi node_modules.
  • Ti serve un export che il pacchetto ombrello non include, come registerModule o emitLifecycle da @tuvix.js/loader, oppure pathToRegex da @tuvix.js/router. Vedi Non incluso.
  • Vuoi che il tuo package.json dichiari da quali parti di Tuvix.js dipende un pacchetto.

Puoi usarli insieme senza problemi. Il pacchetto ombrello riesporta gli stessi moduli, quindi getGlobalBus da tuvix.js e da @tuvix.js/event-bus restituiscono lo stesso bus, e gli helper del ciclo di vita condividono un unico registro su window.

Avvio rapido ​

Una shell che monta about su /about, trasforma i clic sui link in navigazioni del router e registra gli errori delle app:

ts
import { createOrchestrator, getGlobalBus, interceptLinks, OrchestratorEvent, type AppErrorEvent } from 'tuvix.js';

const orchestrator = createOrchestrator({ router: { routes: [] } });

orchestrator.register({
  name: 'about',
  entry: 'https://cdn.example.com/about/main.js',
  container: '#main',
  activeWhen: '/about',
  props: { who: 'us' },
});

getGlobalBus().on<AppErrorEvent>(OrchestratorEvent.APP_ERROR, ({ name, error, phase }) => {
  console.error(`${name} failed during ${phase}`, error);
});

await orchestrator.start();
interceptLinks({ navigate: (path) => orchestrator.navigateTo(path) });

L'app about, compilata in https://cdn.example.com/about/main.js:

ts
import { defineMicroApp } from 'tuvix.js';

export default defineMicroApp({
  name: 'about',
  mount({ container, props }) {
    container.innerHTML = `<h1>About ${String(props?.who)}</h1>`;
  },
  unmount({ container }) {
    container.replaceChildren();
  },
});

Un clic su <a href="/about?ref=nav"> esegue il push di /about?ref=nav e l'orchestratore monta about in #main (la query string non influisce sul confronto).

API ​

Ogni export qui sotto è una riesportazione. La pagina del pacchetto collegata ne documenta firma, opzioni e casi limite.

Da @tuvix.js/core ​

Documentazione: @tuvix.js/core.

ExportTipoCosa fa
createOrchestratorfunzioneCrea un Orchestrator.
OrchestratorclasseRegistra le app, le riconcilia con l'URL, segue un router (connectRouter), aggiorna le props, distrugge.
defineMicroAppfunzioneValida un oggetto { name, bootstrap?, mount, unmount, update?, ssr? }, lo registra per il loader e gli fa emettere tuvix:mounted / tuvix:unmounted / tuvix:error.
OrchestratorEventenumNomi degli eventi che l'orchestratore emette sul suo bus (tuvix:app:mount, tuvix:app:error, ...).
OrchestratorConfig, MicroAppConfig, MicroAppDefinitiontipoArgomenti di createOrchestrator, register e defineMicroApp.
AppStatus, AppSandboxOption, RouterSource, RegisteredApptipoUnion degli stati di un'app, l'opzione sandbox, l'argomento di connectRouter, la forma del record di un'app.
AppErrorEvent, AppErrorPhasetipoPayload di APP_ERROR { name, error, phase } e la union delle sue fasi ('load', 'bootstrap', 'mount', 'update', 'unmount').

Da @tuvix.js/event-bus ​

Documentazione: @tuvix.js/event-bus.

ExportTipoCosa fa
EventBusclasseBus pub/sub con on, once, emit, off, onAny.
createEventBusfunzioneCrea un nuovo EventBus separato.
getGlobalBusfunzioneRestituisce il bus a livello di pagina salvato in window.__TUVIX_GLOBAL_BUS__. L'orchestratore lo usa per impostazione predefinita.
resetGlobalBusfunzioneDistrugge il bus a livello di pagina; la chiamata successiva a getGlobalBus() ne crea uno nuovo.
IEventBus, EventHandler, WildcardHandler, Unsubscribe, EventBusOptionstipoInterfaccia del bus, firme degli handler, funzione di disiscrizione, opzioni del costruttore.

Da @tuvix.js/router ​

Documentazione: @tuvix.js/router.

ExportTipoCosa fa
RouterclasseRouter history o hash che associa i percorsi ai nomi delle app.
createRouterfunzioneCrea un Router.
matchPathfunzioneConfronta un percorso con un pattern (:param, /*, query e hash ignorati). Le stringhe di activeWhen lo usano.
matchRoutefunzioneRestituisce la prima route di un RouteConfig[] che corrisponde per intero a un percorso, con params e query.
normalizePathfunzioneAggiunge uno slash iniziale e rimuove quello finale.
interceptLinksfunzioneTrasforma i clic sui link dello stesso origin in una chiamata navigate(path), con prefetch su intenzione opzionale.
resolveLinkfunzioneRestituisce { anchor, url, path } per il link HTML su cui si è verificato un evento, oppure null quando deve gestirlo il browser.
IRouter, RouterConfig, RouterMode, RouteConfig, MatchedRoutetipoInterfaccia del router, opzioni e forme delle route.
NavigationEvent, NavigationGuard, RouteChangeHandlertipoPayload di navigazione, firme di guard e listener.
PathMatch, MatchPathOptions, InterceptLinksOptions, ResolvedLink, ResolveLinkOptionstipoRisultato e opzioni di matchPath, opzioni di interceptLinks, risultato e opzioni di resolveLink.

Da @tuvix.js/loader ​

Documentazione: @tuvix.js/loader.

ExportTipoCosa fa
ModuleLoaderclasseCarica una entry (URL, configurazione di script/stili o funzione loader) con timeout, tentativi ripetuti e cache.
createLoaderfunzioneCrea un ModuleLoader.
whenMountedfunzioneSi risolve quando un'app emette il suo evento del ciclo di vita mounted.
onLifecyclefunzioneAscolta gli eventi DOM tuvix:mounted, tuvix:unmounted o tuvix:error.
isMountedfunzionetrue finché un qualsiasi container dell'app è montato, secondo gli eventi del ciclo di vita.
Entry, EntryConfig, MicroAppModule, MountContext, UnmountContext, UpdateContexttipoFormati di entry e il contratto del ciclo di vita che una micro app implementa.
LoaderOptions, LoadResult, LoadStatus, PrefetchStrategytipoOpzioni e risultati del loader.
LifecycleType, LifecycleDetail, LifecycleEventtipoNomi degli eventi del ciclo di vita, payload e tipo dell'evento DOM.
ts
import { onLifecycle, whenMounted } from 'tuvix.js';

const off = onLifecycle('error', ({ name, error }) => console.error(name, error));

const { container, hydrated } = await whenMounted('footer', { signal: AbortSignal.timeout(5000) });
console.log(container.id, hydrated);
off();

Da @tuvix.js/sandbox ​

Documentazione: @tuvix.js/sandbox.

ExportTipoCosa fa
CssSandboxclasseSposta un container in una shadow root e carica i fogli di stile al suo interno. L'orchestratore la usa per sandbox: true.
JsSandboxclassewindow proxy che tiene le variabili globali scritte da uno script lontane dal window reale.
SandboxclasseCssSandbox e JsSandbox dietro un'unica coppia activate / deactivate.
createSandboxfunzioneCrea una Sandbox.
SandboxOptions, ISandbox, ICssSandbox, IJsSandboxtipoOpzioni e interfacce delle sandbox.
AdoptStylesOptions, AdoptedStylestipoArgomento e valore di ritorno di CssSandbox.adoptStyles.

Non incluso ​

Il pacchetto ombrello non include questi elementi. Installa il pacchetto che li fornisce.

Ti serveInstalla
registerModule, unregisterModule, getRegisteredModule, emitLifecycle, hasServerMarkup, normalizeEntry, loadScript, loadStyle, removeScript, removeStyle, prefetchResource e i tipi EntryLoader, EntryLoaderContext, MicroAppBus, ScriptType, CacheEntry, ResourceOptions, LoadScriptOptions, LoadStyleOptions, PrefetchOptions@tuvix.js/loader
pathToRegex, parseQuery, isPathActive@tuvix.js/router
Micro app React, Vue, Svelte o Angular@tuvix.js/react, @tuvix.js/vue, @tuvix.js/svelte, @tuvix.js/angular
Composizione lato server@tuvix.js/server
Remote di Module Federation@tuvix.js/module-federation
Asset delle island nelle build Vite@tuvix.js/vite
Il pannello DevTools@tuvix.js/devtools
Scaffolding del progettocreate-tuvix-app

Casi limite ​

  • tuvix.js ha un solo entry point. Gli import di sottopercorsi come tuvix.js/core o tuvix.js/router non si risolvono: importa da tuvix.js o dal pacchetto con scope.
  • Il pacchetto ombrello fissa le sue dipendenze alla stessa release. Se installi tuvix.js accanto a una versione diversa di un pacchetto con scope, ottieni due copie di quel pacchetto. getGlobalBus() e il registro del ciclo di vita condividono comunque lo stato tramite window, ma i controlli instanceof Orchestrator o instanceof EventBus falliscono tra le due copie.
  • whenMounted, onLifecycle e isMounted reagiscono agli eventi DOM tuvix:*. I moduli creati con defineMicroApp e gli adapter per i framework li emettono; un modulo scritto a mano non ne emette nessuno, a meno che non chiami emitLifecycle da @tuvix.js/loader. Gli eventi per un container fuori dal documento vengono emessi su document.
  • resetGlobalBus() distrugge il bus usato da un orchestratore in esecuzione. L'orchestratore conserva quel bus distrutto, quindi i suoi eventi non raggiungono più chi si iscrive al successivo getGlobalBus(). Chiamalo tra un test e l'altro, dopo orchestrator.destroy().
  • Le modifiche di comportamento e le breaking change di @tuvix.js/core e @tuvix.js/router valgono anche qui senza variazioni. Vedi Migrazione dalla 0.4.

Cosa non fa ​

  • Non aggiunge codice proprio. Ogni export proviene da uno dei cinque pacchetti con scope.
  • Non include gli adapter per i framework, il pacchetto server, Module Federation, Vite o DevTools.
  • Non offre entry di sottopercorso per i singoli pacchetti.