Skip to content
🎁
tuvix.js
tuvix.js(統合パッケージ)
1つのパッケージ、1つのimportパス。@tuvix.js/coreのオーケストレーターと、@tuvix.js/router、@tuvix.js/event-bus、@tuvix.js/loader、@tuvix.js/sandboxの公開APIを再エクスポートします。

インストール ​

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

tuvix.jsをインストールすると、@tuvix.js/core、@tuvix.js/router、@tuvix.js/event-bus、@tuvix.js/loader、@tuvix.js/sandboxがインストールされます。6つのパッケージはすべてES moduleとCommonJSのビルドを提供し、"sideEffects": falseを宣言しています。

使いどころ ​

オーケストレーターをルーター、イベントバス、サンドボックスと組み合わせて使うシェルアプリケーションには、tuvix.jsをインストールしてください。バージョン管理する依存関係とimportパスがそれぞれ1つになり、importしないエクスポートはバンドラーが取り除きます。

次の場合は、代わりにスコープ付きパッケージをインストールしてください。

  • マイクロアプリがシェルとだけやり取りする場合。@tuvix.js/event-bus単体でgetGlobalBus()を利用でき、オーケストレーターがそのnode_modulesに入りません。
  • 統合パッケージに含まれないエクスポートが必要な場合。たとえば@tuvix.js/loaderのregisterModuleやemitLifecycle、@tuvix.js/routerのpathToRegexです。含まれないものを参照してください。
  • パッケージがTuvix.jsのどの部分に依存しているかをpackage.jsonで明示したい場合。

両方を混在させても安全です。統合パッケージは同じモジュールを再エクスポートするため、tuvix.jsのgetGlobalBusと@tuvix.js/event-busのgetGlobalBusは同じバスを返し、ライフサイクルヘルパーはwindow上の1つのレジストリを共有します。

クイックスタート ​

/aboutでaboutをマウントし、リンクのクリックをルーターのナビゲーションに変換し、アプリのエラーをログに出すシェルです。

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にビルドされるaboutアプリです。

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">をクリックすると/about?ref=navがpushされ、オーケストレーターがaboutを#mainにマウントします(クエリ文字列はマッチングに影響しません)。

API ​

以下のエクスポートはすべて再エクスポートです。シグネチャ、オプション、エッジケースはリンク先のパッケージページに記載されています。

@tuvix.js/coreから ​

ドキュメント:@tuvix.js/core。

エクスポート種類内容
createOrchestrator関数Orchestratorを作成します。
Orchestratorクラスアプリを登録し、URLに合わせてreconcileし、ルーターに追従し(connectRouter)、propsを更新し、破棄します。
defineMicroApp関数{ name, bootstrap?, mount, unmount, update?, ssr? }オブジェクトを検証し、ローダー向けに登録し、tuvix:mounted / tuvix:unmounted / tuvix:errorを発行するようにします。
OrchestratorEventenumオーケストレーターがバスに発行するイベント名(tuvix:app:mount、tuvix:app:errorなど)。
OrchestratorConfig、MicroAppConfig、MicroAppDefinition型createOrchestrator、register、defineMicroAppの引数。
AppStatus、AppSandboxOption、RouterSource、RegisteredApp型アプリのステータスのunion、sandboxオプション、connectRouterの引数、アプリのレコードの形。
AppErrorEvent、AppErrorPhase型APP_ERRORのペイロード{ name, error, phase }と、そのphaseのunion('load'、'bootstrap'、'mount'、'update'、'unmount')。

@tuvix.js/event-busから ​

ドキュメント:@tuvix.js/event-bus。

エクスポート種類内容
EventBusクラスon、once、emit、off、onAnyを持つPub/Subバス。
createEventBus関数新しい独立したEventBusを作成します。
getGlobalBus関数window.__TUVIX_GLOBAL_BUS__に保存されたページ全体のバスを返します。オーケストレーターはデフォルトでこれを使います。
resetGlobalBus関数ページ全体のバスを破棄します。次のgetGlobalBus()が新しいバスを作成します。
IEventBus、EventHandler、WildcardHandler、Unsubscribe、EventBusOptions型バスのインターフェース、ハンドラーのシグネチャ、購読解除関数、コンストラクターのオプション。

@tuvix.js/routerから ​

ドキュメント:@tuvix.js/router。

エクスポート種類内容
Routerクラスパスをアプリ名に対応付けるhistoryまたはhashのルーター。
createRouter関数Routerを作成します。
matchPath関数パスをパターンとマッチさせます(:param、/*に対応し、クエリとハッシュは無視)。activeWhenの文字列はこれを使います。
matchRoute関数RouteConfig[]のうちパス全体にマッチする最初のルートを、paramsとquery付きで返します。
normalizePath関数先頭にスラッシュを付け、末尾のスラッシュを取り除きます。
interceptLinks関数同一オリジンのリンクのクリックをnavigate(path)の呼び出しに変換します。インテントに基づくプリフェッチもオプションで行えます。
resolveLink関数イベントが発生したHTMLリンクについて{ anchor, url, path }を返します。ブラウザに処理を任せるべき場合はnullを返します。
IRouter、RouterConfig、RouterMode、RouteConfig、MatchedRoute型ルーターのインターフェース、オプション、ルートの形。
NavigationEvent、NavigationGuard、RouteChangeHandler型ナビゲーションのペイロード、ガード、リスナーのシグネチャ。
PathMatch、MatchPathOptions、InterceptLinksOptions、ResolvedLink、ResolveLinkOptions型matchPathの結果とオプション、interceptLinksのオプション、resolveLinkの結果とオプション。

@tuvix.js/loaderから ​

ドキュメント:@tuvix.js/loader。

エクスポート種類内容
ModuleLoaderクラスエントリー(URL、script/styleの設定、またはローダー関数)を、タイムアウト、再試行、キャッシュ付きでロードします。
createLoader関数ModuleLoaderを作成します。
whenMounted関数アプリがmountedライフサイクルイベントを発行したときにresolveします。
onLifecycle関数tuvix:mounted、tuvix:unmounted、tuvix:errorのDOMイベントを監視します。
isMounted関数ライフサイクルイベントに基づき、アプリのいずれかのコンテナがマウントされている間はtrueです。
Entry、EntryConfig、MicroAppModule、MountContext、UnmountContext、UpdateContext型エントリーの形式と、マイクロアプリが実装するライフサイクルの契約。
LoaderOptions、LoadResult、LoadStatus、PrefetchStrategy型ローダーのオプションと結果。
LifecycleType、LifecycleDetail、LifecycleEvent型ライフサイクルイベントの名前、ペイロード、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();

@tuvix.js/sandboxから ​

ドキュメント:@tuvix.js/sandbox。

エクスポート種類内容
CssSandboxクラスコンテナをshadow rootに移し、その中でスタイルシートをロードします。オーケストレーターはsandbox: trueのときにこれを使います。
JsSandboxクラススクリプトが書き込むグローバルを実際のwindowから隔離するProxyのwindow。
SandboxクラスCssSandboxとJsSandboxを1組のactivate / deactivateの背後にまとめたもの。
createSandbox関数Sandboxを作成します。
SandboxOptions、ISandbox、ICssSandbox、IJsSandbox型サンドボックスのオプションとインターフェース。
AdoptStylesOptions、AdoptedStyles型CssSandbox.adoptStylesの引数と戻り値。

含まれないもの ​

統合パッケージには以下が含まれません。それらを提供するパッケージをインストールしてください。

必要なものインストールするもの
registerModule、unregisterModule、getRegisteredModule、emitLifecycle、hasServerMarkup、normalizeEntry、loadScript、loadStyle、removeScript、removeStyle、prefetchResource、および型EntryLoader、EntryLoaderContext、MicroAppBus、ScriptType、CacheEntry、ResourceOptions、LoadScriptOptions、LoadStyleOptions、PrefetchOptions@tuvix.js/loader
pathToRegex、parseQuery、isPathActive@tuvix.js/router
React、Vue、Svelte、Angularのマイクロアプリ@tuvix.js/react、@tuvix.js/vue、@tuvix.js/svelte、@tuvix.js/angular
サーバーサイドでの合成@tuvix.js/server
Module Federationのリモート@tuvix.js/module-federation
Viteビルドでのアイランドのアセット@tuvix.js/vite
DevToolsパネル@tuvix.js/devtools
プロジェクトのスキャフォールディングcreate-tuvix-app

エッジケース ​

  • tuvix.jsのエントリーポイントは1つです。tuvix.js/coreやtuvix.js/routerのようなサブパスのimportは解決に失敗します。tuvix.jsまたはスコープ付きパッケージからimportしてください。
  • 統合パッケージは依存関係を同じリリースに固定しています。tuvix.jsと並べて別バージョンのスコープ付きパッケージをインストールすると、そのパッケージのコピーが2つできます。getGlobalBus()とライフサイクルのレジストリは引き続きwindowを通じて状態を共有しますが、instanceof Orchestratorやinstanceof EventBusのチェックはコピー間で失敗します。
  • whenMounted、onLifecycle、isMountedはtuvix:*のDOMイベントに反応します。defineMicroAppとフレームワークアダプターのモジュールはこれらを発行しますが、手書きのモジュールは@tuvix.js/loaderのemitLifecycleを呼び出さない限り何も発行しません。ドキュメント外にあるコンテナのイベントはdocumentでディスパッチされます。
  • resetGlobalBus()は、実行中のオーケストレーターが保持しているバスを破棄します。オーケストレーターは破棄されたそのバスを保持し続けるため、そのイベントは次のgetGlobalBus()の購読者に届かなくなります。テストの合間に、orchestrator.destroy()の後で呼び出してください。
  • @tuvix.js/coreと@tuvix.js/routerの挙動の変更と破壊的変更は、そのままここにも当てはまります。0.4からの移行を参照してください。

しないこと ​

  • 独自のコードは追加しません。すべてのエクスポートは5つのスコープ付きパッケージのいずれかから来ています。
  • フレームワークアダプター、サーバーパッケージ、Module Federation、Vite、DevToolsは含まれません。
  • パッケージごとのサブパスエントリーは提供しません。