📂

Denoでただファイルシステムベースドルーティングがしたい

2025/01/14に公開

ただファイルシステムベースドルーティングがしたいだけなのに、昨今のWebフレームワークは色々と余計な前提や機能がついてきて面倒くさいと思ったことはないでしょうか。JSXとかとりあえず要らない。シンプルにRequestを受け取ってResponseを返す関数をエクスポートするモジュールを配置したらその通りにレスポンスを返してほしい。そういう要件を素直に満たしてくれるWebフレームワークがない[1]

作りました→routets。以下のコマンドでCLIをインストールできます。

deno install -gAf https://deno.land/x/routets@v4.0.1/routets.ts

もしくはインストールせずに直接実行しても問題ありません。

deno run -A https://deno.land/x/routets@v4.0.1/routets.ts

以下のような内容のファイルhello.route.tsをカレントディレクトリーに作ってCLIを実行し、http://localhost:8000/helloにアクセスしたらハロワできます。Routeクラスを使うようにしたのは主に型推論のためです[2]

import Route from "https://deno.land/x/routets@v4.0.1/Route.ts"

export default new Route(async ({ request }) => {
	return new Response("Hello, World!")
})

URL Pattern APIを利用した動的ルートもサポートしています。以下のような内容のファイル:dynamic.route.tsを作ってhttp://localhost:8000/routeにアクセスすると{"dynamic":"route"}と表示されます。

import Route from "https://deno.land/x/routets@v4.0.1/Route.ts"

export default new Route(async ({ captured }) => {
	return new Response(JSON.stringify(captured), { headers: { "Content-Type": "application/json" } })
})

Deno Deployへのデプロイにも対応しています(というかほぼそのために作りました)。CLIはデフォルトでserve.gen.tsというファイルをビルドするようになっていて[3]、これをそのままDenoに読み込ませることでもサーバーが立ち上がるので、Deno Deployではこのファイルをエントリーポイントに指定してください。ビルドだけしたい場合は以下のコマンドでできます。

deno run -A https://deno.land/x/routets@v4.0.1/routets.ts --no-watch --no-serve

つまり、GitHub上にWebサーバーのソースコードを置く場合、Deno DeployのBuild Stepに上記コマンドを入れてインテグレーションをセットアップすれば、GitHubリポジトリー側には*.route.ts形式のモジュールしか置かなくていいわけです。かんたん。


脚注
  1. 実を言うとあるにはあるのですが、筆者がこれを見つけた当初はライセンスがなく、すぐに使いたかったのに使えなかったのでroutetsを作ってしまったという経緯があります。結果的にいいものができたと思っています(サフィックスの導入など)。 ↩︎

  2. 他の理由としては、ミドルウェアを比較的容易に挿し込めるという点です。 ↩︎

  3. --no-writeオプションで無効化できます。なぜこのようなファイルが必要かというと、Deno Deployでは静的解析できない動的インポートが使えないからです。 ↩︎

Discussion