blog.yuzu441.com

Node.js & expressのアプリをdeno & honoに置き換えた

tags: deno javascript typescript

概要

家のPCで動かしてるNode.jsとexpressで作られたwebアプリをDenoHonoに置き換えた。

アプリの概要としては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にした
    • 元のコードでcwdオプション使っていてzxのwithinを使うならdaxの.cwd使う方が良いかも
  • 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:processnextTicknode:timersetImmideiateがあるみたいだがDenoだとどうするのかサッとはわからなかったので今後調べる
  • 基本的にはDenoでもnode:xxxが使えるので完全に置き換え目指さなければそこまで変更点多くも無さそう

今後やること

勉強のためにDeno, Honoにしてみた所移行自体は簡単にできたがテストが移行できていない。
というのも元のコードはjest→vitestと更新されていたので、vitestで書かれているが、Denoにはtest機能があるみたいなのでvitestを捨ててこれで書き直すべきなのか、置き換えられないパターンがあったりするからvitestのままでいいのかまだ判断できない…

最後に

ふと置き換えるにあたって作り始めたのはいつなんだろうと思ったら、2018年8月6日が最初のコミットだったらしく、6年も使っていたことに驚いた