🦕

退屈なことはDenoにやらせたい

2020/06/30に公開

post Node.jsとして5月にメジャーバージョンがリリースされた Deno
npmやpackage.jsonをなくしてライブラリをURLから直接importする形になったり、TypeScriptがそのまま動いたりと様々な魅力がありますが、今回は普段遣いのスクリプトランナーとして見ていきたいと思います。
Pythonやシェルスクリプトが肌に合わなくて、手慣れたJS(TS)で書きたいマン[1]におすすめです。

導入と実行

かいつまんで書きます。
詳細は 公式ドキュメント やほかの紹介記事を参照してください。

導入

homebrew等で入れられます。nvmやnodebrew見合いのバージョン管理は追い追いでよいと思います。

$ brew install deno

実行

実行は deno run <FILENAME> でできます。
Denoは、安全のため、ネットワークアクセスやファイルの読み書き等を行う場合、適切な 権限 を与えないと動きません。
これは、実行時にフラグを指定することでできます。
たとえば、ファイルの読み込みを伴う場合は deno run --allow-read <FILENAME> となります。

Denoのグローバルオブジェクト

Denoは、標準オブジェクトとして Deno が提供されます。
ファイルアクセス等の基本的なメソッドがここから直接使用できるので、Node.jsのように fs 等を呼び出さなくてもさらっと書くことができます。

$ deno
Deno 1.1.2
exit using ctrl+d or close()
> Deno.cwd()
/Users/<**username**>/Development/sandbox

3つ覚えればだいたいなんとかなる

ディレクトリ配下のファイル等をループする

Deno.readDir()* を使います。 AsyncIterable が返ってくるので、 for await of で回せます。
--allow-read フラグが必要です。

readDir.ts
for await (const item of Deno.readDir('.')) {
  console.log(item);
}
実行
$ ls -F
fuga/            hoge.txt         readDir.ts

$ deno run --allow-read readDir.ts
{ name: "readDir.ts", isFile: true, isDirectory: false, isSymlink: false }
{ name: "hoge.txt", isFile: true, isDirectory: false, isSymlink: false }
{ name: "fuga", isFile: false, isDirectory: true, isSymlink: false }

シェルコマンドを動かす

Deno.run()* を使います。
--allow-run フラグが必要です。
これはPromiseを返さない同期APIです。

run.ts
const p = Deno.run({
  cmd: ['echo', 'hoge'],
});
console.log(p);
実行
$ deno run --allow-run run.ts
hoge
Process { rid: 3, pid: 22288 }

手元で使うだけなのにいちいち配列で書くのはかったるいので、サードパーティライブラリの exec を使った方が幸せになれそうです。

exec.ts
import { exec } from "https://deno.land/x/exec/mod.ts";
await exec('echo hoge');

テキストを読む

Deno.readTextFile()* を使います。
--allow-read フラグが必要です。

readTextFile.ts
const text = await Deno.readTextFile('./hoge.txt');
console.log(text);
実行
$ deno run --allow-read readTextFile.ts
ほげほげ

おわり

やっていきましょう。

脚注
  1. わたしだ。 ↩︎

GitHubで編集を提案

Discussion