Devahoy Logo
PublishedAt

Bun

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

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

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

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 แบบนี้

Terminal window
node app.js

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

Terminal window
bun run app.js

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

Terminal window
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 ได้เลย

Bun image รูปจาก blog bun เพื่อแสดงถึงเวลาที่ใช้ในการติดตั้ง remix project

การติดตั้ง Bun

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

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

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

Terminal window
npm install -g bun

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

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

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

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

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

Terminal window
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

1
name: bun-types
2
jobs:
3
build:
4
name: build-app
5
runs-on: ubuntu-latest
6
steps:
7
- name: Checkout repo
8
uses: actions/checkout@v3
9
- name: Install bun
10
uses: oven-sh/setup-bun@v1
11
- name: Install dependencies
12
run: bun install
13
- name: Build app
14
run: bun run build

Bun HTTP Server

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

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

app.ts
1
Bun.serve({
2
port: 3333,
3
fetch(req) {
4
const url = new URL(req.url)
5
if (url.pathname === '/') return new Response('Home page!')
6
if (url.pathname === '/blog') return new Response('Blog!')
7
return new Response('404!')
8
}
9
})

ลองรันด้วย Bun

Terminal window
bun run app.ts

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

Terminal window
http://localhost:3333/
http://localhost:3333/blog

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

  • ElysiaJS - Ergonomic Framework for Humans
  • Hono - Web application framework

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

สรุป

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

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

Authors
avatar

Chai Phonbopit

เป็น Web Dev ในบริษัทแห่งหนึ่ง ทำงานมา 10 ปีกว่าๆ ด้วยภาษาและเทคโนโลยี เช่น JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจในเรื่องของ Blockchain และ Crypto กำลังหัดเรียนภาษา Rust