Skip to content
🎁
tuvix.js
tuvix.js (Şemsiye paket)
Tek paket, tek import yolu. @tuvix.js/core paketindeki orchestrator'ı ve @tuvix.js/router, @tuvix.js/event-bus, @tuvix.js/loader ile @tuvix.js/sandbox paketlerinin public API'lerini yeniden dışa aktarır.

Kurulum ​

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

tuvix.js kurulduğunda @tuvix.js/core, @tuvix.js/router, @tuvix.js/event-bus, @tuvix.js/loader ve @tuvix.js/sandbox de kurulur. Altı paketin hepsi ES module ve CommonJS build'leriyle gelir ve "sideEffects": false bildirir.

Ne zaman kullanılır ​

Orchestrator'ı router, event bus veya sandbox ile birlikte kullanan bir shell uygulamasına tuvix.js kurun. Sürümünü takip edeceğiniz tek bir bağımlılık ve tek bir import yolu olur; hiç import etmediğiniz export'ları bundler'ınız atar.

Şu durumlarda bunun yerine scope'lu paketleri kurun:

  • Bir mikro uygulama yalnızca shell ile konuşuyor. Tek başına @tuvix.js/event-bus ona getGlobalBus() fonksiyonunu verir ve orchestrator'ı node_modules klasörüne çekmez.
  • Şemsiye paketin dışarıda bıraktığı bir export'a ihtiyacınız var; örneğin @tuvix.js/loader paketindeki registerModule veya emitLifecycle, ya da @tuvix.js/router paketindeki pathToRegex. Bkz. Dahil olmayanlar.
  • Bir paketin Tuvix.js'in hangi parçalarına bağlı olduğunu package.json dosyanızda açıkça görmek istiyorsunuz.

İkisini karıştırmak güvenlidir. Şemsiye paket aynı modülleri yeniden dışa aktarır. Bu yüzden tuvix.js ve @tuvix.js/event-bus paketlerinden gelen getGlobalBus aynı bus'ı döndürür, lifecycle yardımcıları da window üzerindeki tek bir kaydı paylaşır.

Hızlı başlangıç ​

about uygulamasını /about adresinde mount eden, link tıklamalarını router navigasyonuna çeviren ve uygulama hatalarını loglayan bir shell:

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) });

https://cdn.example.com/about/main.js adresine build edilen about uygulaması:

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();
  },
});

<a href="/about?ref=nav"> linkine tıklamak /about?ref=nav adresini push eder ve orchestrator about uygulamasını #main içine mount eder (query string eşleşmeyi etkilemez).

API ​

Aşağıdaki her export bir yeniden dışa aktarımdır. Bağlantı verilen paket sayfası imzasını, seçeneklerini ve sınır durumlarını belgeler.

@tuvix.js/core paketinden ​

Belgeler: @tuvix.js/core.

ExportTürNe yapar
createOrchestratorfonksiyonBir Orchestrator oluşturur.
OrchestratorsınıfUygulamaları kaydeder, URL'e göre reconcile eder, bir router'ı takip eder (connectRouter), props'u günceller, kendini yok eder.
defineMicroAppfonksiyonBir { name, bootstrap?, mount, unmount, update?, ssr? } nesnesini doğrular, loader için kaydeder ve tuvix:mounted / tuvix:unmounted / tuvix:error olaylarını tetiklemesini sağlar.
OrchestratorEventenumOrchestrator'ın kendi bus'ında yayınladığı olay adları (tuvix:app:mount, tuvix:app:error, ...).
OrchestratorConfig, MicroAppConfig, MicroAppDefinitiontipcreateOrchestrator, register ve defineMicroApp argümanları.
AppStatus, AppSandboxOption, RouterSource, RegisteredApptipUygulama durumu union'ı, sandbox seçeneği, connectRouter argümanı, uygulama kaydının yapısı.
AppErrorEvent, AppErrorPhasetipAPP_ERROR payload'ı { name, error, phase } ve aşama union'ı ('load', 'bootstrap', 'mount', 'update', 'unmount').

@tuvix.js/event-bus paketinden ​

Belgeler: @tuvix.js/event-bus.

ExportTürNe yapar
EventBussınıfon, once, emit, off, onAny metotlarıyla pub/sub bus.
createEventBusfonksiyonYeni ve ayrı bir EventBus oluşturur.
getGlobalBusfonksiyonwindow.__TUVIX_GLOBAL_BUS__ üzerinde saklanan sayfa genelindeki bus'ı döndürür. Orchestrator varsayılan olarak bunu kullanır.
resetGlobalBusfonksiyonSayfa genelindeki bus'ı yok eder; sonraki getGlobalBus() çağrısı yenisini oluşturur.
IEventBus, EventHandler, WildcardHandler, Unsubscribe, EventBusOptionstipBus arayüzü, handler imzaları, abonelik iptal fonksiyonu, constructor seçenekleri.

@tuvix.js/router paketinden ​

Belgeler: @tuvix.js/router.

ExportTürNe yapar
RoutersınıfPath'leri uygulama adlarına eşleyen history veya hash router.
createRouterfonksiyonBir Router oluşturur.
matchPathfonksiyonBir path'i bir pattern ile eşleştirir (:param, /*; query ve hash yok sayılır). activeWhen string'leri bunu kullanır.
matchRoutefonksiyonBir RouteConfig[] içinde path ile tam eşleşen ilk route'u params ve query ile döndürür.
normalizePathfonksiyonBaşa bir eğik çizgi ekler, sondakini kaldırır.
interceptLinksfonksiyonAynı origin'e giden link tıklamalarını bir navigate(path) çağrısına çevirir; isteğe bağlı olarak niyet üzerine prefetch yapar.
resolveLinkfonksiyonOlayın gerçekleştiği HTML linki için { anchor, url, path } döndürür; linki tarayıcının işlemesi gerekiyorsa null döndürür.
IRouter, RouterConfig, RouterMode, RouteConfig, MatchedRoutetipRouter arayüzü, seçenekleri ve route yapıları.
NavigationEvent, NavigationGuard, RouteChangeHandlertipNavigasyon payload'ı, guard ve listener imzaları.
PathMatch, MatchPathOptions, InterceptLinksOptions, ResolvedLink, ResolveLinkOptionstipmatchPath sonucu ve seçenekleri, interceptLinks seçenekleri, resolveLink sonucu ve seçenekleri.

@tuvix.js/loader paketinden ​

Belgeler: @tuvix.js/loader.

ExportTürNe yapar
ModuleLoadersınıfBir entry'yi (URL, script/stil yapılandırması veya loader fonksiyonu) timeout, yeniden deneme ve önbellekleme ile yükler.
createLoaderfonksiyonBir ModuleLoader oluşturur.
whenMountedfonksiyonBir uygulama mounted lifecycle olayını yayınladığında resolve olur.
onLifecyclefonksiyontuvix:mounted, tuvix:unmounted veya tuvix:error DOM olaylarını dinler.
isMountedfonksiyonLifecycle olaylarına göre uygulamanın herhangi bir container'ı mount edilmiş durumdayken true döner.
Entry, EntryConfig, MicroAppModule, MountContext, UnmountContext, UpdateContexttipEntry biçimleri ve bir mikro uygulamanın uyguladığı lifecycle sözleşmesi.
LoaderOptions, LoadResult, LoadStatus, PrefetchStrategytipLoader seçenekleri ve sonuçları.
LifecycleType, LifecycleDetail, LifecycleEventtipLifecycle olay adları, payload'ı ve DOM olay tipi.
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();

@tuvix.js/sandbox paketinden ​

Belgeler: @tuvix.js/sandbox.

ExportTürNe yapar
CssSandboxsınıfBir container'ı shadow root içine taşır ve stil dosyalarını onun içinde yükler. Orchestrator sandbox: true için bunu kullanır.
JsSandboxsınıfBir script'in yazdığı global'leri gerçek window nesnesinden uzak tutan proxy window.
SandboxsınıfCssSandbox ve JsSandbox sınıflarını tek bir activate / deactivate çiftinin arkasında toplar.
createSandboxfonksiyonBir Sandbox oluşturur.
SandboxOptions, ISandbox, ICssSandbox, IJsSandboxtipSandbox'ların seçenekleri ve arayüzleri.
AdoptStylesOptions, AdoptedStylestipCssSandbox.adoptStyles argümanı ve dönüş değeri.

Dahil olmayanlar ​

Şemsiye paket bunları dışarıda bırakır. Onları sağlayan paketi kurun.

İhtiyacınız olanKurulacak paket
registerModule, unregisterModule, getRegisteredModule, emitLifecycle, hasServerMarkup, normalizeEntry, loadScript, loadStyle, removeScript, removeStyle, prefetchResource ve EntryLoader, EntryLoaderContext, MicroAppBus, ScriptType, CacheEntry, ResourceOptions, LoadScriptOptions, LoadStyleOptions, PrefetchOptions tipleri@tuvix.js/loader
pathToRegex, parseQuery, isPathActive@tuvix.js/router
React, Vue, Svelte veya Angular mikro uygulamaları@tuvix.js/react, @tuvix.js/vue, @tuvix.js/svelte, @tuvix.js/angular
Sunucu tarafında birleştirme@tuvix.js/server
Module Federation remote'ları@tuvix.js/module-federation
Vite build'lerinde island asset'leri@tuvix.js/vite
DevTools paneli@tuvix.js/devtools
Proje iskeleticreate-tuvix-app

Sınır durumlar ​

  • tuvix.js paketinin tek bir giriş noktası vardır. tuvix.js/core veya tuvix.js/router gibi alt yol import'ları çözümlenemez; tuvix.js paketinden ya da scope'lu paketten import edin.
  • Şemsiye paket bağımlılıklarını aynı sürüme sabitler. tuvix.js paketini scope'lu bir paketin farklı bir sürümünün yanına kurarsanız o paketin iki kopyası olur. getGlobalBus() ve lifecycle kaydı window üzerinden state paylaşmaya devam eder, ama instanceof Orchestrator veya instanceof EventBus kontrolleri kopyalar arasında başarısız olur.
  • whenMounted, onLifecycle ve isMounted, tuvix:* DOM olaylarına tepki verir. Bu olayları defineMicroApp ile oluşturulan modüller ve framework adaptörleri tetikler; elle yazılmış bir modül, @tuvix.js/loader paketindeki emitLifecycle fonksiyonunu çağırmadıkça hiçbirini tetiklemez. Belgenin dışındaki bir container'ın olayları document üzerinde tetiklenir.
  • resetGlobalBus(), çalışan bir orchestrator'ın tuttuğu bus'ı yok eder. Orchestrator bu yok edilmiş bus'ı tutmaya devam eder, bu yüzden olayları bir sonraki getGlobalBus() bus'ının abonelerine artık ulaşmaz. Bunu testler arasında, orchestrator.destroy() sonrasında çağırın.
  • @tuvix.js/core ve @tuvix.js/router paketlerindeki davranış değişiklikleri ve breaking change'ler burada da aynen geçerlidir. Bkz. 0.4 sürümünden geçiş.

Ne yapmaz ​

  • Kendine ait kod eklemez. Her export beş scope'lu paketten birinden gelir.
  • Framework adaptörlerini, sunucu paketini, Module Federation'ı, Vite'ı veya DevTools'u içermez.
  • Paket başına alt yol entry'leri sunmaz.