EXEツールでフルスタックウェブアプリを単一バイナリにパックする
はじめに
モダンなウェブアプリを構築する際、開発者は複数のランタイム、ビルドツール、デプロイプラットフォームを組み合わせて作業することが多いです。SSRやAPIエンドポイント、認証などのサーバーサイド機能を維持したい場合、アプリ全体を軽量な実行ファイルに統合することで、分配を簡易化できます。
EXE は「Executable」の略で、MITライセンスのフリーソフトウェアです。SvelteKit、Nuxt、TanStack など任意のフルスタックフレームワークを、実行時依存のない単一のバイナリに変換します。ビルドフェーズに Bun を活用することで、EXE はフレームワークのネイティブサーバー機能を保持しつつ、即時にクロスプラットフォームのバイナリを提供します。
なぜ EXE なのか? * シンプルさ – 実行時に Docker や Node をインストールする必要はありません。 * 安全性 – ローカルで実行され、ユーザーデータをプライベートに保ちます。 * 移植性 – バイナリは Windows、macOS、Linux、さらに組み込みデバイスでも動作します。 * 速度 – コマンド一つでアプリを起動でき、コンテナオーケストレーションは不要です。
主な特徴
| Feature | Detail |
|---|---|
| Zero Runtime Dependences | アプリは単一の静的バイナリとして配布されます。ホスト上に追加ファイルや依存関係はありません。 |
| Full‑Stack Preservation | SSR、APIルート、サーバーサイドミドルウェア、認証をそのまま保持します。 |
| Cross‑Platform | Windows、Linux、macOS、ARM アーキテクチャ用にバイナリを生成します。 |
| Docker Companion | linux-x64 をコンパイルすると、EXE は自動で Dockerfile を生成し、Fly.io などでの自己ホストや任意のコンテナランタイムで簡単にデプロイできます。 |
| CLI & Adapter Plugins | SvelteKit (@jesterkit/exe-sveltekit) 用のアダプタと、Nuxt/TanStack の実験的サポートがあります。 |
| Open‑Source & Extensible | GitHub でホストされており、貢献歓迎。その他フレームワーク向けのプラグインも書けます。 |
はじめ方
以下は SvelteKit のサンプル設定です。Nuxt や TanStack を使用する場合も似た流れで進みます。
# 1️⃣ Install the adapter
npm install @jesterkit/exe-sveltekit
$ svelte.config.js に以下を追加します:
// svelte.config.js
import adapter from '@jesterkit/exe-sveltekit';
export default {
kit: {
adapter: adapter({
binaryName: 'my-app',
}),
},
};
ビルドパイプラインを実行します:
npm run build
# The executable is now in ./dist/my-app
./dist/my-app
アプリは http://localhost:3000 で起動し、標準の SvelteKit 本番ビルドと同じように動作しますが、今回は単一バイナリとして実行されます。
高度な設定
| Option | 用途 |
|---|---|
--target |
linux-x64、win32-x64、darwin-arm64 など |
--output |
コンパイルされたバイナリのカスタム格納場所 |
--docker |
linux-x64 以外でも Dockerfile の生成を強制します |
例 – Linux バイナリを作成し、Dockerfile を生成します:
npm run build -- --target=linux-x64 --docker
Fly.io でのデプロイ
linux-x64 をターゲットにすると、fly launch ヘルパーがすぐに使える Fly.io 設定を提供します。以下を実行するだけです:
fly launch
Fly はホスティング、ドメイン割り当て、ゼロダウンタイムでのリロードを処理します。
利用ケース
| Scenario | Benefit |
|---|---|
| SaaS デモストアフロント | ユーザーがローカルでコピーを起動し、迅速に試用できるようにします。 |
| プライバシー重視のアプリ | データをユーザー端末に保存し、リモートサーバーへの公開を回避します。 |
| 自己ホスト型ツール | 管理者が内部サーバーに単一バイナリをインストールできるように配布します。 |
| スピード開発 | Docker ビルド時間を避け、機能変更を即座にテストします。 |
コミュニティと拡張
EXE エコシステムは拡大しています。上記に記載されていないフレームワークを使用している場合は、遠慮なく Issue を開くか、アダプタの貢献をお願いします。コアは Rust で書かれ、bun を使用してバンドルされるため、スケーラビリティに優れ、新機能(例: 自動更新バイナリ、ネイティブプラグインサポート、プラットフォーム固有のバンドラ―(WebAssembly、ARM64 など))を組み込むことができます。
コントリビューション
- リポジトリをフォークします。 2. 変更をローカルで行います。 3. 問題と解決策を説明した PR を送信します。小さく、焦点を絞った PR を歓迎します。プロジェクトは MIT ライセンスのため、商用ソフトウェアでもバイナリを使用できます。
ライセンス
EXE は MIT ライセンス の下で配布されます。製品の一部として自由に改変し、配布してください。
要約
EXE はフルスタックフレームワークの豊富なエコシステムと、単一バイナリの簡潔さの間のギャップを埋めます。Docker コンテナ、Node ランタイム、複雑なデプロイスクリプトを必要とせず、すべてのサーバーサイド機能をそのまま保ちつつ、デモ、セルフホスト型 SaaS、プライバシー重視のツールを問わず、あらゆるプラットフォームへ Web アプリをゼロ摩擦で配布できます。楽しいパッケージングを!