アーキテクチャ
Rust ホスト、ローカル Node ランタイム、WebView レンダラーの関係。
Murasaki は 3 層のデスクトップランタイムです。React は OS の WebView で描画され、 アプリのバックエンドコードは同梱された Node.js プロセスで実行され、小さな Rust ホストがネイティブウィンドウとアプリのライフサイクルを管理します。
┌─────────────── ネイティブアプリ ────────────────┐
│ │
│ Rust host (tao / wry / muda) │
│ windows · WebViews · native menu · update handoff│
│ │ │
│ │ 起動 / 監視 │
│ ▼ │
│ Local Node runtime │
│ src/main.ts · use-main · use-server · API route│
│ │ │
│ │ 認証付き loopback HTTP │
│ ▼ │
│ OS WebView │
│ React 19 · Murasaki router · renderer code │
│ │
└─────────────────────────────────────────────────┘これは Electron の Chromium + Node レンダラーモデルとは異なります。レンダラーに
Node グローバルはありません。ファイル、DB、ソケット、Worker、シークレットを扱う
コードは src/main.ts、'use main' モジュール、
'use server' アクション、または
src/api/ ルートに置きます。
各レイヤーの責務
| レイヤー | 担当 | 担当しないもの |
|---|---|---|
| Rust ホスト | native event loop、宣言済みapp window、window別navigation / capability policy、OS open request normalize、menu、Node子process監視、更新の最終適用 | business logic、React state |
| ローカル Node | Main lifecycle、登録済みURL / file処理、Action、API route、更新検証、app resource / data | 任意native windowの動的生成 |
| レンダラー | UI、routing、browser API、型付きbackend call、許可済み宣言windowの操作 | filesystem・Node・native moduleへの直接access |
Murasaki は 1.0 未満です。宣言windowには独立したdeny-by-default command allowlistが
ありますが、capability argumentやpath / URL scopeはpolicy制御されません。packaged
macOS / Windows appはsingle instanceを強制し、URL scheme / file associationを登録して、
一致するactivationをNode MainのopenRequested()へ渡せます。本番設計を確定する前に
プラットフォームと機能の状況を
確認してください。
開発時とパッケージ後
コードの境界は同じですが、実行するホストが異なります。
murasaki dev | パッケージ済みアプリ | |
|---|---|---|
| Web アセット | HMR 付き Vite dev server | 同梱 Node が dist/client を配信 |
| Node バックエンド | Vite 子プロセス | アプリ内のポータブル Node |
| ネイティブホスト | CLI が @murasakijs/native をロード | 単体の Rust launcher |
| 宣言window | 個別dev WebViewとして全routeを作成 | resolved bundle metadataから全routeを作成 |
| Main entry | Vite SSR で読み込み、entry の変更で hot reload | server/main.mjs にコンパイル |
| バックエンド呼び出し | Vite middleware | 同梱 loopback HTTP server |
| URL / file 登録 | dev mode では OS に登録しない | macOS app metadata または Windows installer registry |
本番では appId から決めた loopback port を使うため、起動をまたいでレンダラーの
origin が安定します。Windows の WebView2 profile も appId ごとに分離されます。
リリース後は appId を安易に変更しないでください。データパス、WebView profile、
bundle identity、single-instance lock、ローカル origin が変わる可能性があります。
Next.js 風であり、Next.js そのものではない
src/app、layout、route handler、directive、React 19 といった慣れた規約を採用して
いますが、Next.js runtime ではありません。React Server Components や Edge runtime
はなく、middleware はクライアントナビゲーションだけに参加します。対応範囲は各
ガイドの記述を基準にし、Next.js にあるという理由だけで API の存在を仮定しないで
ください。