Node.js & expressのアプリをdeno & honoに置き換えた
tags: deno javascript typescript
概要
家のPCで動かしてるNode.jsとexpressで作られたwebアプリをDenoとHonoに置き換えた。
アプリの概要としてはweb uiからapi経由でchild_processを実行するもの(文字にするとセキュリティ的にかなりやばそう)
そのためReactで簡易なUIを作り、バックエンドはexpressで作っていた。
乗り換え理由としてはDenoやHonoを使ってみたかっただけだが、Dockerで動かしていたのでDenoに置き換えることで単一の実行ファイルにできればDockerfileが簡単になるのでやりたかった
構成
あまり大きく変えたくはなかったのでフロントエンドはReact x Viteのままで、フロント側のフォーマッター, リンターはbiomeを使うことにした
ディレクトリ構成は以下。package.jsonやbiome.json, deno.jsonなどもあるが省略
.
├── client - frontのコード
├── public - viteのpublic dir
└── server - backendコード(deno x hono)
この構成でdev時はviteのproxy機能でバックエンドにアクセスし、dockerで動かす時はhonoのserveStaticを使う
置き換え時に気になったことなど
ほぼほぼ自分にDenoとHonoの知識がないのが大きいとは思う
やったこと
- child_processの実行をこれを気に
zxにした process.cwdなどをDeno.cwdなどDenoのものに変更
よかったこと
- import時のパス指定Node.js(
.ts)だとxxx.jsにする必要があるが、denoだとxxx.tsでできる - 昔はnpmパッケージ使うと
deno compileできなかったようだが今はできる node:xxxでnodejs互換のモジュールが使える- お陰で書き換える量が減った
 - 今後徐々にDenoの機能に置き換えていきたい
 
watchモード使えた- いまいち仕組みわからんけど、エントリファイル指定すると動いた(
--unstable-fsフラグはいる)deno run -A --unstable-fs --watch ./server/main.ts ./server/main.ts
 - 依存ファイルが変更されてもちゃんとリロードされた
 - nodejsにもあるけど、そういえば意識して使ったことない
 
- いまいち仕組みわからんけど、エントリファイル指定すると動いた(
 
気になったこと
importするバージョンを一定にするにはどうすればよいのかa.tsでは[email protected]を使っているが、b.tsでは[email protected]を使っているみたいな状況になると思っていて、どうやって全てのファイルのバージョンを揃えるのか気になった
- nexttickがない?
node:processにnextTick、node:timerにsetImmideiateがあるみたいだがDenoだとどうするのかサッとはわからなかったので今後調べる
 - 基本的にはDenoでも
node:xxxが使えるので完全に置き換え目指さなければそこまで変更点多くも無さそう 
今後やること
勉強のためにDeno, Honoにしてみた所移行自体は簡単にできたがテストが移行できていない。
というのも元のコードはjest→vitestと更新されていたので、vitestで書かれているが、Denoにはtest機能があるみたいなのでvitestを捨ててこれで書き直すべきなのか、置き換えられないパターンがあったりするからvitestのままでいいのかまだ判断できない…
最後に
ふと置き換えるにあたって作り始めたのはいつなんだろうと思ったら、2018年8月6日が最初のコミットだったらしく、6年も使っていたことに驚いた