Introduction
ZeltJSは、DIを組み込んだポータブルなTypeScriptアプリケーションフレームワークです。アダプターを切り替えることで、Node.js、Bun、Cloudflare Workers、AWS Lambdaで動作します。 異なるインフラで動作する大規模なアプリケーションを構築すること。それがZeltJSの目指すところです。
設計思想
TypeScriptによるバックエンド開発には、真の意味での「フレームワーク」がほとんど存在しません。HonoやExpressは優れたライブラリですが、アプリケーションフレームワークとしては不十分です。ライブラリは「便利な道具」ですが、フレームワークは「アプリケーションをどう構築するかへの答え」を提供します。DIの仕組み、ディレクトリ構造、認証・バリデーション・ロギングの統合パターン — これら「構築方法への答え」が揃って初めて、開発者は本質的な機能開発に集中できます。
NestJSはフレームワークと呼べる数少ない存在ですが、独自のモジュールシステムとRxJSベースの抽象化を持ち込むため、標準的なTypeScriptの慣習から外れます。起動時の重いメタデータ解析も、サーバーレス環境では非実用的です。
ZeltJSは、アプリケーションの構築方法に悩まなくて済む「フレームワーク」を目指しています。 そのために、次の5つの方針で構築しています:
- TS-Native — TSがすでに持っているものを再発明しない。import/exportを使い、async/awaitを使い、typesを使う
- Web-Standard — Request/Response、Fetch APIなどWeb標準に沿う。独自の抽象化はしない
- Transport-Agnostic — REST/GraphQL/CLI/Queueは単なる異なるエントリポイントに過ぎない。アプリケーションのコアは変わらない
- Cold-Start Friendly — serverless/Worker/Edgeで動作する。起動コストのペナルティなし
- Least Astonishment — エコシステムの標準に従う。追加の学習コストなし
インストール
pnpm add @zeltjs/core @zeltjs/adapter-node
Zeltはpre-alphaです — マイナーバージョン間でAPIが変わることがあります。
クイックサンプル
import { createApp, Controller, Get, http } from '@zeltjs/core';
import { onNode } from '@zeltjs/adapter-node';
@Controller('/hello')
class HelloController {
@Get('/')
greet() {
return { message: 'Hello, World!' };
}
}
const app = createApp([http({ controllers: [HelloController] })]);
const nodeApp = await onNode(app);
await nodeApp.http.listen({ port: 3000 });
順を追った説明はGetting Startedガイドを参照してください。
ベンチマーク
Zeltはランタイム性能とコールドスタート速度のバランスを実現 — サーバーレスに最適です。
| Framework | Requests/sec | Cold Start (ms) |
|---|---|---|
| Fastify | 44,033 | 101 |
| Zelt | 37,331 | 68 |
| Hono | 37,262 | 37 |
| AdonisJS | 33,548 | 149 |
| NestJS | 23,597 | 268 |
ステータス
pre-alpha — 0.xの間はマイナーバージョンで破壊的変更が発生することがあります。