はじめに
正直なところ、バックエンド開発でインフラ周りの設定に時間を取られすぎていませんか。
APIを1つ作るだけでも、ルーティング設定、バリデーション、インフラ構築、デプロイ設定...やることが多すぎるんですよね。個人的には「コードを書く時間より設定ファイルと格闘している時間の方が長い」という経験が何度もあります。
そんな悩みを解決してくれるのがEncoreというフレームワーク。型安全なコードを書くだけで、インフラからAPIドキュメントまで全部自動生成してくれるという話です。
しかもExpress.jsと比較して約9倍高速。Rustランタイムとマルチスレッド処理のおかげで、パフォーマンスも申し分ない。
Encoreとは
Encoreは、TypeScriptとGoで型安全な分散システムを構築するためのオープンソースフレームワークです。
最大の特徴は「宣言的インフラストラクチャ」という考え方。サービスやAPIを型安全なコードで定義すると、それに必要なインフラ設定が自動的に生成されます。データベース、Pub/Sub、キャッシュなども同様にコードで定義できる。
「インフラをコードで管理する」のではなく「コードからインフラを自動生成する」という発想の転換ですね。
公式サイト: https://encore.dev GitHub: https://github.com/encoredev/encore
特徴・メリット
1. 圧倒的な開発速度向上
Grouponの事例では、開発速度が2〜3倍向上し、プロジェクトのリードタイムが90%短縮されたと報告されています。
これ、意外と大げさな話ではないんですよ。通常のバックエンド開発だと、以下の作業が全て手動で必要になります。
- APIルーティング設定
- リクエスト/レスポンスのバリデーション
- APIドキュメント作成
- インフラ構成(DB、キャッシュ、メッセージキュー)
- 監視・トレーシング設定
- CI/CD設定
Encoreを使うと、これらがコードを書くだけで自動生成される。時短になるのは当然ですね。
2. Express比9倍の高速パフォーマンス
EncoreはRustで書かれたランタイムを使用しており、マルチスレッド処理に対応しています。
バリデーション処理を含めた状態でも、Express.jsの約9倍の処理速度を実現。特に本番環境での高負荷時に差が出やすいポイントです。
3. npm依存関係ゼロ
TypeScript版のEncore.tsはnpm依存関係が0という設計。node_modulesの肥大化に悩まされることがありません。
30代になって思うのは、依存関係の管理って地味に工数を食うということ。セキュリティアップデートの追跡、バージョン競合の解決...これらから解放されるのは大きい。
4. ローカル開発環境の自動構築
CLIを実行すると、ローカル環境に必要なインフラが自動的にセットアップされます。さらに以下の機能がダッシュボードで利用可能。
- APIエクスプローラー: 定義したAPIをGUIでテスト
- 分散トレーシング: リクエストの流れを可視化
- アーキテクチャ図: サービス間の依存関係を自動図示
- サービスカタログ: 全APIの一覧と仕様
開発中に「このAPIどうなってたっけ」と調べる時間が大幅に減ります。
5. AIツールとの統合
Claude Code、Cursor、GitHub CopilotなどのAIエディタに対応。MCPサーバーを通じて、アプリのアーキテクチャ、API、データ、トレース情報をAIが参照できます。
AIにコード生成を任せる際の精度が上がるのは、地味に嬉しいポイントですね。
インストール方法
macOS
brew install encoredev/tap/encore
Linux
curl -L https://encore.dev/install.sh | bash
Windows
iwr https://encore.dev/install.ps1 | iex
基本的な使い方
プロジェクトの作成
# TypeScript版
encore app create --example=ts/hello-world
# Go版
encore app create --example=hello-world
開発サーバーの起動
encore run
これだけで、ローカル環境にダッシュボード付きの開発サーバーが立ち上がります。
Hello World(TypeScript)
import { api } from "encore.dev/api";
// レスポンスの型定義
interface Response {
message: string;
}
// APIエンドポイントの定義
export const hello = api(
{ expose: true, method: "GET", path: "/hello/:name" },
async ({ name }: { name: string }): Promise<Response> => {
return { message: `Hello ${name}!` };
}
);
たったこれだけで、以下が自動的に生成されます。
/hello/:nameへのGETルーティング- パスパラメータ
nameのバリデーション - レスポンス型のチェック
- APIドキュメント
- トレーシング設定
「1行のコードで関数をAPIに変換する」というコンセプト、個人的にはかなり気に入っています。
データベースの定義
import { SQLDatabase } from "encore.dev/storage/sqldb";
// データベース定義(これだけでDBが自動構築される)
const db = new SQLDatabase("users", {
migrations: "./migrations",
});
// データベースを使用したAPI
export const getUser = api(
{ expose: true, method: "GET", path: "/users/:id" },
async ({ id }: { id: string }) => {
const user = await db.queryRow`
SELECT id, name, email FROM users WHERE id = ${id}
`;
return user;
}
);
Pub/Subの定義
import { Topic, Subscription } from "encore.dev/pubsub";
// トピックの定義
interface UserCreatedEvent {
userId: string;
email: string;
}
const userCreated = new Topic<UserCreatedEvent>("user-created");
// パブリッシュ
await userCreated.publish({ userId: "123", email: "test@example.com" });
// サブスクライバーの定義
const _ = new Subscription(userCreated, "email-sender", {
handler: async (event) => {
// メール送信処理
console.log(`Sending welcome email to ${event.email}`);
},
});
実践的なユースケース
マイクロサービスアーキテクチャ
Encoreは複数サービス間の通信を型安全に扱えます。サービス間の呼び出しもコードで定義するだけで、通信のボイラープレートは自動生成。
// user-service/user.ts
import { api } from "encore.dev/api";
export const getUser = api(
{ expose: true, method: "GET", path: "/users/:id" },
async ({ id }: { id: string }) => {
return { id, name: "John Doe" };
}
);
// order-service/order.ts
import { getUser } from "../user-service/user";
export const createOrder = api(
{ expose: true, method: "POST", path: "/orders" },
async ({ userId, items }: { userId: string; items: string[] }) => {
// 別サービスの呼び出しも型安全
const user = await getUser({ id: userId });
return { orderId: "order-123", userName: user.name, items };
}
);
クラウドデプロイ
Encoreはセルフホスト(Docker)とクラウドプラットフォーム(AWS/GCP)の両方に対応。
# Dockerイメージとしてエクスポート
encore build docker myapp:latest
# Encore Cloudを使う場合(AWS/GCPに自動デプロイ)
encore deploy --env=production
テスト環境の自動構築
テスト実行時も分散トレーシングが有効になるため、テスト失敗時の原因特定が容易になります。
import { describe, it, expect } from "vitest";
import { hello } from "./api";
describe("hello API", () => {
it("returns greeting with name", async () => {
const response = await hello({ name: "World" });
expect(response.message).toBe("Hello World!");
});
});
まとめ
Encoreは「バックエンド開発の本質的な部分に集中したい」という開発者にとって、かなり魅力的な選択肢だと思います。
特に以下のような場面で威力を発揮しそうですね。
- スタートアップの高速開発: インフラ設定に時間を取られず、プロダクト開発に集中できる
- マイクロサービス構築: サービス間通信の複雑さを型安全に隠蔽
- チーム開発: APIドキュメントとアーキテクチャ図の自動生成で、コミュニケーションコストを削減
個人的には、Express比9倍の速度とnpm依存ゼロという設計思想がツボでした。パフォーマンスと保守性を両立させたいプロジェクトには一択ですね。
まずはencore app createでサンプルプロジェクトを動かしてみることをおすすめします。ローカルダッシュボードの完成度の高さに驚くと思いますよ。