Chapter 10

[Deno/基本機能]標準ライブラリ・API

k4nd4
k4nd4
2024.12.17に更新
このチャプターの目次

標準ライブラリ

Denoで使用できる標準ライブラリはJSRでホストされており、https://jsr.io/@std で概要や使用例を確認できます。ここではいくつかを紹介します。

@srd/assert

アサーション関数のモジュールです。主にテストやバリデーションに使用され、コードの正当性を確認するために利用します。Node.jsのassertモジュールに似た機能を提供します。

import { assert } from "@std/assert";

assert("I am truthy"); // エラーは発生しない
assert(false); // `AssertionError`が発生

@std/path

OS固有のファイル・パスを扱うためのモジュールです。クロスプラットフォームでのファイルパスの操作をサポートします。Node.js のpathモジュールに似た機能を提供します。

Windowsの場合

import { fromFileUrl } from "@std/path/windows/from-file-url";
import { assertEquals } from "@std/assert";

assertEquals(fromFileUrl("file:///home/foo"), "\\home\\foo");

@std/encoding

hex、base64、varintのような一般的なフォーマットのエンコードとデコードのためのモジュールです。

import { encodeBase64, decodeBase64 } from "@std/encoding";
import { assertEquals } from "@std/assert";

const foobar = new TextEncoder().encode("foobar");
assertEquals(encodeBase64(foobar), "Zm9vYmFy");
assertEquals(decodeBase64("Zm9vYmFy"), foobar);

Deno API

Denoではファイルからの読み取り、TCPソケットのオープン、HTTPの提供、サブプロセスの実行など様々なAPIを提供しています。そのうちのいくつかを紹介します。詳しくは公式ドキュメントのAPI一覧を参照してください。

File System

Denoには、ファイルやディレクトリを操作するためのさまざまな関数が用意されています。ファイルの読み込みだけでも複数の方法が提供されているため、必要に応じて使い分けることが可能です。

Deno.readTextFileは指定したパスのテキストファイルを非同期で読み込み、その内容をstringとして返します。

const text = await Deno.readTextFile("hello.txt");

Deno.writeTextFileは指定したパスにテキストを非同期で書き込みます。もしファイルが存在しない場合は新しく作成し、存在する場合は上書きします。書き込むテキストはstringで指定します。

await Deno.writeTextFile("hello.txt", "Hello World");

Network

Deno.connectは指定したホストとポートにTCPまたはUDPで接続を確立し、ソケット(通信のインターフェース)を返します。デフォルトでは127.0.0.1のローカルホストがホストネームに指定され、TCPプロトコルが通信プロトコルとして指定されています。

const conn1 = await Deno.connect({ port: 80 });
const conn2 = await Deno.connect({ hostname: "192.0.2.1", port: 80 });
const conn3 = await Deno.connect({ hostname: "[2001:db8::1]", port: 80 });
const conn4 = await Deno.connect({ hostname: "golang.org", port: 80, transport: "tcp" });

Deno.listenは指定したホストとポートでTCPまたはUDP接続を待ち受け、クライアントが接続するとソケットを返します。これにより、サーバーがクライアントからのデータを受信したり、データを送信したりすることができます。

const listener1 = Deno.listen({ port: 80 })
const listener2 = Deno.listen({ hostname: "192.0.2.1", port: 80 })
const listener3 = Deno.listen({ hostname: "[2001:db8::1]", port: 80 });
const listener4 = Deno.listen({ hostname: "golang.org", port: 80, transport: "tcp" });

Errors

Denoには、さまざまな条件に応じて発生する20のエラークラスが用意されています。

Deno.errors.NotFoundはエラークラスの一つで、指定したファイルやリソースが見つからなかった場合に発生します。

try {
  const file = await Deno.open("./some/file.txt");
} catch (error) {
  if (error instanceof Deno.errors.NotFound) {
    console.error("ファイルが見つかりませんでした");
  } else {
    // それ以外の場合は再スロー
    throw error;
  }
}

HTTP Server

Deno.serveは指定したポートでHTTPサーバを開始します。リクエストに応じたレスポンスを返すことができるハンドラ関数を定義できます。

Deno.serve((_req) => {
  return new Response("Hello, World!");
});

上の例ではポートやホストネームを指定していないため、デフォルトのポート8000とホスト名127.0.0.1が使用されます。