🍔

Bun 新しいALL in one JavaScript Runtime

2024/05/29に公開

https://bun.sh/
https://snyk.io/blog/javascript-runtime-compare-node-deno-bun/

Bunとは?

BunはNode.jsと同じJavaScriptのruntimeで、速いスタート、速い実行性能、一貫した開発者体験(使いやすさ、一貫性、統合性)という3つの事項に焦点を合わせて作られました。

Bunが速い理由

BunはV8のような既存の方式よりもっと速くスタートして遂行するJavaScriptCoreエンジンを使用します。また、BunはBunの全ての部分を最適化する時使われているプログラミング言語のZigで作されてもっと速く動作するそうです。

Bun設置

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

自分おパソコン(mac M1)で設置しようとしたんですが、できなかったのでhomebrewで設置しました!

brew tap oven-sh/bun
brew install bun

前はWindowで使いづらかったんですが、最近バージョンが1.1.10でアップグレードされてからWindowでも使えるようになりました!

powershell -c "irm bun.sh/install.ps1 | iex"

Bunプロジェクト作成

bun init -y

ほんとに速いです!!プロジェクトがすぐ作成されます!!

Bunの最大の魅力は、Typescriptで作成されたものをJavaScriptに変換せずにすぐに実行できることです。
たとえば、簡単なTypescriptを作成してみましょう。

index.ts
let message: string = "hello world!";
console.log(message);
bun index.ts


Bunでターミナルですぐ実行可能です!
nodejsで作業をした時には、Typescriptで作成されたものをtscコマンドでcompileしなければなりませんでしたが、bunは別にcomplieをする必要はありません!

npx tsc index.ts

パッケージマネージャー内蔵

Bunは独自にパッケージマネージャーを内蔵しており、npmやYarnのような既存よく使われていたパッケージマネージャーと互換までできます。
例えば、package.jsonファイルに明示されているすべてのパッケージをインストールしたい場合は、bun installで実行すればよいです。

bun install

新しいパッケージを追加したいならbun add

bun add react

既存パッケージを削除したいならbun remove

bun remove react

CLIが既存に使ったパッケージマネージャーとほぼ一緒なので和感なく使えるというメリットがあります。また、どのパッケージマネージャーを使うかなっと悩む必要ありません!

テストランナー内蔵

JavaScriptでテストをするときにjestをよく使いますが、他のプログラミング言語には基本的にテスト機能が含まれている場合が多いです。
それで、最近JavaScriptもそのような方向に変化してはいます。
Node.jsは最新バージョンである20から独自のテストランナーAPIを含んでいます。
もうNode.jsだけあればテストができるようになりました。
たとえば、node:test モジュールを使用してテストを作成できます。

import { test } from "node:test";
import assert from "assert";

function sum(a, b) {
  return a + b;
}

test("adds 1 + 2 to equal 3", () => {
  assert.strictEqual(sum(1, 2), 3);
});

test("adds -1 + -1 to equal -2", () => {
  assert.strictEqual(sum(-1, -1), -2);
});

test("adds 0 + 0 to equal 0", () => {
  assert.strictEqual(sum(0, 0), 0);
});


でもNodejsではpackage.jsonの設定をかわらないとテストができないです。

package.json
  "scripts": {
    "test": "node --test"
  },
  "type": "module",

Bunも同じく最初からテスト機能を含んでいます。bunだけ設置すればすぐテストが可能です。
別の設定はいらないです!

index.test.ts
import { test, expect } from "bun:test";

function sum(a: number, b: number) {
  return a + b;
}

test("sum adds two numbers correctly", () => {
  expect(sum(1, 2)).toBe(3);
  expect(sum(-1, -1)).toBe(-2);
  expect(sum(0, 0)).toBe(0);
});

bun test で実行するとすぐテストができます!

NodejsでテストをしてBunを使ってみたら、かなり早いと感じました!

Transfiler/Bundler内蔵

Bunを使用すると、常にcomplieを省略することはできないです。
Bunを使用しても、実際にブラウザで実行するためには、TypescriptをJavascriptに変換する必要があります。
理由としては、ブラウザがTypescriptコードを直接実行できないためです。

でも、Bunを使えば、JSXで作成されたコードを別途のTransfilerなしでもすぐに処理することができます。
JSXコードをブラウザで実行できるJavaScriptに変換する必要がありますが、Bunはこの作業を自動的に処理してくれます。

さらに、ブラウザがダウンロードして実行する必要があるJavaScriptコードを最適化するために、bundlerまでbun buildで独自にサポートします。
Bun一つさえあれば、TypeScriptやBabel、Webpackのような開発ツールがなくても、Web site配布のためのアプリケーションbuildを処理することができます。

BunがNode.jsを代替するか?

bunはnodejsを完璧に代えることができる! とJavaScriptのruntimeでマーケティングをしていますが、単にBunの方が早いからといって、長い間安定性が検証されたNode.jsを離れることは難しいかなと思います
バックエンドサーバーのruntimeを交換するには、リスクが伴うためです。
でも、新規プロジェクトにはbunを使ってもいいのではないかと思います。

結論

complie、test、Transfiler、BundlerをすべてBun一つで行うことができ、まさに万能(All-in-one)runtimeと呼ぶことができます。
このように様々な機能を一度に提供しながらも、既存の他のruntimeより良い性能を見せてくれるとは、本当に驚きました。
BunがNode.jsを完全に代替できるかどうかはまだ確かではありませんが、新規プロジェクトで使用するのに十分な魅力と長所を持っています。
長い間、安定性と信頼性を検証されたNode.jsを直ちに離れることは難しいですが、Bunは明らかに今後のWeb開発環境で重要な役割を果たすものと期待されます。
まだnodejsについて勉強が足りないのでnodejsを勉強しながらbunも一緒に使ってみたいと思いました。

Discussion