$30 off During Our Annual Pro Sale. View Details »

Bun 試してみた

Bun 試してみた

More Decks by NearMeの技術発表資料です

Other Decks in Programming

Transcript

  1. 1 Bunとは? “Bun is a JavaScript runtime, package manager, bundler

    and test runner built from scratch using the Zig programming language. Bun uses JavaScriptCore as the JavaScript engine, unlike Node.js and Deno, which both use V8.” https://en.wikipedia.org/wiki/Bun_(software) “Bunのサイトでは、V8ではなくJSCを採用したこと(JSCのほうがメモリ効率が良く、 JITのやり方が違うため)と内部のコードに Zig を採用したのがミソと書かれていますが、私は Bunと他のランタイムのパーフォマンス差には別の理由があると思っています。 ...ク ルマに例えるとギア(変速機)の数が違い、 V8は3段変速ギア、JSCは4段変速ギアと捉えることができるでしょう。クルマのギアで あれば、低速ギアは加速は速いものの最高速は遅く、高速ギアは加速が遅いものの最高速は速いので、走行条件に応じてギア を切り替える必要があります。 ” https://gihyo.jp/article/2023/01/tfen005-bun ”Zig は C の置き換えみたいな感じなので、あとはどういう安全性を選ぶかで Zig か Rust か使い分けることになりそう。 ... Zig は GC なしでバイナリサイズが小さくほどよく安全なコードをモダンな言語で書きたいみたいなケースに向いているのでは。ほどよく安 全でよければいいけど、 Rust だと厳しすぎでもっと手軽に書きたいというケースは意外と多い気がしていて、そういう用途には普通 に向いている気がする。 ” https://zenn.dev/helloyuki/scraps/a012ef8cc52fc0 個人的ポイント とりあえず、速い、軽いらしい
  2. 2 インストール curl -fsSL https://bun.sh/install | bash これでインストール完了。 (シェルを再起動すると) bunコマンドが使える。

    ※ M1 Macで現最新のv1.0.3だと https://github.com/oven-sh/bun/issues/6035 という問題が あったので、 curl -fsSL https://bun.sh/install | bash -s "bun-v1.0.2" と指定してv1.0.2に落とした。
  3. 3 動かしてみる index.ts を作成 bun index.ts を実行し、localhost:3000を閲覧 const server =

    Bun.serve({ port: 3000, fetch(request) { return new Response("Welcome to Bun!"); }, }); console.log(`Listening on localhost:${server.port}`); ※ ポートが被る場合は別のポートを指定
  4. 4 パッケージング bun init でシンプルなプロジェクト作成 bun add figlet でFigletパッケージをインストール bun

    add -d @types/figlet で型情報を開発用にインストール ※ lockファイルは? bun.lockb というファイルが作成される。 バイナリ形式で保存されていて、 bun bun.lockb で中身を見ることができる。 なお、bun pm ls --all で各パッケージのバージョン情報を見やすく一覧できる。 ※ キャッシュは? デフォルトでは、~/.bun/install/cache にグローバルなキャッシュとして各パッケージが保存される。 インストール時にそこから node_modulesに、macではclonefile、linuxではhardlinkされる。 (インストール速度は十分に検証できてないが体感速い)
  5. 5 Expressも使える bun add express でインストール server.ts を作成 bun server.ts

    を実行 https://bun.sh/guides/ecosystem/express import express from "express"; const app = express(); const port = 8080; app.get("/", (req, res) => { res.send("Hello World!"); }); app.listen(port, () => { console.log(`Listening on port ${port}...`); });
  6. 6 Sentryも使える bun add @sentry/bun でインストール あとは、import以外は同じ import * as

    Sentry from "@sentry/bun"; Sentry.init({ dsn: "https://[email protected]/45 05599472041984", tracesSampleRate: 1.0, }); https://docs.sentry.io/platforms/javascript/guides/bun/
  7. 10 これからな部分 - コンテナとホストのアーキテクチャが異なると(M1/M2 Macでamd64のコンテナを利用するな ど)、HTTPサーバー軌道だけで、なぜかメモリ900Mくらい使用された - “複雑な”サービスはうまく動かなかった - requireは先にimportしてからでないとSegmentation

    faultになった - DB接続ツールSequelizeが動かなかった - https://github.com/oven-sh/bun/issues/5902 - jest互換のmockはまだ用意されていなかった - https://github.com/oven-sh/bun/issues/5394 - process.onのNode.js互換は主要なところは大丈夫そう。細かいところはまだ。 - https://github.com/oven-sh/bun/issues/429 - メモリリーク関連のオープンなイシューがそれなりにある - https://github.com/search?q=repo%3Aoven-sh%2Fbun+memory+leak&t ype=issues (現時点で8個)
  8. 11 所感 - 大幅なパフォーマンス向上が見込めるので検討するに値する - インストール速度、立ち上げ速度、テスト速度等が底上げされているので 開発体験向上も見込める - 既存のNode.jsコードからほとんど変更せず動作した -

    ただし、現状うまく動かない重要なパッケージや組み込み関数も存在する - まずは、CPUインテンシブなシンプルなサービスから取り入れていくのは ありだと思う