ファーストステップ

このページには、Denoの基礎について説明するいくつかの例が含まれています。

このドキュメントは、JavaScript、特にasync/awaitに関する予備知識があることを前提としています。 JavaScriptの予備知識がない場合は、Denoから始める前に、JavaScriptの基本に関するガイドに従うことをお勧めします。

Hello World

DenoはJavaScript / TypeScriptのランタイムであり、Web互換で、可能な限り最新の機能を使用しようとします。

ブラウザーの互換性は、DenoのHello Worldプログラムがブラウザーで実行できるプログラムと同じであることを意味します。

console.log("Welcome to Deno 🦕");

プログラムを試してください:

deno run https://deno.land/std/examples/welcome.ts

HTTPリクエストを行う

多くのプログラムは、HTTP要求を使用してWebサーバーからデータをフェッチします。ファイルをフェッチしてその内容を端末に出力する小さなプログラムを書いてみましょう。 ブラウザーと同様に、Web標準fetchAPIを使用してHTTP呼び出しを行うことができます。

const url = Deno.args[0];
const res = await fetch(url);

const body = new Uint8Array(await res.arrayBuffer());
await Deno.stdout.write(body);

このアプリケーションの機能を見ていきましょう。

  1. 最初の引数をアプリケーションに渡して、それをurl定数に格納します。

  2. 指定されたURLにリクエストを送信し、レスポンスを待って、res定数に格納します。

  3. 応答の本文をArrayBufferとして解析し、応答を待ち、Uint8Arrayに変換してbodyの定数に格納します。。

  4. body定数の内容をstdoutに書き込みます。

やってみよう:

deno run https://deno.land/std@0.65.0/examples/curl.ts https://example.com

このプログラムはネットワークアクセスに関するエラーを返しますが、何が問題だったのでしょうか。はじめに、Denoはデフォルトで安全なランタイムであることを紹介したのを覚えているかもしれません。つまり、ネットワークへのアクセスなど、「特権」アクションを実行する場合はパーミッションをプログラムに対して明示的に与える必要があります。

正しいパーミッションを与え、もう一度試してください:

deno run --allow-net=example.com https://deno.land/std@0.65.0/examples/curl.ts https://example.com

ファイルを読み取る

Denoは、Web以外のAPIも提供しています。これらはすべてDenoグローバルに含まれています。これらのAPIのドキュメントは、doc.deno.landにあります。

例えばファイルシステムAPIにはWeb標準形式がないため、Denoは独自のAPIを提供します。

このプログラムでは、各コマンドライン引数はファイル名であると想定され、ファイルが開かれ、標準出力に出力されます。

例:Unix cat

このプログラムでは、各コマンドライン引数はファイル名であると想定され、ファイルが開かれ、標準出力に出力されます。

const filenames = Deno.args;
for (const filename of filenames) {
  const file = await Deno.open(filename);
  await Deno.copy(file, Deno.stdout);
  file.close();
}

ここのcopy()関数は、実際には必要なカーネル->ユーザースペース->カーネルのコピーしか作成しません。つまり、データがファイルから読み取られるのと同じメモリがstdoutに書き込まれます。これは、Denoの I/Oストリームの一般的な設計目標を示しています。

プログラムを試してください:

deno run --allow-read https://deno.land/std@0.65.0/examples/cat.ts /etc/passwd

TCP サーバー

例:TCP echo server

これは、ポート8080で接続を受け入れ、送信したものをクライアントに返すサーバーの例です。

const listener = Deno.listen({ port: 8080 });
console.log("listening on 0.0.0.0:8080");
for await (const conn of listener) {
  Deno.copy(conn, conn);
}

このプログラムを起動すると、PermissionDeniedエラーがスローされます。

$ deno run https://deno.land/std@0.65.0/examples/echo_server.ts
error: Uncaught PermissionDenied: network access to "0.0.0.0:8080", run again with the --allow-net flag
► $deno$/dispatch_json.ts:40:11
    at DenoError ($deno$/errors.ts:20:5)
    ...

セキュリティ上の理由から、Denoは明示的な許可なしにプログラムがネットワークにアクセスすることを許可していません。ネットワークへのアクセスを許可するには、コマンドラインフラグを使用します:

$ deno run --allow-net https://deno.land/std@0.65.0/examples/echo_server.ts

テストするには、netcatを使用してデータを送信してみてください。

$ nc localhost 8080
hello world
hello world

cat.tsの例と同様に、ここでのcopy()関数も不要なメモリコピーを作成しません。それはカーネルからパケットを受信し、さらに複雑にすることなく送り返します。

他の例も見るには

HTTPファイルサーバーなどの例は、 の章にあります。