Bun มีให้ครบ จบที่เดียว— จะรุ่งหรือร่วงในวงการ JavaScript Runtime

Worapat Yotarlai
4 min readJul 14, 2023

--

เหล่าผู้คนในวงการ tech developer ที่เคยเขียนภาษา JavaScript กันมา คงเคยเห็นเจ้าหน้าซาลาเปานี้ผ่าน ๆ หรือคุ้นตาที่ไหนสักที่ ถูกต้องแล้วครับ มันคือ Bun เป็นตัว JavaScript Runtime ที่มาแรงพอตัวในเวลานี้ครับ ที่ใคร ๆ หลายคนคิดว่ามันจะมาแทนที่ Node.js แล้วเจ้า Bun มันคืออะไร? ใช้ทำอะไรได้บ้าง? บทความนี้จะมาอธิบายเบื้องต้นให้เราได้รู้จัก Bun ให้ดียิ่งขึ้นครับ

Bun ได้ release version แรก ๆ มาตั้งแต่ปลายปี 2021 เริ่มเป็นที่รู้จักในแวดวง developer และมี community ที่เติบโตทั้งในไทยและต่างประเทศมากขึ้นในปี 2022-2023 นี้ ช่วงที่ผ่านมา Bun ยังอยู่ในช่วงพัฒนามาเรื่อย ๆ และกำลังมีข่าวดีที่จะเปิดตัวเต็มให้ใช้ version 1.0 ในวันที่ 8 กันยายน 2023 ที่จะถึงนี้ 🎉

Bun คืออะไร?

Bun เรียกตัวเองว่าเป็น “a fast all-in-one runtime and toolkit” ช่วยในการ initial project ยังเป็น package manager, test runner, bundler สำหรับโปรเจ็คที่พัฒนาด้วยภาษา JavaScript และ TypeScript และเป็นตัว runtime ข้างนอก browser เหมือนกับ Node.js และ Deno #แถมยังเครมตัวเองด้วยว่ามีความเร็วกว่าเจ้าอื่นในตลาด

Bun vs Node.js vs Deno — Bun ทำอะไรได้บ้าง?

  • ภาษาที่ใช้ในการพัฒนา: Node.js ถูกพัฒนาขึ้นมาจากภาษา C++, Deno จากภาษา Rust และ Bun จากภาษา Zig ซึ่งแต่ละตัวล้วนพัฒนามาจากภาษาที่เป็น low-level มีประสิทธิภาพในการจัดการ lack, memory เหมือนกัน
  • ความเข้ากันได้ของ web browser engine: Node.js และ Deno จะเรียกใช้ V8 engine ของ Google แต่ Bun ได้นำ JavaScriptCore ของ WebKit (เป็นตัวที่ใช้ใน Safari ของ Apple) มาต่อยอดทำเป็น runtime ซะเองเลย ซึ่งมีประสิทธิภาพมากกว่า ทำให้ Bun มีผล benchmark ดีกว่า ทำงานเร็วกว่า Node.js และ Deno อย่างน้อยประมาณ 3–4 เท่า
  • install package manager: เมื่อเรียก install package ผ่านตัว Node.js และ Deno จะมีการ build lockfile จาก package.json ขึ้นมาเป็นไฟล์ package-lock.json แต่ Bun จะสร้าง binary lockfile เป็นไฟล์ bun.lockb ขึ้นมาแทน ทำให้เวลาเรียก bun install มีเวลาการทำงานเร็วกว่าใช้ npm install ประมาณ 20 เท่า
    * lockfile คือตัวเก็บ metadata ของ module โดยอ้างอิง module จาก node_modules
  • Bun มีความ compatibility กับ npm (node package manager) จะเรียก package จาก npm ได้เลย แต่ยังไม่ครบทุกตัวจาก Node.js นะครับ (สามารถเช็ค module ที่ใช้ได้ที่ https://bun.sh/docs/runtime/nodejs-apis)
  • Bun มี build-in package ในตัวเองอยู่หลายตัว เรียกว่า Bun APIs เช่น HTTP Server, SQLite, File I/O, TCP, Web APIs (fetch, Response, Request, …), WebSocket, automatically loads .env files, test runner เป็นต้น โดยที่ไม่ต้อง require module เข้ามา code
// Bun
Bun.serve({
port: 8080,
hostname: "localhost",
fetch(req) {
return new Response('Bun');
},
});


// Node.js
var http = require('http');
http
.createServer(function (req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Node.js');
})
.listen(8080, 'localhost');

มาลองเล่น Bun

  1. ก่อนอื่นก็มาติดตั้ง Bun กันก่อน
# with install script (recommended)
curl -fsSL https://bun.sh/install | bash

# with Homebrew
brew tap oven-sh/bun
brew install bun

2. เริ่มสร้าง app ขึ้นมาใหม่

bun init
bun create

# creation with available officail templates
bun create next ./myapp
bun create react ./myapp
bun create svelte-kit ./myapp
bun create elysia ./myapp
bun create hono ./myapp
bun create kingworld ./myapp

3. ลองรันกันเลย

bun dev

นอกจากนี้ยังมีคำสั่งอื่น ๆ อีก สามาถเข้าไปเล่น cli ของ bun ได้ตามนี้ https://bun.sh/docs

bun run start                 # run the `start` script
bun install <pkg>​ # install a package
bun build ./index.tsx # bundle a project for browsers
bun test # run tests
bunx cowsay "Hello, world!" # execute a package

Bun สรุป

Bun เป็น javascript runtime ที่ compatible กับ Node.js ที่มีความเร็วมากขึ้น โดย bun มี APIs หลายตัวที่ build-in อยู่ สามารถใช้แทนที่ module หรือ library ได้เลย ทำให้ไม่ต้อง require ตัวที่จำเป็นต้องใช้บ่อยเข้ามา มีเป็น ecosystem เชื่อมต่อกับ framework ต่าง ๆ ได้ เช่น Express, Elysia, Hono, Stric, Vite, Next, React, Nuxt3, etc.
* โดยส่วนตัวมองว่า implement ง่ายกว่าตัว Node.js มาก และยังไม่แนะนำให้ไปใช้กับโปรเจ็คที่เป็น commercial สักเท่าไหร่จนกว่าจะออก version ที่เสถียรมาแล้ว

ต้องต้องติดตามต่อไปว่าหลังจาก Bun เปิดตัว version 1.0 ออกมาใหม่แล้ว จะสามารถเข้ามาครองตลาดในฝั่ง server-side JavaScript ได้มากขึ้นหรือไม่? สามารถช่วยเพิ่ม performance ในการ render และลดความซับซ้อนในการพัฒนาของ developer ได้หรือไม่?

จุดเด่น.

  • เป็น package manager ที่มี processing time ที่เร็วกว่าทุกเจ้าในตลาด ไม่ว่าจะเป็น npm, yarn, pnpm
  • สามารถรันไฟล์ .ts และ .tsx ได้โดยตรง โดยไม่ต้องทำ config ที่ไฟล์ tsconfig.json เพิ่ม ก็สามารถ transpile ตัว TypeScript เป็น JavaScript ได้เลย

จุดด้อย.

  • bun ยังไม่มีความสามารถบางคำสั่งเท่า package manager ตัวอื่น เช่น การทำ pnpm prune ลบ packages ที่ไม่จำเป็นออก หรือ pnpm dedupe ลบ dependencies ใน lockfile ถ้าในโปรเจ็คมีการใช้ packages version ใหม่กว่า version ใน lockfile
  • bun ยังเป็น version ที่ยังไม่เสถียร และมีข้อจำกัดทางระบบปฏิบัติการ ตอนนี้ support กับ Linux (x64 & arm64) and macOS (x64 & Apple Silicon) เท่านั้น ยังใช้ไม่ได้ใน Windows (x32 & x64)

สุดท้ายนี้ หากมีข้อผิดพลาดประการใดสามารถทักท้วงได้เลยครับ ผู้เขียนพร้อมแก้ไขให้ถูกต้องครับ จนกว่าจะเจอกันใหม่ครับ bun version 1.0 😊

--

--

No responses yet