[Scrap] Deno に Hello World する

Deno が必須になってきた
今新規のプロダクトで Supabase を使っているのだけど、Supabase Function が Deno で作るっぽい。
あと mcp Server 便利そう
Deno が mizchi さんの便利なツールセットになってるっぽく、MCP Server の実装にも便利そう。
ということで、Deno に慣れていきたい。

一回くらいは書き捨てのサーバーを作ったことがあるけど、当時は適当に実装して覚えてないので再入門してたい。
Repository

Hello World

Project 作成

import.meta.main
この書き方で、このファイルが main として実行された時ってことになるのか。面白い。
if (import.meta.main) {
console.log("Add 2 + 3 =", add(2, 3));
}
この書き方自体は、コードの動作確認がサクッとできる気の利いた書き方って感じで、ガッツリテストって感じじゃない。

Deno で In-Source Testing
Deno の In-Source Testing についてググったら、mizch さんの記事が出てきた。読んでいく
NODE_ENV で test 時にしか実行されないスコープを作るという感じだった。内容は理解しつつ4年前の記事なので、公式に対応が入っていないか調べてみる。

TypeScript support

Command Line Interface
コマンドラインも作ってみたい
後から気づいたが、このドキュメントはそもそも deno コマンド自体に関するもので、CLI Command を作成する話じゃなかった。

deno run 用の flag は実行ファイルの指定の前に書く
これ地味に大事そう。実行ファイルに渡される args は、実行ファイル以降の文字列になるから。
# Good. We grant net permission to net_client.ts.
deno run --allow-net net_client.ts
# Bad! --allow-net was passed to Deno.args, throws a net permission error.
deno run net_client.ts --allow-net

Executable scripts
こんな風に書けば、勝手に deno runtime を使って実行できるようになるらしい。shell script みたいに使える感じか
#!/usr/bin/env -S deno run --allow-env
const path = Deno.env.get("DENO_INSTALL");
console.log("Deno Install Path:", path);

コマンドラインツールをわざわざ作らなくても、書き捨ての deno script で十分な可能性はあるので、一旦終わり。

Deno Examples
ここに Example や Tutorial がまとまってて良さそう。

Executable Scripts
まあ、普通に便利。

Modules and dependencies
依存関係周りは理解しておきたい。

deno.json の imports の使い所
deno.json の imports は各モジュールのバージョンを一括で指定したいときに便利とのことなので、書き捨ての script を超える規模のコードベースに使う感じかな?
https imports
直接 https の url を指定して package を取得できる。
上書きもできる
Deno provides mechanisms to override dependencies, enabling developers to use custom or local versions of libraries during development or testing.
これ結構面白いな。どういう仕組みかはよく分からないけど、部分的に違うバージョンを使ったりできるっぽい。

import 元のパスの指定方法まとめ
ChatGPT にまとめてもらった。
記法プレフィックス | 説明 | 例 |
---|---|---|
ローカルモジュール | プロジェクト内のファイルを参照。相対パスまたは絶対パスで指定し、ファイル拡張子を必ず含む必要があります。 | import { add } from "./calc.ts"; |
HTTPS モジュール | HTTP/HTTPS URL を利用して、リモートから直接モジュールをインポートします。 | import { Application } from "https://deno.land/x/oak/mod.ts"; |
jsr: モジュール | JSR レジストリからパッケージをインポートするための記法です。パッケージ名の前に jsr: を付け、必要に応じてバージョンを指定します。 |
import { camelCase } from "jsr:@luca/cases@1.0.0"; |
npm: モジュール | npm パッケージをインポートするための記法です。パッケージ名の前に npm: を付け、バージョン指定も可能です。 |
import { say } from "npm:cowsay@1.6.0"; |

Frozen lockfile
下記のように指定すれば、lock file を固定できる。
{
"lock": {
"frozen": true
}
}

他にも、プライベートレジストリを使うにはどうすればいいか書いてあったので、いつか真面目にやる時に参照しよう。

Effective Deno
有名な本っぽい。4年ほど前の本で色々変わってそうだけど軽く目を通しておこう。

まとめ
一旦キャッチアップは終わりで、あとは作りながら学んでいけば良さそう。
ただ、mizchi さんが書いてる Deno が少しでも関連の記事は全部読んでおきたい。知りたいこと全部載ってそう。続く
[Scrap] mizchi さんの Deno 関連の記事を読む