Upgrade to Pro — share decks privately, control downloads, hide ads and more …

バックエンドNode.js × フロントエンドDeno で開発して得られた知見

バックエンドNode.js × フロントエンドDeno で開発して得られた知見

toranoana.deno #20 発表資料

ayame113

March 14, 2025
Tweet

More Decks by ayame113

Other Decks in Programming

Transcript

  1. 自己紹介
 • ayame113
 • 所属:株式会社ヴァル研究所
 ◦ 「駅すぱあと」乗換案内の会社です 
 
 •

    新卒1年目です!
 • 業務ではNode.jsでバックエンドを書いてます
 • DenoにOSSコントリビュートしてました
 3
  2. ディレクトリ構成
 .
 ├── backend バックエンド(Node.js)
 │ ├── src
 │ ├──

    package.json
 │ └── tsconfig.json
 └── frontend フロントエンド(Deno)
 ├── src
 └── deno.json
 9
  3. ①エディタの設定
 • .vscode/settings.json
 ◦ deno.enablePathsを使う 
 
 
 
 


    
 
 ◦ この設定で、frontendディレクトリ内だけDenoが有効になる 
 // .vscode/settings.json { "deno.enablePaths": [ "./frontend" ], } 12
  4. ②フロントエンドとバックエンドで型を共有する
 • 難しい
 • 同じ言語とはいえ、Node.jsとDenoでは、モジュール解決や使える変数などが異なる
 ◦ URL import
 ◦ JSR


    ◦ グローバル変数
 ▪ globalThis.Deno → Denoだけで使える 
 ▪ globalThis.Buffer → Node.jsだけで使える (Denoで使うには--unstable-node-globals) 
 13
  5. ②フロントエンドとバックエンドで型を共用する
 • やり方は2パターン考えられる
 15 Deno
 Node.js
 Node.js
 Deno
 共通
 モジュール


    import
 import
 import
 Deno側からNode.js側を 
 直接importする
 
 DenoのNode.js互換モードなら、 
 Node.jsのコードを解釈できる! 
 HonoのRPCモードみ たいな感じ

  6. ②フロントエンドとバックエンドで型を共用する
 • やり方は2パターン考えられる
 16 Deno
 Node.js
 Node.js
 Deno
 共通
 モジュール


    import
 import
 import
 共通モジュールを作って、 
 それぞれからimportする 
 共通モジュールは、Node.jsと Denoの両方から実行できる ようにしておく

  7. ②フロントエンドとバックエンドで型を共用する
 • どっちのパターンにする?
 • Deno側からNode.js側をimportするのは色々大変
 ◦ DenoにはNode.js互換モードがあるとはいえ、まだ完全な互換ではない 
 ◦ 先人


    ▪ Denoでnpm用フレームワークを含めたモノレポを作るのは渋い 
 ◦ git dependencyやpeer dependency、CJSの解決周りで動かないことがある 
 ▪ 1年後くらいには動くようになってそうだが、、、 
 →共通モジュールを使う方を選択!
 17
  8. ディレクトリ構成
 .
 ├── backend バックエンド(Node.js)
 │ ├── src
 │ ├──

    package.json
 │ └── tsconfig.json
 └── frontend フロントエンド(Deno)
 │ ├── src
 │ └── deno.json
 └── shared バックエンド/フロントエンド共通モジュール
 ├── schema.ts
 └── schema.graphql
 19
  9. Node.js & Deno どちらでも実行できるモジュール
 21 import { z } from

    "zod"; export const ParameterSchema = z.object({ page: z.number(), limit: z.number(), }); { "dependencencies": { "zod": "^3.24.2" } } { "imports": { "zod": "npm:zod@^3.24.2" } } Node.js - package.json
 Deno - deno.json

  10. つらみ&うれしかったこと
 • つらみ
 ◦ 一部のnpmライブラリはまだDenoで動かない 
 ◦ node_modulesから逃れられない 
 •

    うれしかったこと
 ◦ フォーマッター、リンターはDenoに組み込み 
 ◦ 両者のいいとこ取りできる 
 ◦ deno deployのデプロイが爆速 
 24
  11. つらみ① - 一部のnpmライブラリはまだDenoで動かない
 うまく動かなかった事例
 • git dependencyは非対応
 ◦ ライブラリの依存関係を辿っていった先に1つでもgit dependencyがあると、型エラーが起きる

    (vscode上)
 • peerDependency周りでたまにエラー出る
 ◦ インストールのタイミングによってエラーが出たり出なかったりした 
 • CommonJSの型定義が解決できないことがある(?)
 ◦ if文の中でmodule.exportしているとany型になる? 
 • npmのCLIの設定ファイルをTSで書く場合
 ◦ 設定ファイル内からjsrライブラリをimportできない? 
 25
  12. つらみ① - 一部のnpmライブラリはまだDenoで動かない
 うまく動かなかった事例
 • git dependencyは非対応
 ◦ ライブラリの依存関係を辿っていった先に1つでもgit dependencyがあると、型エラーが起きる

    (vscode上)
 • peerDependency周りでたまにエラー出る
 ◦ インストールのタイミングによってエラーが出たり出なかったりした 
 • CommonJSの型定義が解決できないことがある(?)
 ◦ if文の中でmodule.exportしているとany型になる? 
 • npmのCLIの設定ファイルをTSで書く場合
 ◦ 設定ファイル内からjsrライブラリをimportできない? 
 26 エラーが出たら
 とりあえずesm.shを使っておけば解決しました

  13. まとめ
 • Node.jsとDenoは1プロジェクト内で共存できる?→できる!
 ◦ deno.enablePaths
 ◦ フロントエンド/バックエンドで型を共有するには一手間かける必要あり 
 • Node.jsプロジェクトにも徐々にDenoを導入できる


    ◦ Denoの辛いところ→Node.js互換性があと一歩惜しい 
 ◦ Denoのいいところ→ツール周り、セキュリティ、デプロイ爆速 
 ◦ Node.jsとDenoでいいとこ取りしていきましょう! 
 32
  14. 33