Slide 1

Slide 1 text

Node vs Deno vs Bun 〜推しランタイムを見つけよう〜 2025.1.10 BuriKaigi 2026 Day2 - Room 203 マス すずとも / kamekyame

Slide 2

Slide 2 text

自己紹介 すずとも / subname: kamekyame 株式会社 jig.jp フロントエンドエンジニア 福井県 出身 ???(←JSランタイムが入る)、Angular 2 @SuzuTomo2001 @kamekyame kamekyame.com

Slide 3

Slide 3 text

Node, Deno, Bun …の前に 3

Slide 4

Slide 4 text

Node, Deno, Bun …の前に JavaScript®(JS)知っていますか? ● ブラウザ用に開発され、ECMAScript(言語仕様)を満たした言語 ● Java ≠ JavaScript ● ブラウザによって エンジン(実行環境)が異なる ○ Google Chrome → V8 ○ Firefox → SpyderMonkey ○ Safari → JavaScriptCore 4

Slide 5

Slide 5 text

Node, Deno, Bun …の前に TypeScript(TS)知っていますか? ● 「TypeScript is JavaScript with syntax for types.」(引用) ○ 訳)TypeScript は型構文を持つ JavaScript ○ JavaScript のスーパーセット ● Microsoft が開発(オープンソース) ○ https://github.com/microsoft/TypeScript ● コンパイル・開発 時に型チェックができる ● 実行するには JS に変換(トラスパイル)する必要がある ○ 型構文は 無視 される(≠ 型情報が JS に変換される) 5

Slide 6

Slide 6 text

Node, Deno, Bun とは 6

Slide 7

Slide 7 text

Node, Deno, Bun とは 三大 JS(/TS)ランタイム ● JS を動かすためのソフトウェア ● JS をサーバサイドでも使えるようにしたもの ○ サーバサイド に限らず CLIツール・デスクトップアプリ・スマホアプリ ● 実行速度… 流石に C, Rust には叶わない(とはいえ気にするほどでもない) どれも JS(/TS)を実行できる 固有の機能、取り巻く環境 など細かい違いがある 7

Slide 8

Slide 8 text

👝 持って帰ってほしいこと JS ランタイムを知らない方 → JS ランタイムの概要を Node.js を使ってきた方 → Deno や Bun との違いを 3つをすでに知っている方 → さらにディープな違いを とにかく比較をしていきます! 最後に僕の推しランタイムを紹介(布教) 8

Slide 9

Slide 9 text

おことわり Node の正式名称は「Node.js®」 言いやすさ・表記のまとまりの関係で Node としています 基本は本発表時点の最新バージョンを対象としています 9

Slide 10

Slide 10 text

Node Deno Bun 徹底比較 10

Slide 11

Slide 11 text

ロゴ・マスコットキャラクター https://bun.com/press-kit https://deno.com/brand https://nodejs.org/ja/about/branding Node Deno Bun 11 Rocket Turtle

Slide 12

Slide 12 text

SNS(X) Node Deno Bun 12 @deno_land @nodejs @bunjavascript 7 万フォロワー 9.6 万フォロワー 90.2 万フォロワー

Slide 13

Slide 13 text

日本コミュニティ 13 Node Deno Bun Japan Node.js Association Deno Japan Users Group ×

Slide 14

Slide 14 text

基本情報 14 読み方 開発者 エンジン 開発言語 Node Deno Bun HP 開発元 ノード ジェイエス Ryan Dahl OpenJS Foundation V8 C++, JS https://nodejs.org/ ディーノ(dee-no) Ryan Dahl Deno Land Inc. V8 Rust, JS, TS https://deno.com/ バン Jarred Sumner Anthropic JavaScriptCore Zig, JS, TS https://bun.com/

Slide 15

Slide 15 text

LTS 周期 初回・最新リリース・LTS 15 Node Deno Bun 偶数バージョン 規則性なし - 初回リリース日 一般公開 から 30ヶ月 規則性なし - LTS 期間 24.x 2.5.x(※2) - 最新 LTS(※1) ※1 LTS = Long Term Support ※2 Deno の LTS サポートは終了する見込み(参考) 2009.5.28 (v0.0.1) 2019.8.23 (v0.1.0) 2021.9.15 (v0.0.0-10) 最新リリース日 2025.11.17 (v25.2.1) 2026.1.5 (v2.6.4) 2025.12.18 (v1.3.5)

Slide 16

Slide 16 text

速度比較 ※ Bun 調べ(引用) 16 Express 1位:Bun 2位:Deno 3位:Node Postgres 1位:Bun 2位:Node 3位:Deno WebSocket 1位:Bun 2位:Deno 3位:Node

Slide 17

Slide 17 text

各ツール Package Manager 17 Lint Format Bundle Node Deno Bun × (npm install, ...) Benchmark × × × × ○ deno add, ... ○ deno lint ○ deno fmt ○ deno bundle ○ deno bench ○ bun install, ... × × ○ bun build ×

Slide 18

Slide 18 text

TypeScript 対応 18 Node Deno Bun △(※) node main.ts ※ Enum や Namespace の使用にはフラグが必要 → node --experimental-transform-types main.ts ○ deno run main.ts ○ bun main.ts 実行 型チェック × ○ deno check main.ts × トランスパイラ SWC(WASM) SWC(Rust) 独自実装

Slide 19

Slide 19 text

モジュールシステム対応 19 Node Deno Bun ○ △ 拡張子 .cjs, .cts のみ ○ CommonJS ○ ◎ URL Import にも対応 ○ CommonJS ESModule const fs = require("node:fs") import * as fs from "node:fs" ESModule

Slide 20

Slide 20 text

環境変数ファイル 読み込み 20 Node Deno Bun ○ --env-file ◎ 自動(※) ○ --env-file=... --env-file-if-exists=... ○ --env-file=... (Node の if-exists 相当) △ --env-file=.env .env 特定ファイル ○ --env-file=... ※ NODE_ENV に合わせて .env.production, .env.development, .env.test を読み込む API_BASE_URL=https://api.example.com API_ENDPOINT=${API_BASE_URL}/v1/users × ○ 変数展開 ○

Slide 21

Slide 21 text

テストツール 21 Node Deno Bun node:test node:assert Deno.test() jsr:@std/testing jsr:@std/assert jsr:@std/expect コマンド 主な使用関数 パッケージ bun:test ○ node --test ○ deno test ○ bun test

Slide 22

Slide 22 text

ランタイム本体サイズ・SEA (※) サイズ 22 Node Deno Bun 121.8 MB 88 MB 57.1 MB 本体 120.5 MB 70.4 MB 57.1 MB SEA(※) SEA作成方法 sea-config.json 作成 node 本体のコピー postject で blob 注入 署名つけ外し deno compile ... bun build --compile ... ※ SEA = Single Excutable Application(単一実行可能ファイル) console.log("Hello, World!"); コンパイルするファイルの中身

Slide 23

Slide 23 text

カスタムスクリプト(npm scripts のようなもの) 23 Node Deno Bun × (npm run ...) ○ deno task ... ○ bun run ... - ○ deno_task_shell cp, mv, rm, mkdir, pwd, sleep, echo, cat, exit, head, unset, xargs クロスプラット フォーム対応 ○ bun shell ls, cd, rm, … リダイレクト、パイプ、変数、 Shebang、Glob、… リダイレクト、パイプ、変数、sh ファイル、… 対応 - deno.json > "tasks" 記述場所 package.json > "scripts"

Slide 24

Slide 24 text

各ランタイム個別紹介 24

Slide 25

Slide 25 text

Node ● 15 年以上前からある古参 JS ランタイム ● 実行以外の部分は基本、外部ツール任せ ○ npm/yarn/pnpm, prettier, eslint, biome, tsc, … ● npm にある パッケージ資産 も強力 ○ React, Vue, Angular, Next.js, Vite, … ○ Jest, Vitest, Playwright, … ○ Electron, React Native, … ● 実運用環境において 実績は抜群 25

Slide 26

Slide 26 text

Deno ● Node の作者(Ryan Dahl)が Node の反省を活かして作ったランタイム ● "node".split("").sort().join("") // = "deno" ● Web 標準 ○ Stage3 Temporal API など先行実装している部分もある ● セキュアなランタイム ○ デフォルトはファイル・ネットワーク・環境変数など何もアクセスできない ● ゼロコンフィグ ○ 設定不要で TS、フォーマット、リントの機能が利用可能 ○ deno.json 等でカスタマイズも可能 26 小ネタ:登場した当時、"Deno" で検索すると 札幌の担々麺専門店「175°DENO担々麺」が出てくるので困った

Slide 27

Slide 27 text

Bun ● 速さ と Node 互換性 を意識したランタイム ○ 速さに関しては諸説ある ○ Node API 互換性は 95%! ● 単なる パッケージマネージャ としても使用可能 ○ 実行自体は Node でも OK ○ パッケージインストールの速度は群を抜いて早い(npm/yarn/pnpm 比較) ● v1.0 は Windows 非対応 だったが、v1.1 ですぐ対応された ● SQL・S3 クライアントなどに built-in で対応 ○ PostgreSQL, MySQL, SQLite, Amazon S3, Redis 27

Slide 28

Slide 28 text

比較してきましたが 違い、分かりましたか? 28

Slide 29

Slide 29 text

僕の推しランタイム 29

Slide 30

Slide 30 text

Deno 30 ※ 本布教は特定の企業・団体(所属企業を含む)からの支援・依頼に基づくものではありません

Slide 31

Slide 31 text

Deno 推しポイント ① つながりがある & かわいい 福井 といえば 恐竜 といえば Deno 福井 といえば 越前がに といえば カニ といえば Rust といえば Deno ロゴ・マスコットがかわいい 31 Original v1 v2 v1時代のドキュメントローディング表示 v1 rev.2 引用元 Original, v1 Artwork | Deno v1 rev.2 https://github.com/denoland/dotland/pull/1836 v2 Branding | Deno ローディング Denoで「画像変換&加工」アラカルト - Zenn

Slide 32

Slide 32 text

Deno 推しポイント ② ゼロコンフィグ & ツールも豊富 ● TS を書くまでの敷居は圧倒的に低い ○ main.ts を作って、deno run main.ts で実行するだけ ● フォーマット・リント込み ○ どこでも deno fmt, deno lint ○ JSON, Markdown などフォーマットに対応しているファイルは多い ● Jupyter で動く JS/TS カーネル が 標準搭載 ○ Jupyter で JS/TS が実行できる ○ コードと実行結果を Jupyter Notebook 形式で保存 → GitHub にプッシュ ■ GitHub 上でプレビュー可能 ■ 後から見返すのに便利 32

Slide 33

Slide 33 text

Deno 推しポイント ③ Deno Deploy ● Deno が動く サーバレスホスティングサービス ● 基本無料 ● GitHub リポジトリからのデプロイが簡単 ○ GitHub Actions の yml ファイルがなくても Deno Deploy コンソール上で設定可能 ● データベース(Deno KV, PostgreSQL)も使える ● Telemetry 表示や Sandbox、Tunnel など 機能が豊富 33

Slide 34

Slide 34 text

Deno 推しポイント ④ Deno 以外の活動 ● パッケージレジストラとして JSR(The JavaScript Registry)を作った ○ TS コードを直接 Publish できる ○ node などで使用する際には JS へのビルドを JSR 側でやってくれる ● JS ランタイムの相互運用を推進する WinterCG を創設(現在の WinterTC) ● 公開パッケージ(OSS) ○ pkg:cargo/rusty_v8 ■ Deno 本体で使用している V8 の Rustラッパー ○ pkg:cargo/deno_task_shell ■ deno task で使用している クロスプラットフォーム Shell ○ jsr:@std 系 ■ Deno 標準ライブラリ。JSR を介して Node, Bun でも使用可能 34

Slide 35

Slide 35 text

Deno まだまだ話したい! ● URL Import の仕組みが結局うまく行かなかった ○ Node の反省から v1 時代は URL Import ベースのパッケージシステムを推していた ■ Deno 3rd Party ○ ただし、外部がホストする URL だと不変性・信頼性・重複読み込みという問題があった ○ package.json, package-lock.json, node_modules という仕組みはうまく作られていたのかも ● NPM サポートをしてしまった ○ 当初は npm は対応しない方向 ■ いつまで経っても Deno の普及が進まない… ■ オプションを付けたときだけ cjs が使えたりちょっと npm 互換に ■ node 標準ライブラリを対応 ■ npm 対応 ○ 型のある・ESM だけの新しい世界…とはならなかった Ask the Speaker, 懇親会 で話しましょう!(Deno に限らず) 35

Slide 36

Slide 36 text

まとめ 36

Slide 37

Slide 37 text

まとめ Node, Deno, Bun どれも JS を実行できるソフトウェア 固有の機能、取り巻く環境が違う どのランタイムにもいいところがあって どれが最適かはユースケースによる 日々アップデートされているので1年後には変わっているかも 気になる方はぜひウォッチしてみてください! 37

Slide 38

Slide 38 text

みなさんの推しランタイム 見つかりましたか? 38