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

Bun 試してみた

Bun 試してみた

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

Other Decks in Programming

Transcript

  1. 0
    Bun 試してみた
    2023-09-29 第62回NearMe技術勉強会
    Kenji Hosoda

    View Slide

  2. 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
    個人的ポイント
    とりあえず、速い、軽いらしい

    View Slide

  3. 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に落とした。

    View Slide

  4. 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}`);
    ※ ポートが被る場合は別のポートを指定

    View Slide

  5. 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される。
    (インストール速度は十分に検証できてないが体感速い)

    View Slide

  6. 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}...`);
    });

    View Slide

  7. 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/

    View Slide

  8. 7
    既存の⽐較的シンプルなサービスで試してみた
    Dockerfileのベースイメージを oven/bun:alpine に変更
    bun install
    bun run src/index.ts

    動いた!

    View Slide

  9. 8
    パフォーマンス検証
    ただの文字列を返すAPIに対して負荷テストを行った
    - RPSは倍くらい (CPU使用率は100%付近で同程度)
    - メモリ使用量はそこまで変わらず
    ※他のいくつかの検証結果においては多少ブレがある
    Bun Node.js

    View Slide

  10. 9
    テストも組み込み
    bun test で単体テストを実行
    jestで書いていた場合、describe、it、expect等の基本的な関数は、何もせ
    ず移行可能だった
    x8 ~ x20倍速いらしい (十分に検証できてないが体感速い)

    View Slide

  11. 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個)

    View Slide

  12. 11
    所感
    - 大幅なパフォーマンス向上が見込めるので検討するに値する
    - インストール速度、立ち上げ速度、テスト速度等が底上げされているので
    開発体験向上も見込める
    - 既存のNode.jsコードからほとんど変更せず動作した
    - ただし、現状うまく動かない重要なパッケージや組み込み関数も存在する
    - まずは、CPUインテンシブなシンプルなサービスから取り入れていくのは
    ありだと思う

    View Slide

  13. 12
    Thank you

    View Slide