LoginSignup
24
12

Bun 1.0がリリースされたので、Viteを動かしてDeno、Nodeと比較してみる

Posted at

祝! Bun 1.0リリース!

めっちゃ祝っているように書いてますが、実は1.0リリースまで何もキャッチアップしてませんでした。ミーハーですね。
ということで普段から使ってるViteの初期セットアップをBun、Deno、Nodeで比較してみたいと思います。

BunでViteを動かしてみる。

Bunのインストールと公式情報

Bunのインストール方法などは公式HPを参考にしてもらった方が確実です。
公式HP:

2023/09/09 現在だと下記コマンドでインストールとパスまで通ります。

curl -fsSL https://bun.sh/install | bash

以前Bunをインストールしたことある人は

bun upgrade

でバージョンを最新にできます。

ちなみに公式のガイドで挙げられている、Bunを利用できるフレームワークは以下の通りです。

スクリーンショット 2023-09-09 9.30.48.png

主要なフレームワークは動きそうです。

Viteを動かす

公式ガイド:https://bun.sh/guides/ecosystem/vite

公式でも言及されていますが、BunによるViteセットアップはまだ最適化されていません。Vite側によるBun向けの最適化も進んでいません。その点は留意してご利用ください。

node.jsとほぼ同様の方法で初期セットアップができます。
npxのようにbunxコマンドを利用します。

bunx create-vite bun-vite

viteをセットアップする際のオプションが表示されるのでお好みの設定にします

❯ bunx create-vite bun-vite
✔ Select a framework: › React
✔ Select a variant: › TypeScript + SWC

該当ディレクトリに移動して、bun installでパッケージをインストールします。
爆速です!

公式によるRemixプロジェクトのパッケージインストール速度比較

引用元: https://bun.sh/blog/bun-v1.0
266451126-23cbde35-b859-41b5-9480-98b88bf40c44.png

あとは開発サーバを立ち上げるために、package.jsonを少し変更します。(Nodeと互換性があるので実は変更しなくても動いちゃいます。)

package.json
"scripts": {
-  "dev": "vite",
+  "dev": "bunx vite",
  "build": "vite build",
  "serve": "vite preview"
},
// ...

Bun 1.0より(viteの場合のみかもしれないですが)viteを動作させる際のbunフラグ(--bun)が不要になりました。

あとはbun devコマンドで開発サーバが立ち上がります!

❯ bun dev
$ bunx vite

  VITE v4.4.9  ready in 225 ms

  ➜  Local:   http://localhost:5173/
  ➜  Network: use --host to expose
  ➜  press h to show help

Bun 1.0の印象

どのコマンドも動作が非常に高速なのが印象的でした。Denoと異なり、Node.jsのプロジェクトをそのまま動かせるパターンも多いので移行も簡単そうです。実務のNode.jsのプロジェクトをBunで動かそうとしたら、設定変更なしで動いてしまいました。場合によってはNodeがBunのスイッチングコストが0に近いので、その点は非常に魅力的です。
しかし、nodeで動作するnpmパッケージが全て動くのかというと、まだ未知数なところではあるので新規プロジェクトなどでは実験的に採用する形になると思います。各フレームワークでのセットアップ方法が公式から出ているので、その点も強みですね。

DenoでViteを動かしてみる。

Denoのインストールと公式情報

インストール方法について、公式ガイドを参考にしてください。
shellでインストールする場合:

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

以前Denoをインストールしたことある人は

deno upgrade

でバージョンを最新にできます。

denoで利用できるフレームワークはまだまだ少ないですが、例えば次のようなものが挙げられます。
https://deno.land/manual@v1.36.4/getting_started/web_frameworks

  • Fresh
    • PreactベースのDeno公式Webフレームワーク。Islandアーキテクチャを採用しており、インタラクティブ要素をWebサイトに追加しながらも動作が軽量。
  • Aleph
    • Next.js,Remix,Viteにインスパイアされたフレームワーク。最近開発スピードが落ちている印象。アルファ版のため動作が不安定です。
  • Lume
    • SSGフレームワーク(Astroみたいな立ち位置)
    • セットアップと設定が非常に簡単。シンプルさと柔軟性に個人的に惹かれています。
  • Oak
    • Express.jsと同じ立ち位置。サーバサイドフレームワーク。
  • その他
    • denoでもnpmパッケージが利用可能なので動くかどうかは未知数ですが、nodeのフレームワークも多数利用可能なはずです。

Viteを動かす。

下記コマンドを実行。

deno run --allow-read --allow-write --allow-env npm:create-vite-extra@latest

初期設定をします。templateはdeno-hogehogeを選択してください。

❯ deno run --allow-read --allow-write --allow-env npm:create-vite-extra@latest
✔ Project name: … deno-vite
✔ Select a template: › deno-react
✔ Select a variant: › TypeScript + SWC

あとはプロジェクトのディレクトリに移動して、deno task devでローカルサーバを立ち上げます。

cd deno-vite
❯ deno task dev
Task dev deno run -A --unstable --node-modules-dir npm:vite

  VITE v4.4.9  ready in 178 ms

  ➜  Local:   http://localhost:5173/
  ➜  Network: use --host to expose
  ➜  press h to show help

Deno+Viteの初期画面かわいいです。
スクリーンショット 2023-09-09 10.39.56.png

Deno+Viteの印象

DenoでViteを動かす場合はnpmパッケージを利用するのでDeno本来の性能が出しきれていない可能性があります。それでも速いです。しかし、さらに別のnpmパッケージ(MUIなど)をインストールする場合は、そのパッケージがDeno上だと正常に動作しない可能性があるので注意する必要があります。

NodeでViteを動かしてみる。

ネット上にたくさん情報があるので端折ります。速いと言われているpnpmで試してみます。

pnpm create vite
.../Library/pnpm/store/v3/tmp/dlx-15297  | Progress: resolved 1, reused 0, downloaded 0, add
.../Library/pnpm/store/v3/tmp/dlx-15297  |   +1 +
.../Library/pnpm/store/v3/tmp/dlx-15297  | Progress: resolved 1, reused 0, downloaded 0, add
.../Library/pnpm/store/v3/tmp/dlx-15297  | Progress: resolved 1, reused 1, downloaded 0, added 1, done
✔ Project name: … node-vite
✔ Select a framework: › React
✔ Select a variant: › TypeScript + SWC

Scaffolding project in /Users/masaharuinomata/WebstormProjects/jsruntime-test/node-vite...

Done. Now run:

  cd node-vite
  pnpm install
  pnpm run dev

❯ cd node-vite
❯ pnpm install
Packages: +152
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Downloading registry.npmjs.org/typescript/5.2.2: 7.23 MB/7.23 MB, done
Downloading registry.npmjs.org/@swc/core-darwin-arm64/1.3.83: 12.85 MB/12.85 MB, done
Progress: resolved 182, reused 125, downloaded 27, added 152, done
node_modules/.pnpm/@swc+core@1.3.83/node_modules/@swc/core: Running postinstall script, done in 673ms

dependencies:
+ react 18.2.0
+ react-dom 18.2.0

devDependencies:
+ @types/react 18.2.21
+ @types/react-dom 18.2.7
+ @typescript-eslint/eslint-plugin 6.6.0
+ @typescript-eslint/parser 6.6.0
+ @vitejs/plugin-react-swc 3.3.2
+ eslint 8.49.0
+ eslint-plugin-react-hooks 4.6.0
+ eslint-plugin-react-refresh 0.4.3
+ typescript 5.2.2
+ vite 4.4.9

Done in 45.2s
❯ pnpm dev

> node-vite@0.0.0 dev /Users/masaharuinomata/WebstormProjects/jsruntime-test/node-vite
> vite


  VITE v4.4.9  ready in 298 ms

  ➜  Local:   http://localhost:5173/
  ➜  Network: use --host to expose
  ➜  press h to show help

三つのランタイムの比較。

個人の感想としては、

  • Bun

    • 一つ一つのコマンドの実行が体感できるほど速いです。
    • node.jsに慣れている方なら、コマンドも違和感なく使えます。
    • 特にパッケージのインストールが速いです。
    • Githubのコントリビュータを見ると、個人開発に近い開発体制のようですので、その点が少し心配です。
  • Deno

    • Deno本体のインストールからViteプロジェクトまでの立ち上げまでの操作数が少ないです。
      • Deno本体に多くの機能が組み込まれているため、別でパッケージマネジャーやその他の管理をする必要がありません。
    • DenoモジュールのインポートはURLベースなので、依存管理に悩まされることはありません。
    • npmパッケージは利用できますが、動作が不安定な場合があります。
  • Node

    • 速度の面では少し劣りますが、npmの本家であるため確実に動作します。
    • Web上に情報が豊富にあります。
    • 設定が煩雑です。
      • パッケージマネージャ、リンター、フォーマッター、テストランナーなど、それぞれに設定する必要があります。

速度の面から

初めて感じたのは、意外とpnpmが速いということです。
Viteの立ち上げを見ると、BunとDenoは競っているように思います。だいたい200ms程度でローカルサーバが立ち上がっているようです。
ビルド時間などのベンチマークを試してみないと、どちらが優れているかは判断できません。Nodeとの互換性の面ではBunが優れています。DenoはNodeの開発の反省点を生かして開発されているので、Nodeの不都合な点は取り除かれている印象です。Nodeとの完全な互換性は考慮されていないようです。
少し遅いがnpmの資産が利用できるNode.js速いがnpmの資産が利用できないDenoの対立の中で、npmの資産が利用できて速いBunが登場したことは、新たな動きを生んだようです。

まとめ

それぞれメリットデメリットがあり、一概にどれが優れているとは言えない状況ですがNode一強の環境では無くなったのは確実です。それぞれがお互いの良いところを吸収して欲しいです。

24
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
12