取り組みの背景
Deno 2 は Node.js の生みの親 Ryan Dahl が設計した次世代 JavaScript / TypeScript ランタイムです。セキュリティファーストの権限管理、TypeScript のゼロ設定サポート、npm パッケージとの完全互換など、モダンな開発者が求める機能を標準で備えています。
Antigravity と組み合わせることで、Deno 2 のパーミッション設定やモジュール設計を AI エージェントに任せながら、安全で高速なアプリケーションを構築できます。ここでは環境構築から Fresh フレームワークでのフルスタック開発、Deno Deploy へのデプロイまでを実践的に解説します。
Deno 2 の特長と Antigravity との親和性
Deno 2 が開発者にとって魅力的な理由はいくつかあります。
まず、パーミッションシステムです。ファイルアクセス、ネットワーク通信、環境変数の読み取りなど、すべてのシステムリソースへのアクセスに明示的な許可が必要です。Antigravity のエージェントは、生成したコードに必要な権限を自動で判別し、deno.json の設定に反映できます。
次に、TypeScript ファーストの設計です。tsconfig.json の設定や ts-node のようなトランスパイラが不要で、.ts ファイルをそのまま実行できます。Antigravity が生成する型安全なコードとの相性は抜群です。
さらに、npm 互換モードにより、npm: プレフィックスを使って既存の npm パッケージをそのまま利用できます。node_modules を持たないクリーンなプロジェクト構造を保ちながら、Express や Prisma といった人気パッケージを活用できます。
Antigravity で Deno 2 プロジェクトを始める
Antigravity のターミナルで Deno 2 プロジェクトを初期化してみましょう。エージェントに次のように指示します。
Deno 2 で REST API サーバーを作成してください。
Oak フレームワークを使い、ユーザーの CRUD 操作を実装してください。
パーミッション設定も deno.json に含めてください。
Antigravity は以下のようなプロジェクト構造を生成します。
my-deno-api/
├── deno.json
├── main.ts
├── routes/
│ └── users.ts
├── middleware/
│ └── logger.ts
├── models/
│ └── user.ts
└── tests/
└── users_test.ts
deno.json には必要なパーミッションとタスクが定義されます。
{
"tasks": {
"dev": "deno run --watch --allow-net --allow-read --allow-env main.ts",
"start": "deno run --allow-net --allow-read --allow-env main.ts",
"test": "deno test --allow-net --allow-read --allow-env"
},
"imports": {
"@oak/oak": "jsr:@oak/oak@^17",
"@std/assert": "jsr:@std/assert@^1"
}
}ポイントは --allow-net、--allow-read、--allow-env のように、必要最小限の権限だけを付与している点です。Antigravity はコードの内容を解析し、過剰な --allow-all を避けた安全な設定を提案します。
Oak フレームワークで REST API を構築する
Oak は Deno 向けの軽量な HTTP フレームワークで、Express ライクな API を提供します。Antigravity に「Oak でユーザー管理 API を作って」と指示すると、以下のようなルーティングコードが生成されます。
// routes/users.ts
import { Router } from "@oak/oak";
interface User {
id: string;
name: string;
email: string;
}
const users: Map<string, User> = new Map();
const router = new Router();
router
.get("/api/users", (ctx) => {
ctx.response.body = [...users.values()];
})
.get("/api/users/:id", (ctx) => {
const user = users.get(ctx.params.id);
if (!user) {
ctx.response.status = 404;
ctx.response.body = { error: "User not found" };
return;
}
ctx.response.body = user;
})
.post("/api/users", async (ctx) => {
const body = await ctx.request.body.json();
const user: User = {
id: crypto.randomUUID(),
name: body.name,
email: body.email,
};
users.set(user.id, user);
ctx.response.status = 201;
ctx.response.body = user;
});
export default router;Antigravity の補完機能は Deno の標準ライブラリ(@std/)や JSR レジストリのモジュールも認識するため、crypto.randomUUID() のようなランタイム API も正確にサジェストします。
Fresh フレームワークでフルスタック開発
Deno 2 のフルスタック開発には Fresh フレームワークが最適です。Fresh はアイランドアーキテクチャを採用しており、必要な部分だけをクライアントサイドでハイドレーションします。
Antigravity に次のように依頼します。
Fresh 2 でブログアプリを作ってください。
記事一覧ページと記事詳細ページを実装し、
マークダウンファイルからコンテンツを読み込む構成にしてください。
Fresh のルーティングはファイルベースで、routes/ ディレクトリ内のファイルがそのまま URL パスに対応します。Antigravity はこの規約を理解し、適切なファイル配置でコードを生成します。
blog-app/
├── deno.json
├── main.ts
├── routes/
│ ├── index.tsx # 記事一覧
│ └── posts/
│ └── [slug].tsx # 記事詳細
├── islands/
│ └── LikeButton.tsx # インタラクティブコンポーネント
├── components/
│ └── PostCard.tsx # サーバーサイドコンポーネント
└── content/
├── hello-world.md
└── getting-started.md
islands/ に配置したコンポーネントだけが JavaScript バンドルに含まれるため、パフォーマンスに優れたサイトが構築できます。
テスト駆動開発と Antigravity
Deno 2 にはテストランナーが標準搭載されています。Antigravity にテストの生成を依頼すると、Deno.test() を使ったテストコードを自動で作成します。
// tests/users_test.ts
import { assertEquals } from "@std/assert";
Deno.test("POST /api/users creates a new user", async () => {
const response = await fetch("http://localhost:8000/api/users", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
name: "田中太郎",
email: "tanaka@example.com",
}),
});
const user = await response.json();
assertEquals(response.status, 201);
assertEquals(user.name, "田中太郎");
});deno test コマンド一つでテストを実行でき、カバレッジレポートも --coverage フラグで取得可能です。Antigravity のエージェントはテスト結果を解析し、失敗したケースの修正案を即座に提案します。
Deno Deploy へのデプロイ
Deno Deploy は Deno 公式のエッジホスティングサービスで、GitHub リポジトリと連携するだけで自動デプロイが実現します。Antigravity から以下の手順でセットアップできます。
まず、deployctl をインストールします。
deno install -gArf jsr:@deno/deployctl次に、GitHub リポジトリを Deno Deploy プロジェクトに紐付けます。
deployctl deploy --project=my-deno-api --entrypoint=main.tsAntigravity は GitHub Actions のワークフローファイルも生成でき、プルリクエストごとにプレビューデプロイを実行する CI/CD パイプラインを構築できます。
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v4
- uses: denoland/setup-deno@v2
- run: deno task build
- uses: denoland/deployctl@v1
with:
project: my-deno-api
entrypoint: main.tsnpm パッケージとの共存
Deno 2 の npm: プレフィックスにより、Prisma、Zod、Hono など人気の npm パッケージをそのまま利用できます。
import { z } from "npm:zod@3";
import { Hono } from "npm:hono@4";
const UserSchema = z.object({
name: z.string().min(1),
email: z.string().email(),
});
const app = new Hono();
app.post("/users", async (c) => {
const body = await c.req.json();
const result = UserSchema.safeParse(body);
if (!result.success) {
return c.json({ errors: result.error.issues }, 400);
}
return c.json({ user: result.data }, 201);
});
Deno.serve(app.fetch);Antigravity は npm: インポートと jsr: インポートの使い分けを理解し、Deno ネイティブのパッケージが存在する場合はそちらを優先的に提案します。
パーミッション設計のベストプラクティス
Deno のパーミッションシステムを最大限に活用するため、Antigravity に「このプロジェクトに最適なパーミッション設定を分析して」と依頼すると、コードベース全体をスキャンし、必要な権限を洗い出します。
よく使うパーミッションの組み合わせとその用途を整理すると、以下のようになります。
--allow-net=api.example.com: 特定ホストへのネットワークアクセスのみ許可。外部 API 呼び出しに使用。--allow-read=./content,./config: 特定ディレクトリへの読み取りのみ許可。設定ファイルやコンテンツの読み込みに使用。--allow-env=DATABASE_URL,API_KEY: 特定の環境変数のみ許可。シークレット管理に使用。
--allow-all はデバッグ時のみに限定し、本番環境では必ず最小権限の原則を適用しましょう。Antigravity はこの原則に沿った設定を自動生成します。
まとめ
Deno 2 と Antigravity の組み合わせは、セキュリティと開発効率を両立させる強力な開発環境を提供します。TypeScript のゼロ設定サポート、きめ細かなパーミッション管理、そして npm との完全互換性により、モダンなウェブアプリケーション開発を加速できます。
Antigravity のエージェントは Deno 2 のエコシステム(JSR、Fresh、Oak、Deno Deploy)を理解しているため、プロジェクトの初期化からデプロイまで一貫した支援を受けられます。ぜひ次のプロジェクトで試してみてください。