🍺

denoに触れてみた話

2021/12/11に公開

きっかけ

deno、そろそろ使えるのかなって。

deno の 環境準備

denoのDockerimage

  • denoland/deno

denoのVSCode拡張

  • denoland.vscode-deno

react&denoで調べた時にでてきたやつ

deno の 使い方

Dockerimage : denoland/deno:alpine-1.16.4

deno実行時コマンドライン引数

src.ts
console.log(Deno.args);

deno実行時コマンドライン引数を良い感じに解析

src.ts
import { parse } from "https://deno.land/std/flags/mod.ts"
const args = parse(Deno.args);
console.log(args);

deno標準入力

src.ts
import { readLines } from "https://deno.land/std/io/mod.ts";
for await (const line of readLines(Deno.stdin)) {
  console.log(line);
}

deno標準入力全部読む

src.ts
import { readLines } from "https://deno.land/std/io/mod.ts";
let lines = [];
for await (const line of readLines(Deno.stdin)) {
  lines.push(line);
}
console.log(lines.join("\n"));

denoファイル読み込み

src.ts
import { readAll } from "https://deno.land/std@0.117.0/streams/conversion.ts";

const file: Deno.File = await Deno.open("./src.ts");

// 文字コードを指定
const decoder: TextDecoder = new TextDecoder("utf-8");

const text = decoder.decode(await readAll(file));

console.log(text);

denoHttp読み込み

src.ts
const res = await fetch("https://zenn.dev/");

console.log(res);

console.log((await res.text()).substring(0, 100));

ユニットテスト

試しに乱数ジェネレータを書いてみた

https://github.com/nobokko/deno_random-generator

jsはseedを明示して乱数生成する機能が無いから、固定したい場合にはちょっと不便なんですよね。
例えばゲームのリプレイは乱数のシードが固定できるとどんな乱数が出た結果なのか記録しないで済みます。

ジェネレータをフル活用して書いてみたつもりです。

denoさん、単体テストのランナーが組み込まれているので特に環境の追加準備無く使えるのは良いですね。

テストの実行

全て実行するのであれば「deno test」だけで実行できます。

オプションを追加して、ファイル単位やテストケース単位にも実行できます。
また、denoland.vscode-denoをVSCodeに導入済みであれば、テストケースの上部に実行ボタンが表示されます。

カバレッジ

コードカバー率も出そうと思えば出せちゃいます。
(1.16.4では)deno testのオプションに「coverage=ディレクトリ名」を追加することでディレクトリにcoverage profileが出力されるようになります。
その状態で「deno coverage ディレクトリ名」を実行するとカバー率と未到達の行が表示されます。
なお、ディレクトリの中のファイルは実行前にからっぽにした方がよさそうです。
また、何らかの理由で表示される行と実際に表示されるべき行が何行かズレているようです。(下記でfor通ってないとか嘘だろ……と思ってたらやっぱり嘘だった。全角文字が悪い事してそう)

調べるとこのカバレッジの機能は仕様が度々変わってるみたい。バージョンを変える時は注意かも。

deno test --coverage=cov_profile
running 7 tests from file:///var/local/deno_random-generator/tests/random.test.ts
test random 01 ... ok (31ms)
test random 02 ... ok (25ms)
test random 03 ... ok (24ms)
test random 04 ... ok (25ms)
test random 05 ... ok (20ms)
test random 06 ... ok (8ms)
test random 07 ... ok (34ms)

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

deno coverage cov_profile
Check file:///var/local/deno_random-generator/src/random.ts
cover file:///var/local/deno_random-generator/src/random.ts ... 88.971% (121/136)
  37 |   if (typeof streamSize == "number" && !Number.isSafeInteger(streamSize)) {
  38 |     throw new RangeError(errorMsg.e001("streamSize"));
-----|-----
  97 |   const scaling = (() => {
-----|-----
  99 |       max = min < 0 ? 0xffffffff + min : 0xffffffff;
-----|-----
 114 |         const border = 0xffffffff - (0xffffffff % length);
 115 |         return (num: number) => {
-----|-----
 134 |     for (const _n of rangeiterator) {
-----|-----
 137 |         try {
 138 |           yield scaling(num);
 139 |           break;
 140 |         } catch (error) {
 141 |           switch (error) {
 142 |             case "next":
 143 |               break;
 144 |             default:

まとめ

node_moduleのフォルダ等が作成されずに使えるのが好印象でした。

カバレッジ以外に、VScode拡張でもマルチバイト文字がたまに誤作動している感があったのでガチで使おうと思ったらまだちょっとしんどいかもしれない。

お疲れさまでした。

Discussion