Deno入門 ~インストールからデプロイまで~
What is Deno?
Deno
は、V8 JavaScriptエンジン及びRustプログラミング言語に基づいた、JavaScript及びTypeScriptのランタイム環境
Node.jsの作者によって作られているとのこと。
Node.jsの反省点を活かして改善を入れているらしいです。
また、単一実行ファイルとしてビルドできるため、Denoの環境が無くても実行ができるのが特徴。
個人的には最初からTypeScriptをサポートしている点がNode.jsより強いと思いました。
Installation
macOS/Linuxを基準として記載します。
curl -fsSL https://deno.land/x/install/install.sh | sh
# 以下を自身のシェルの設定に入れる ex.) .zshrc or .bashrc
export DENO_INSTALL="$HOME/.deno"
export PATH="$DENO_INSTALL/bin:$PATH"
# check install version
deno --version
Tips: Deno自体のバージョンアップはこれだけで良いらしい。
deno upgrade
Getting Started
お好きなエディタで以下のコードを作成
console.log("Hello, Deno!!!");
以下のコマンドで実行
deno run index.ts
Hello, Deno!!!
たったこれだけで環境構築からTypeScriptのコード実行までできてしまいました!
APIの作成
公式サンプル通りに実行すれば動かせますが、それではつまらないので Poké API
を動かしてみます。
Poké API
は皆さんご存知ポケモンのAPIです。
今回はこちらのエンドポイントを使います。
/api/v2/pokemon
index.ts
を以下のコードで上書きします。
import { serve } from "https://deno.land/std@0.157.0/http/server.ts";
const handler = async (request: Request): Promise<Response> => {
const url = "https://pokeapi.co/api/v2/pokemon/pikachu/";
const resp = await fetch(url, {
headers: {
accept: "application/json",
},
});
return new Response(resp.body, {
status: resp.status,
headers: {
"content-type": "application/json",
},
});
};
serve(handler);
サンプルコードのURL変更しただけですが、これでPoké APIから例の電気ネズミのデータが返却されます。
実行コマンド
# ネットワークアクセス許可が必要
deno --allow-net index.ts
ブラウザで localhost:8000
にアクセスまたは以下のコマンドを実行
curl localhost:8000
レスポンス抜粋
カスタマイズしてリクエストパラメータを受け取る
以下のようにコードを変更するとリクエストパラメータを受け取れるようになります。
※今回はバリデーションは考えないこととします。
Tips: コーディング中にコード修正→deno再実行を繰り返すのが面倒なので便利な --watch
オプションを使ってみます
deno run --allow-net --watch index.ts
これでコードを修正すると自動で反映されるようになります。
import { serve } from "https://deno.land/std@0.157.0/http/server.ts";
const handler = async (request: Request): Promise<Response> => {
# ここを追加
const requestUrl = new URL(request.url);
const pokemonNumber = requestUrl.searchParams.get("number");
# ここで受け取ったパラメータを使うように変更
const url = `https://pokeapi.co/api/v2/pokemon/${pokemonNumber}/`;
const resp = await fetch(url, {
headers: {
accept: "application/json",
},
});
return new Response(resp.body, {
status: resp.status,
headers: {
"content-type": "application/json",
},
});
};
serve(handler);
パラメータを追加してアクセス
curl localhost:8000?number=1
これでポケモン図鑑No.1のポケモンが返却されます。
(何かは調べてみてください)
HTMLを生成してちょっとした画面を作ってみよう
先ほどのAPIを改造してHTMLを返却するようにしてみました!
import { serve } from "https://deno.land/std@0.157.0/http/server.ts";
const handler = async (request: Request): Promise<Response> => {
const requestUrl = new URL(request.url);
const pokemonNumber = requestUrl.searchParams.get("number");
const url = `https://pokeapi.co/api/v2/pokemon/${pokemonNumber}/`;
const resp = await fetch(url, {
headers: {
accept: "application/json",
},
});
let body = `<p>Not Found. number: ${pokemonNumber}`;
if (resp.status === 200) {
const json = await resp.json();
body = `
<p>Id: ${json["id"]}</p>
<p>Name: ${json["name"]}</p>
<img src="${json["sprites"]["front_default"]}" alt="${json["name"]}">
`;
}
return new Response(body, {
status: resp.status,
headers: {
"content-type": "text/html",
},
});
};
serve(handler);
実行イメージ
デプロイしてみよう!
Denoは簡単にホスティングすることができるらしいのでちょっと試してみます。
まずは以下から登録します。
今回はFREEを選択
GitHubアカウントと連携
プロジェクトを作成します
※先ほどのコードをGitHubにpushしておくこと
GitHubと連携後、プロジェクトの設定をします。
プロジェクト名は好きな名前にしてください。
無事に作成できました!
生成されたリンクにアクセスしてみると
無事に画面が表示されました!
まとめ
たったこれだけの設定、コードでちょっとしたアプリを作成することができました。
普段はNode.jsを使っていますが、かなり開発体験が良かったので今後は積極的にDenoも触ろうと思います。
Discussion