Murasaki
コアコンセプト

アーキテクチャ

Rust ホスト、ローカル Node ランタイム、WebView レンダラーの関係。

Murasaki は 3 層のデスクトップランタイムです。React は OS の WebView で描画され、アプリのバックエンドコードは同梱された Node.js プロセスで実行され、小さな Rust ホストがネイティブウィンドウとアプリのライフサイクルを管理します。

ネイティブアプリ
01 · ネイティブホストRust · tao / wry / muda

ウィンドウ、WebView、ネイティブメニュー、ライフサイクル、更新引き渡し

起動・監視
02 · アプリバックエンドローカル Node ランタイム

src/main.ts · use-main · use-server · API routes

認証付きループバック HTTP
03 · レンダラーOS WebView

React 19 · Murasaki router · renderer code

これは、Chromium と Node.js を同じアプリへ組み込む Electron のレンダラーモデルとは異なります。レンダラーから Node.js のグローバル変数を直接利用することはできません。ファイル、データベース、ソケット、Worker、秘密情報を扱うコードは src/main.ts'use main' モジュール、'use server' アクション、またはsrc/api/ ルートに置きます。

各レイヤーの責務

レイヤー担当担当しないもの
Rust ホストネイティブイベントループ、宣言済みウィンドウのテンプレート、ウィンドウごとのナビゲーション/権限ポリシー、OS から渡された URL・ファイル要求の正規化、メニュー、Node.js 子プロセスの監視、更新の最終適用アプリの業務ロジック、React の状態管理
ローカル Node.jsNode Main のライフサイクル、宣言済みサブウィンドウの作成・破棄、登録済み URL/ファイルの処理、Server Actions、API Routes、更新の検証、アプリのリソースとデータネイティブウィンドウへ任意の URL や実行時権限ポリシーを指定すること
レンダラーUI、ルーティング、ブラウザー API、型付きバックエンド呼び出し、許可された宣言済みウィンドウの操作ファイルシステム、Node.js、ネイティブモジュールへの直接アクセス

Murasaki は 1.0 未満です。宣言済みウィンドウごとに、デフォルトでは何も許可しないコマンド許可リストを設定できます。URL、ファイルシステムのパス、対象ウィンドウ、OS の権限は許可・拒否する範囲を制限できますが、その他の引数はコマンド単位で制御します。パッケージ済みの macOS/Windows アプリは単一起動を強制し、URL スキームとファイル関連付けから受け取った起動要求を Node Main の openRequested() へ渡せます。本番設計を確定する前にプラットフォームと機能の状況を確認してください。

開発時とパッケージ後

コードの境界は同じですが、実行するホストが異なります。

murasaki devパッケージ済みアプリ
Web アセットHMR を有効にした Vite 開発サーバー同梱した Node.js が dist/client を配信
Node.js バックエンドVite の子プロセスアプリに同梱したポータブル Node.js
ネイティブホストCLI が @murasakijs/native を読み込む単体で動作する Rust ランチャー
宣言済みウィンドウすべてのテンプレートをネイティブホストへ渡し、createOnLaunch のウィンドウだけを作成バンドルのメタデータからテンプレートを読み、createOnLaunch のウィンドウだけを作成
Node Main のエントリーVite SSR で読み込み、変更時に再読み込みserver/main.mjs へコンパイル
バックエンド呼び出しVite ミドルウェア同梱したループバック HTTP サーバー
URL/ファイル登録開発モードでは OS へ登録しないmacOS のアプリメタデータ、または Windows インストーラーのレジストリ設定

本番では、まず appId から決めたループバックポートを試し、実際に確保できたポートを保存します。別アプリが最初の候補を使用中なら、同梱サーバーが上限付きで別のポートを選び、次回以降もそれを再利用します。これにより、ハッシュが衝突した無関係な別アプリを排他せずに、レンダラーのオリジンを安定させます。リリース後は appId を安易に変更しないでください。データの保存先、WebView プロファイル、バンドル ID、単一起動ロック、ローカルオリジンが変わる可能性があります。

WebContext はウィンドウラベルごとに分離されます。サブウィンドウの Service Worker、SharedWorker、cookie、Web Storage から、メインウィンドウの認証済みバックエンド通信を観測することはできません。同じラベルをプロセス内で再作成した場合はコンテキストを再利用しますが、起動をまたいだプロファイルの永続性は OS に依存します。macOS 11〜13 では、カスタムの永続ストアに macOS 14 以降が必要なため、サブウィンドウのラベルは分離された非永続ストアを使用します。webview.incognito: true を指定すると、すべてのラベルが非永続になります。

Next.js 風であり、Next.js そのものではない

src/app、レイアウト、Route Handler、ディレクティブ、React 19 といった慣れた規約を採用していますが、Next.js のランタイムではありません。React Server Components と Edge Runtime は提供せず、ミドルウェアが関与するのはクライアントナビゲーションだけです。対応範囲は各ガイドの記述を基準にし、Next.js にあるという理由だけで API の存在を仮定しないでください。

次へ

GitHub でこのページを改善

On this page