Deno(ディーノ)とは

  • 今月v1.0がリリースされたJavaScriptとTypeScriptのセキュアなランタイム
  • Node.jsの開発者がつくった改良版

そのままでTypeScriptがサポートされてるのがいい感じ。恐竜が可愛い。

触ってみる

インストール

インストール方法はいくつかサポートされている。Homebrewで導入。

$ brew install deno

サンプルコードの実行

$ deno run https://deno.land/std/examples/welcome.ts
Download https://deno.land/std/examples/welcome.ts
Warning Implicitly using master branch https://deno.land/std/examples/welcome.ts
Compile https://deno.land/std/examples/welcome.ts
Welcome to Deno 🦕

https://deno.land/std/examples/welcome.tsには何が書いてるのかみてみる。

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

リモートにホスティングされたTypeScriptのコードをダウンロードしてコンパイルして実行できる。

さらに公式サイトにあるソースコードをコピペして実行してみる。

import { serve } from "https://deno.land/std@0.52.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" });
  }

2行目移行のインデントがちょっと違和感。 実行してみる。

$ deno run hello.ts
Download https://deno.land/std@0.52.0/http/server.ts
# 〜中略〜
Download https://deno.land/std@0.52.0/path/_util.ts
Compile file:///Users/shtnkgm/Desktop/hello.ts
error: Uncaught PermissionDenied: network access to "0.0.0.0:8000", run again with the --allow-net flag
    at unwrapResponse ($deno$/ops/dispatch_json.ts:43:11)
    at Object.sendSync ($deno$/ops/dispatch_json.ts:72:10)
    at Object.listen ($deno$/ops/net.ts:51:10)
    at listen ($deno$/net.ts:152:22)
    at serve (https://deno.land/std@0.52.0/http/server.ts:261:20)
    at file:///Users/shtnkgm/Desktop/hello.ts:2:13

さっきよりもいろいろダウンロードされた後に、Uncaught PermissionDeniedエラーがでた。 --allow-netオプションをつけないとデフォルトのセキュリティ設定では実行できないらしい。

$ deno run --allow-net hello.ts

http://localhost:8000/にブラウザでアクセスするとHello Worldが表示された

runコマンドのhelpをみてみる

$ deno run --help

–allowのものを抜粋するとこんな感じ。

OPTIONS:
    -A, --allow-all
            Allow all permissions

        --allow-env
            Allow environment access

        --allow-hrtime
            Allow high resolution time measurement

        --allow-net=<allow-net>
            Allow network access

        --allow-plugin
            Allow loading plugins

        --allow-read=<allow-read>
            Allow file system read access

        --allow-run
            Allow running subprocesses

        --allow-write=<allow-write>
            Allow file system write access

runコマンド以外のサブコマンド

$ deno --help

fmtでソースコードのフォーマットやtestでユニットテスト実行が標準できそう。

SUBCOMMANDS:
    bundle         Bundle module and dependencies into single file
    cache          Cache the dependencies
    completions    Generate shell completions
    doc            Show documentation for a module
    eval           Eval script
    fmt            Format source files
    help           Prints this message or the help of the given subcommand(s)
    info           Show info about cache or info related to source file
    install        Install script as an executable
    repl           Read Eval Print Loop
    run            Run a program given a filename or url to the module
    test           Run tests
    types          Print runtime TypeScript declarations
    upgrade        Upgrade deno executable to given version

コードフォーマットしてみる

$ deno fmt hello.ts

さっき違和感を感じたインデントが修正された。

import { serve } from "https://deno.land/std@0.52.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" });
}