Bun คืออะไร? + เร็วแรงทะลุนรก จริงมั้ย?

Bun Sep 30, 2023

ช่วงเดือนที่ผ่านมา เรียกได้มากระแส Bun ค่อนข้างดี หลังจากที่ออก Bun 1.0 เรียกได้ว่าหลายๆ อย่างเร็วกว่า Node.js มาก ถึงขนาดมีดราม่าเล็กๆ น้อยๆ เกี่ยวกับ Performance ของ Node.js

Bun 1.0 | Bun Blog
Bun is stable and ready for production.

วันนี้ขอเขียนบทความถึง Bun ซักนิดครับ

Bun คืออะไร?

Bun เป็น JavaScript/TypeScript toolkit ที่รวมๆ หลายๆ อย่างไว้ในตัวเดียว ตัว core ของ Bun คือ

  • เป็น Bun Runtime คือ JavaScript Runtime แบบเดียวกับ Node.js และ Deno
  • เป็น Command Line ที่เอาไว้รันพวก test, script และก็รองรับ node package manager อื่นๆ ได้หมดเลย
  • เป็น package manager แทนที่ NPM, Yarn หรือ PNPM ได้เลย แถมเร็วกว่ามากๆ

เราสามารถใช้ Bun แทน Node.js ได้เลย ตัวอย่างเช่น ปกติ เรารัน Node แบบนี้

node app.js

ตัว Bun เราก็รันแบบเดียวันก

bun run app.js

รวมถึงสามารถรัน TypeScript หรือ JSX/TSX ได้โดยที่ไม่ต้อง config อะไรเลย

bun run app.ts

bun run App.jsx

ทำไมต้อง Bun?

  • bunx เร็วกว่า npx 5 เท่า
  • bun อ่านไฟล์ .env ได้เลย โดยไม่ต้องใช้ dotenv หรือ cross-env ช่วย
  • ตัว bun มี built-in watch mode ให้แล้ว พวก nodemon pm2
  • bun เป็น transpiler ในตัว สามารถรัน JS/TS JSX/TSX ได้เลย
  • เป็น Bundler tool ในตัวเอง ไม่ต้องใช้ esbuild, webpack, rollup
  • มาแทนที่ package manager ได้เลย
รูปจาก blog bun เพื่อแสดงถึงเวลาที่ใช้ในการติดตั้ง remix project.

เปลี่ยนมาใช้ PNPM แทน NPM และ Yarn
PNPM เป็น Package Manager อีกตัวนึง ที่เหมือนกับ NPM และ Yarn ต่างกันที่รายละเอียดข้างในครับ เดี๋ยวมาอธิบายมาต่างอย่างไร มีข้อดีอย่างไร ซึ่งตัว PNPM หน้าเว็บเค้าเขียนนิยามตัวเองว่าเป็น Fast, disk space efficient

PNPM อีก 1 ตัวเลือกสำหรับ Package Manager


การติดตั้ง Bun

การติดตั้ง Bun สามารถทำผ่าน Command Line ได้เลย หรือจะใช้ npm, homebrew ก้ได้เช่นกัน

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

ติดตั้งผ่าน NPM

npm install -g bun

ติดตั้งผ่าน Homebrew

brew tap oven-sh/bun # for macOS and Linux
brew install bun

คำสั่ง Bun เบื้องต้น

จริงๆ แล้ว ก็ง่ายๆ เราใช้คำสั่ง npm แบบไหน ก็เปลี่ยนจาก npm เป็น bun แค่นั้นเอง

การติดตั้ง package ก็ใช้คำสั่ง:

bun install
bun install <package>

ปกติ package manager อื่นๆจะสร้าง package-lock.json, yarn.lock หรือ pnpm-lock.json แต่ตัว bun จะเป็น binary lockfile ชื่อ bun.lockb แทน

.npmrc

ปกติ npm จะใช้ .npmrc สำหรับ private registries ต่างๆ แต่ถ้าเป็น Bun จะเป็นไฟล์ bunfig.toml แทน

ตัวอย่าง Github Action Pipeline ของ Bun

name: bun-types
jobs:
  build:
    name: build-app
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repo
        uses: actions/checkout@v3
      - name: Install bun
        uses: oven-sh/setup-bun@v1
      - name: Install dependencies
        run: bun install
      - name: Build app
        run: bun run build

Bun HTTP Server

ตอนที่ลองใช้ Node.js ก็เริ่มต้นด้วยการทำ HTTP Server ทีนี้ Bun ก็อยากลองการเป็น JavaScript Runtime บ้าง ลองสร้าง HTTP Server ด้วย Bun ขึ้นมาดีกว่า โดยใช้ Bun.serve

สร้างไฟล์ app.ts ขึ้นมา

Bun.serve({
  port: 3333,
  fetch(req) {
    const url = new URL(req.url);
    if (url.pathname === "/") return new Response("Home page!");
    if (url.pathname === "/blog") return new Response("Blog!");
    return new Response("404!");
  },
});

ลองรันด้วย Bun

bun run app.ts

ถ้าเราไม่กำหนด port จะเป็น default 3000 ทดสอบลองเข้า url

  • http://localhost:3333/
  • http://localhost:3333/blog

Web Framework ของ Bun ที่น่าสนใจ

Hono - Ultrafast web framework for the Edges
Hono is a small, simple, and ultrafast web framework for the Edges. It works on Cloudflare Workers, Fastly Compute@Edge, Deno, Bun, Vercel, Netlify, Lagon, AWS Lambda, Lambda@Edge, and Node.js. Fast, but not only fast.
Elysia - Fast, and friendly Bun web framework
ElysiaJS is a fast and friendly bun web framework with end-to-end type safety and great developer experience. Elysia is familiar, fast, and first class TypeScript support with well-thought integration between service whether it’s tRPC, Swagger or WebSocket. Elysia got you cover, start building next…

แหล่งเรียนรู้เพิ่มเติม

Bun — A fast all-in-one JavaScript runtime
Bundle, install, and run JavaScript & TypeScript — all in Bun. Bun is a new JavaScript runtime with a native bundler, transpiler, task runner, and npm client built-in.
GitHub - oven-sh/awesome-bun: ⚡️ A curated list of awesome things related to Bun
⚡️ A curated list of awesome things related to Bun - GitHub - oven-sh/awesome-bun: ⚡️ A curated list of awesome things related to Bun

สรุป

ส่วนตัวผม ยังไม่ได้เอามาใช้แทน Node.js แต่เอามาใช้ในการติดตั้งพวก package ต่างๆ ถือว่าเร็วมากๆ ประหยัดเวลาไปได้เยอะเลย แต่บางครั้ง ยังเจอปัญหา bun create พวก app ต่างๆ บางอันก็ยังไม่รองรับแบบ 100% และก็ Bun API ผมยังไม่ได้ทดสอบดูเท่าไหร่ครับ

ใครยังไม่ได้ลองใช้ ก็ลองไปใช้ Bun ดูครับ แล้วอาจจะติดใจ

Tags

Chai Phonbopit

เป็น Web Dev ทำงานมา 10 ปีหน่อยๆ ด้วยภาษา JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจ Web3, Crypto และ Blockchain เขียนบล็อกที่ https://devahoy.com