ファーストステップ
このページには、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標準fetch
APIを使用してHTTP呼び出しを行うことができます。
const url = Deno.args[0];
const res = await fetch(url);
const body = new Uint8Array(await res.arrayBuffer());
await Deno.stdout.write(body);
このアプリケーションの機能を見ていきましょう。
-
最初の引数をアプリケーションに渡して、それを
url
定数に格納します。 -
指定されたURLにリクエストを送信し、レスポンスを待って、
res
定数に格納します。 -
応答の本文を
ArrayBuffer
として解析し、応答を待ち、Uint8Array
に変換してbody
の定数に格納します。。 -
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 サーバー
これは、ポート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ファイルサーバーなどの例は、例 の章にあります。