5
6

More than 3 years have passed since last update.

Denoのマニュアルで気になった所を試してみる

Posted at

Deno

公式ページ

最近よく目にするので、何はともあれ触ってみようかという事で
マニュアルを元にザッと気になる所を試して見たいと思います。

:computer:環境構築

Denoの公式Docker(?)を見つけたのでそちらで環境を構築して見たいと思います。
https://hub.docker.com/r/hayd/deno

ワンランナーでさくっと試してみます。

$ docker run --rm -it hayd/alpine-deno run https://deno.land/std/examples/welcome.ts
Welcome to Deno 🦕

:thumbsup:

:pencil: 色々試してみる

簡単なサンプル

公式にも載っていた以下サンプルをローカルに server.ts として作成し、起動させてみます。

import { serve } from "https://deno.land/std@0.50.0/http/server.ts";
const s = serve({ port: 8000 });
console.log("http://localhost:8000/");
for await (const req of s) {
  req.respond({ body: "Hello World\n" });
}
$ docker run --rm -it --init -p 8000:8000 -v $PWD:/app hayd/alpine-deno run /app/server.ts
...
error: Uncaught PermissionDenied: network access to "0.0.0.0:8000", run again with the --allow-net flag

Premissionが無いと怒られました。Denoはデフォルトでファイル、ネットワーク、環境変数等のアクセスが
許可されてないので、--allow-net を付けて再度実行してみます。

$ docker run --rm -it --init -p 8000:8000 -v $PWD:/app hayd/alpine-deno run --allow-net /app/server.ts

今度は実行でき http://localhost:8000/ にアクセスするとちゃんと Hello World が返ってきました :sparkles:

ファイル読み込み

こちら を試して見たいと思います。
cat.ts として以下を作成します。

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

読み込み用のファイル sample.txt を以下の内容で作成。

Deno is a simple, modern and secure runtime for JavaScript and TypeScript that uses V8 and is built in Rust.

デフォルトだとファイル読み込みもPremissionが無いので --allow-read を付けて実行します。

$ docker run --rm -it --init -v $PWD:/app hayd/alpine-deno run --allow-read /app/cat.ts /app/sample.txt
> Deno is a simple, modern and secure runtime for JavaScript and TypeScript that uses V8 and is built in Rust.

ちゃんと読み込めてそうです :sparkles:

dependency inspectorformatter

Denoには dependency inspectorformatter がビルドインされているらしいので試してみます。

  • dependency inspector

    $ docker run --rm -it --init hayd/alpine-deno info
    DENO_DIR location: "/deno-dir/"
    Remote modules cache: "/deno-dir/deps"
    TypeScript compiler cache: "/deno-dir/gen"
    

    remoteから取得したmoduleとTypescriptコンパイル時のキャッシュ場所を教えてくれてます :sparkles:

  • formatter

    $ docker run --rm -it --init -v $PWD:/app hayd/alpine-deno fmt
    

テスト

こちらもビルドインでtest runnerが入っているらしいです。至れり尽くせり :sparkles:
https://deno.land/manual/testing

simple.test.ts
import { assertEquals } from "https://deno.land/std/testing/asserts.ts";
Deno.test("simple", () => {
  const x = 1 + 2;
  assertEquals(x, 3);
});

実行!

$ docker run --rm -it --init -v $PWD:/app hayd/alpine-deno test /app/simple.test.ts
running 1 tests
test simple ... ok (3ms)

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out (4ms)

Debugger

https://deno.land/manual/tools/debugger
V8 Inspector Protocolをサポートしている

先ほどのファイル読み込みのサンプルをDebugして見たいと思います。
--inspect-brk を付けて最初の1行目でブレークする様にします。

$ docker run --rm -it --init -p 9229:9229 -v $PWD:/app hayd/alpine-deno run --inspect-brk=0.0.0.0:9229 --allow-read /app/cat.ts /app/sample.txt
Debugger listening on ws://127.0.0.1:9229/ws/xxxxx

Chromeで chrome://inspect にアクセスして

↑のinspectをクリックすると

デバッグできました :sparkles:

また、試せては無いですが、VSCode上でもデバッグ可能らしいです。
https://deno.land/manual/tools/debugger#vscode

VSCodeの拡張機能

Deno - Visual Studio Marketplace

:bomb: バッドノウハウ

  • Debugger使用時にchromeでinspectが表示されない :warning:
    • docker使用する場合だと --inspect-brk だけではダメで --inspect-brk=0.0.0.0:9229 と指定しないといけない

:sparkles: 感想

  • ビルドインで色々入っているので便利
  • 外部パッケージをURLでインポートできるのはサクッと試せるので便利
  • いきなりNodeのプロジェクトをDenoに置き換えるのは厳しそうだが、新規のプロジェクトや単独の小さなモジュールとかで使ってみたい

:link: 参考になったURL

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6