LoginSignup
3
1

More than 3 years have passed since last update.

Denoについて触ってみた

Last updated at Posted at 2020-08-30

Deno

Deno.png

Deno 公式マニュアル
Deno GitHub

Denoとは

Denoは、V8 JavaScriptエンジン及びRustプログラミング言語に基づいた、JavaScript及びTypeScriptのランタイム環境である。Node.jsの作者であるライアン・ダールによって作成され、セキュリティと生産性に焦点を当てている。
Denoは単一の実行ファイル内でランタイム環境とパッケージ管理システムの両方の役割を明示的に引き受けるので、別途パッケージ管理システムを必要としない。

Wiki引用:Deno

node との違い

  • async / await を使用する際、わざわざ async を記述しなくて良い
  • npm によるパッケージ管理の必要がない
  • デフォルトでセキュア
  • TypeScriptがデフォルトでサポート

導入

環境:Ubuntu-20.04(WSL2)


// zip unzipが入っていない人はインストール
$ sudo apt-get install zip unzip

// Denoインストール
$ curl -fsSL https://deno.land/x/install/install.sh | sh


// .bashrc または .bash_profile に以下を書き込む
export DENO_INSTALL="ホームディレクトリ/.deno"
export PATH="$DENO_INSTALL/bin:$PATH"

// 書き込んだ.bashrc または .bash_profileを読み込む
source ~/.bashrc

バージョン確認

$ deno --version

> deno 1.3.1
> v8 8.6.334
> typescript 3.9.7

HelloWorld

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

$ deno run hello.js

> Welcome to Deno 🦕

恐竜が可愛らしい

HTTPリクエストを使う

axios を使用しようと思ったのですが、
Deno は XHRオブジェクトを持たないため axios を使うことは出来ませんでした。
なので JavaScript 標準の fetch を用いて HTTPリクエストを行います。

OpenWeatherMap を用いて天気情報を取得してみる。

const BASE_URL = "https://community-open-weather-map.p.rapidapi.com/weather"

const res = await fetch(BASE_URL + "?id=2172797&q=Japan%2CTokyo" , {
  method: 'GET',
  headers: {
    "x-rapidapi-host": "community-open-weather-map.p.rapidapi.com",
    "x-rapidapi-key": "example-api-key-xxxxxxxxxxxxxxxxxxxxxxxxxx",
    "useQueryString": true
  }
});

const body = await res.json();
console.log("地域: ", body.name)
console.log("天気: ", body.weather[0].main)
console.log("最高気温: ", body.main.temp_max - 273.15)
console.log("最低気温: ", body.main.temp_min - 273.15)

実行


地域:  Japan
天気:  Clouds
最高気温:  35
最低気温:  33

TypeScriptがデフォルトでサポート

for (let i: number = 1; i <= 100; i++) {
  if (i % 3 == 0 && i % 5 == 0) {
    console.log("FizzBuzz");
  } else if (i % 5 == 0) {
    console.log("Buzz");
  } else if (i % 3 == 0) {
    console.log("Fizz");
  } else {
    console.log(i.toString());
  }
}

実行


$ deno run fizzBuzz.ts
> Check file:///mnt/c/src/deno/fizzBuzz.ts
> 1
> 2
> Fizz
> 4
> Buzz
> Fizz
...

サードパーティーモジュールを使う

Deno Third Party Modules から使用するモジュールを探し出す。

時間処理モジュール moment.js を使ってみる。
deno_moment

import { moment } from 'https://deno.land/x/deno_moment@1.0.1/moment.ts'
console.log(moment().format('hh:mm:ss'));

初回実行時はモジュールのダウンロードが実行される


$ deno run whatsTime.js
> Download https://deno.land/x/deno_moment@1.0.1/moment.ts
> Download https://deno.land/x/deno_moment@1.0.1/vendor/moment.js
> 12:15:12

初回以降はキャッシュされたモジュールから実行される


$ deno run whatsTime.js
> Check file:///mnt/c/src/deno/whatsTime.js
> 12:05:30

WebServer

stdモジュールでWebサーバを立ち上げる

std

import { serve } from "https://deno.land/std/http/server.ts";
const port = 8080;
const server = serve({ port: port });

for await (const req of server) {
  req.respond({ body: "Hello World" })
}

実行


$ deno run server.js
Check file:///mnt/c/src/deno/server.js
error: Uncaught PermissionDenied: network access to "0.0.0.0:8080", run again with the --allow-net flag
    at unwrapResponse (rt/10_dispatch_json.js:24:13)
    at sendSync (rt/10_dispatch_json.js:51:12)
    at opListen (rt/30_net.js:33:12)
    at Object.listen (rt/30_net.js:204:17)
    at serve (server.ts:287:25)
    at file:///mnt/c/src/deno/server.js:3:16

エラーが発生してしまいました。
Deno はデフォルトで、ファイルやネットワークへのアクセスを禁止しているので、
オプションを付与して権限を許可する必要があります。

再実行

$ deno run --allow-net server.js
> Check file:///mnt/c/src/deno/server.js

$ curl localhost:8080
> helloWorld

Denoを触ってみた所感

良かった点

  • 導入してからコード実行までがすぐにできた
  • デフォルトでTypeScriptとサポートしてる

微妙な点

  • 既存の npm modulesが使えないのとDenoで対応しているモジュールがまだまだなので、現時点では微妙
3
1
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
3
1