deno deployはDeno版Cloudflare Workersです。つまり、Deno用のコードが動かせるエッジランタイムです。
先日Static Files on Deno Deployという記事がDeno公式から発表され、deno deployでもファイルシステムAPIが使えることが明らかになりました。この記事では、deno deployのファイルシステムがどうなっているか、Deno CLIとの互換性はどれくらいあるのかを検証していきます。
deno deployのファイルシステム
deno deployでは(おそらく)疑似的にファイルシステムが再現され、GitHubリポジトリ上のファイルをローカルファイルとして扱うことができます。
これの何が嬉しいかというと、既存のDeno CLI向けライブラリの大半がdeno deployでも動作します。
具体的には、以下のようなAPIがdeno deployとDeno CLIの両方で使えます。
- ファイル読み取り系
- Deno.open()
- Deno.readFile()
- Deno.readTextFile()
- fetch()
- ファイル情報系
- Deno.stat()
- Deno.lstat()
- ディレクトリ読み取り系
- Deno.readDir()
- カレントディレクトリ
- Deno.cwd()
- import.meta.url
※Deno.stat()とDeno.lstat()で取得できる情報には制限があります。
サポートされているのは非同期の読み込み系APIのみで、同期API(○○Sync)や書き込みAPI(Deno.writeTextFile)はサポートされていません。
deno deployのディレクトリ構造
Deno.cwd()やimport.meta.mainの情報から察するに、ディレクトリ構造は以下のようになっています。
root/
└ src/ <--ここがカレントディレクトリ
└ <以下にGitHubリポジトリのディレクトリ構造がそのまま反映される>
deno deploy内ではGitHubリポジトリ上のディレクトリ構造がそのまま反映されています。従って、相対パスでファイル読み込みするコードは、ローカルとdeno deployの両方で共通のコードを使用できます。
GitHubリポジトリ以外の静的ファイルを扱う方法
上の方で、「GitHubリポジトリ上のファイルをローカルファイルとして扱うことができる」と書きました。しかしこれはGitHubリポジトリ連携した場合についての話です。そもそもGitHubを使っていない場合や、SSGのようにビルド時に出力したファイルを静的ファイルとして使いたい場合は「deployctl」というCLIツールを使う方法があります。
deployctlはdeno deploy用に作られた公式のCLIツールです。ベータリリース初期にはローカル開発ツールという位置づけでしたが、その役割はDeno CLIに譲り、今ではGitHubを経由しないでdeployするためのツールになっています。
Readmeに従ってインストールした後、以下のコマンドを打つと、GitHubを経由せずdeployすることができます。このとき、カレントディレクトリの下にある静的ファイルがまとめてdeployされ、deno deploy上でもローカルと同じように静的ファイルを使うことができるようになります。
※アクセストークンが必要です。詳しくは公式ドキュメント参照
deployctl deploy --project=hello-world --token=<TOKEN> ./examples/hello.ts
また、GitHub Actionsも用意されています。SSGなど、GitHubActionsでビルド・出力した静的ファイルをまとめてdeployできます。
詳しくは https://github.com/denoland/deployctl/tree/main/action を参照してください。
まとめ
- deno deployでは、GitHubリポジトリ上のファイルをローカルファイルとして扱うことができる
- ファイルシステムAPIは、Deno CLIに実装されているもののうち、一部が使える
- ディレクトリ構造はGitHubリポジトリの構造がそのまま反映される
- deployする方法は主に4種ある
- playgroundからdeploy(今回の記事では触れていない)
- GitHub連携からdeploy
→ GitHubリポジトリ上のファイルを静的ファイルとして扱える - CLIからdeployctlを使ってdeploy
→ ローカルから直接deployできる - GitHub Actionsからdeoployctlを使ってdeploy
→ GitHub Actionsで生成した静的ファイルと一緒にdeployできる
将来的にはCache APIの導入が検討されていたり、tmpディレクトリへのファイル書き込みを可能にしてはどうかという提案があったりします。
ファイルシステムとは無関係ですが、データベースの提供や定期実行のサポートも検討されているとのことで、Cloudflare workersやGoogle Apps Scriptの上位互換となることが期待できます。