heishi1HUMANITY article

Deno使ってみたい

最終更新 : 2022-08-06

去年結構話題になった「Deno」。すぐにNode.jsを置き換えるような存在になるとは思ってませんが、今のうちにちょっと触って「俺Deno使ったことありますよ。」って言いたいので、前回のwebhook.jsをDenoで動くようにしていきたいと思います。

Dockerfile作る

Denoは使いたいんですけど、Node.js環境も必要なんで、alpineでどっちも動くDockerfileを書いていきます。素のalpineだとDenoを動かせないので、イメージは「frolvlad/alpine-glibc」を使います。

FROM frolvlad/alpine-glibc:latest

RUN apk update && \
    apk --update --no-cache add curl nodejs npm && \
    curl -fsSL https://deno.land/x/install/install.sh | sh && \
    /root/.deno/bin/deno upgrade --version 1.7.0

ENV PATH $PATH:./node_modules/.bin:/root/.deno/bin


curl -fsSL https://deno.land/x/install/install.sh | sh

でDenoをインストールします。

/root/.deno/bin/deno upgrade --version 1.7.0

でDenoのバージョンを1.7.0に下げてます。これは、今回使うServestがこのバージョンより上だと動いてくれなかったための暫定的処置です。

ENV PATH $PATH:./node_modules/.bin:/root/.deno/bin

でnode_modules関係とDenoのパスを通します。


コードを書いていく

Denoではnpmのようなモジュール管理ツールはなく、URLで指定しモジュールを引っ張ってきます。一度使用すればDenoにキャッシュされるらしい。また、モジュールはES Modulesの書き方でimportします。
今回はサーバにServest、コマンド実行にexecを使用してます。サーバはstd/http使っても良いとは思いますけど、Servest使うとExpressライクにかけます。execもなくてもDeno.runでなんとかなるかな?
TypeScriptで書いてもJavaScriptで書いても問題ない(ハズ)です。

import { createApp } from 'https://servestjs.org/@v1.1.7/mod.ts';
import { exec } from 'https://deno.land/x/exec/mod.ts';

const app = createApp();

app.post('/build'async (req: any) => {
  await exec('npm run generate');
  await req.respond({
    status: 200
  });
});

app.listen({ port: 80 });


かなりExpressと似た書き方だと思います。違うとすれば、コールバックがasync関数になってる所が一番大きいですかね?req.respondでレスポンスを返します。詳しくは公式を見てもらえばよいかと。


実行する

Denoは「deno run ファイル名」で実行できますが、サーバを起動する場合や、コマンドを実行する場合はフラグ付きで起動しなくてはなりません。これは安全性のためらしいです。なので「--allow-net」と「--allow-run」のフラグ付きで起動してください。(つまり、「deno run --allow-net --allow-run .webhook.ts」)
動けばOK。


Denoのちょっと嫌な点

Denoはくっそでかいnode_modulesができたりしないのがちょっと嬉しかったり、TypeScriptに最初から対応してる点はありがたいです。ただ、vsCodeでモジュールの補完が効かないんでちょっとあれやな…って思ったりします。まあ、フロントエンドでNode.js使うときってビルドするときがメインだとは思うんですけど、Denoはそれの置き換えにはならないかなとは思います。逆にサーバ書いたり、アプリ作ったりは置き換えていけるんじゃないかな。
あとマスコットは可愛い(確信)


(夜の雨の中に立って、ソフトウェア開発の闇の戦いにストイックに立ち向かう恐竜らしい。参照)

コメント